**:
demo:
c語言:
int max(int x,inty)
產生的彙編**如下:
00000000:0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 45
08 mov 0x8(%ebp),%eax
6: 3b 45 0c cmp 0xc(%ebp),%eax
9: 7e 05 jle 10
0x10>b: 8b
4508 mov 0x8(%ebp),%eax
e: eb
03 jmp 13
0x13>
10: 8b 45 0c mov 0xc(%ebp),%eax
13: 5d pop %ebp
14: c3 ret
要理解上面的彙編**,可以先把c程式寫成帶有goto語句的版本,
int max(int x,inty)
c**中if(x>y)在彙編中,先判斷x是否小於等於y,如果小於等於,則發生跳轉,否則不跳轉。
這裡,組合語言也可以使用另外乙個規則,
int max(int x,inty)
實際上,組合語言沒有採用上面的做法,因為在c語言中,許多條件語句只有if語句,沒有else語句,上面的**中在這種情況下,也會至少跳轉一次,這樣會影響程式的效率。
組合語言中的常見跳轉語句:
jmp label直接跳轉je label相等
jne label不等
js label負數
jns label非負數
ja label大於
jae label大於等於
jb label小於
jbe label小於等於
jg label大於
jge label大於等於
jl label小於
jle label小於等於
jg jge jle jl用於比較有符號數,而ja jae jb jbe用於比較無符號數
有時,編譯器為了加快條件語句的轉移速度,會使用條件傳送指令,改寫max函式,如下:
int max(int x,inty)
其他例子:
.text.global
_start
_start:
mov r1,#
1mov r2,#
2cmp r1, r2
bgt branch1
add r3,r1,r2
b end
branch1:
sub r3,r1,r2
end:
nopc 語言:
if(a>b)
a = a-b
else
a = a +b
if語句的彙編表示
gcc產生的 可以使用objdump 檢視它對應的彙編 gcc檢視彙編 本文主要介紹條件語句if 語句的彙編表示 有以下 int max int x,int y 產生的彙編 如下 00000000 0 55 push ebp 1 89 e5 mov esp,ebp 3 8b 45 08 mov 0x...
彙編中的結構體表示
我認為,彙編中一切皆位址。在c c 使用很多的結構體,在彙編中是如何表示的呢?其實,在彙編中根本就沒有什麼結構體的概念,結構體本質就是一堆連在一起的資料。只不過有人把他們想象成乙個整體,並以此產生結構體的概念,這與結構體中帶有變長陣列時候的情形一樣 其實上面這個結構體尾部帶有的變長陣列,data 0...
if 語句在彙編的作用
int x 100 004113ae mov dword ptr x 64h if x 200 004113b5 cmp dword ptr x 0c8h 004113bc jne wmain 47h 4113d7h else 004113d5 jmp wmain 5eh 4113eeh print...