2012-09-08 74 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的链接。