if語句的彙編表示

2021-06-21 07:01:40 字數 2382 閱讀 7733

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...