2012-09-30 15 views
1

我想了解cmp和je/jg如何在程序集中工作。我在谷歌上看到了一些例子,但我仍然有點困惑。下面我展示了一部分彙編代碼,我試圖將其轉換爲C語言和相應的C代碼。它是以正確的方式實施還是對cmp的工作原理有錯誤的理解?cmp je/jg如何在程序集中工作

cmp $0x3,%eax 
je  A 
cmp $0x3,%eax 
jg  B 
cmp $0x1,%eax 
je  C 


int func(int x){ 


    if(x == 3) 
    goto A; 

    if (x >3) 
    goto B; 


    if(x == 1) 
    goto C; 

    A: 
    ...... 

    B: 
    ...... 

    C: 
    ...... 

回答

3

您可以正確理解cmp和je/jg的工作方式,但是您的C代碼中有錯誤。這條線:

if (*x == 1) 

應該

if (x == 1) 

Here是x86的控制流指令一個不錯的總結。

此外,沒有理由爲相同的值重複cmp指令。執行完成後,您可以多種方式測試結果而無需重複比較。所以,你的彙編代碼應該是這樣的:

cmp $0x3,%eax 
je  A 
jg  B 
cmp $0x1,%eax 
je  C 
+0

對'*'的感謝,忘記了:) – FranXh

3

是的,這是正確的,但在C代碼,你必須在第三個例子*xx在其他國家,這是沒有意義的。在你的彙編代碼中沒有相應的代碼。

在C中,變量類型(有符號/無符號)是在聲明變量時定義的,例如。

對於有符號的變量::

jg ; jump if greater 
jl ; jump if less 
jge ; jump if greater or equal, "jnl" is synonymous 
jle ; jump if less or equal, "jng" is synonymous 

對於無符號變量int xunsigned int x,但在組件符號和無符號的變量之間的區別(它們是在存儲器或寄存器中),用於比較由不同的條件跳轉製成:

ja ; jump if above 
jb ; jump if below 
jae ; jump if above or equal, "jnb" is synonymous 
jbe ; jump if below or equal, "jna" is synonymous 

Intel x86 JUMP quick reference列出x86裝配所有可用的條件跳轉,他們的條件(標誌值)和他們的SH一起操作碼ort和長跳躍。

2

正如您可能已經知道的那樣,處理器會跟蹤上次操作期間發生的所謂標誌寄存器中的內容。 例如,如果操作發生溢出或結果爲零等,則會有一個標誌.cmp助記符告訴處理器減去兩個寄存器/寄存器和存儲器內容,並更改正確的標誌。之後,您可以跳轉使用已完成的跳轉。處理器檢查標誌以查看它是否等於-je(檢查零標誌),或者它是否更小/更大(溢出標誌爲無符號和溢出,符號標誌爲有符號數)。

+0

進位標誌用於表示無符號溢出。溢出標誌用於表示簽名溢出。爲了比較,檢查標誌的組合:CF和ZF用於帶符號的無符號,SF,OF和ZF。如果你不確定,你可以在手冊中快速檢查一遍。 –