2012-09-08 48 views
2

我現在正在gdb上運行一些代碼,我不知道這兩條指令實際上做了什麼。如果有人能幫助我,我會很感激。x86指令含義

add -0x2c(%ebp, %ebx, 4), %eax 
cmp %eax, -0x28(%ebp, %ebx, 4) 
+4

首先,我會關閉惡劣的AT&T語法:'set disassembly-flavour intel' – nneonneo

+0

有關更多信息,請參閱[AT&T語法標記wiki](https://stackoverflow.com/tags/att/info)有關語法的詳細信息以及指向更多文檔的鏈接。 –

回答

5

x86彙編通常在使用Intel語法而不是AT & T語法編寫時更容易理解。

在Intel語法這將是:

add eax,[ebp+4*ebx-0x2C] 
cmp [ebp+4*ebx-0x28],eax 

第一指令(add)將存儲在存儲器地址[ebp+4*ebx-0x2C]到的eax值字的值,並存儲在eax的總和。

的第二指令(cmp)通過從存儲在存儲器地址[ebp+4*ebx-0x28]字的值中減去的eax值相比較eax[ebp+4*ebx-0x28],並設置標誌(OFSFZFAFPFCF)相應地但不會在任何地方保存結果。 cmpsub完全一樣,唯一的區別是sub結果被保存,cmp沒有。

比較的類型通常以條件跳轉的形式創建。在x86彙編中有很多條件跳轉,並且它們是否分支取決於標誌的值。

+0

不好意思。<我剛剛在過去一週內開始做這些東西,所以我不知道如何在語法和其他之間進行切換。不過這確實有幫助。我該如何檢查標誌的價值? – Requiem

+0

[Intel和AT&T語法](http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm)如果符合條件,'cmp'跳轉到代碼中的其他位置之後進行條件跳轉。如果不是,則繼續執行下一條指令(不跳轉)。還有其他可能的方式(一個標記爲鍵的哈希表),但條件跳轉解決所有情況。請注意,在Intel和AT&T語法中,操作數的順序是相反的,在Intel中它的'dest,src',而在AT&T中它是'src,dest'。這也會影響'cmp'。請參閱[Intel x86 jump quick ref。](http://www.unixwiz.net/techtips/x86-jumps.html)。 – nrz

1

那就是AT & T彙編語法。這些尋址模式都有點怪異,但在僞代碼,他們的意思是:

eax = *(ebp + ebx*4 - 0x2c) 

compare eax to *(ebp + ebx*4 - 0x28) 

下面是與complete explanation的鏈接。