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 0x8(%ebp),%eax
6: 3b 45 0c cmp 0xc(%ebp),%eax
9: 7e 05 jle 10
b: 8b 45 08 mov 0x8(%ebp),%eax
e: eb 03 jmp 13
10: 8b 45 0c mov 0xc(%ebp),%eax
13: 5d pop %ebp
14: c3 ret
要理解上面的彙編**,可以先把c
程式寫成帶有goto
語句的版本,
intmax(int x,int y)
c**中if(x>y)
在彙編中,先判斷x
是否小於等於y,
如果小於等於,則發生跳轉,否則不跳轉。
這裡,組合語言也可以使用另外乙個規則,
int max(int x,int y)
實際上,組合語言沒有採用上面的做法,因為在c
語言中,許多條件語句只有if
語句,沒有else
語句,上面的**中在這種情況下,也會至少跳轉一次,這樣會影響程式的效率。
組合語言中的常見跳轉語句:
jmp label
直接跳轉
je label
相等jne label
不等js label
負數jns label
非負數ja abel
大於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,int y)
如果使用傳統的條件控制語句,會產生類似下面的形式:
if(x<=y)
goto x_le_y;
result=x;
goto done;
x_le_y:
result=y;
done:
return result;
而在gcc
中對上面的**反彙編,產生的彙編的**如下:
00000000:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 45 08 mov 0x8(%ebp),%eax
6: 39 45 0c cmp %eax,0xc(%ebp)
9: 0f 4d 45 0c cmovge 0xc(%ebp),%eax
d: 5d pop %ebp
e: c3 ret x
存放在0x8
處,y存放在0xc
處,彙編語句中先將返回值設為x,
如果y>=x,
再將返回值修改為y.
這種方式是先**分支,執行這個分支,如果**錯誤,再跳轉到其他分支,如果**正確指令執行的時間為tr,
**錯誤時,錯誤處罰是tp,
**分支正確的概率為p,
則這個條件語句執行的平均時間為p*tr+(1-p)*(tr+tp).
常見的條件傳送語句有:
cmove
零cmovne
非零cmovs
負數cmovns
非負cmovg
大於cmovge
大於或者等於comvl
小於omvle
小於或者等於 對於無符號數,有對應的cmova comvae comvb comvbe
四條指令
條件並不能在所有條件下替代條件控制語句,比如
int f(int *x)
這段**中,如果x
為空指標,條件傳送會先將*x
取出,這時會發生錯誤,所以,條件傳送只是條件控制語句在某些情況下的替代,它不能完全取代條件控制語句。
if語句的彙編表示
demo c語言 int max int x,int y 產生的彙編 如下 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 ...
彙編中的結構體表示
我認為,彙編中一切皆位址。在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...