2

我现在正在 gdb 上运行一些代码,但我不知道这两条指令实际上是做什么的。如果有人可以帮助我,我将不胜感激。

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

2 回答 2

4

当您使用 Intel 语法而不是 AT&T 语法编写 x86 程序集时,它通常更容易理解。

在英特尔语法中,它将是:

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

第一条指令 ( add) 将存储在内存地址中的 word[ebp+4*ebx-0x2C]的值与 的值eax相加,并将总和存储在 中eax

第二条指令 ( cmp)通过从存储在内存地址 中的字的值中减去 的值来进行比较eax,并相应地设置标志 ( , , , , , ),但不会将结果保存在任何地方。与 完全相同,唯一的区别是结果中被保存,而不是。[ebp+4*ebx-0x28]eax[ebp+4*ebx-0x28]OFSFZFAFPFCFcmpsubsubcmp

比较类型通常以条件跳转的形式创建。在 x86 汇编中有很多条件跳转,它们是否分支取决于标志的值。

于 2012-09-08T02:03:49.317 回答
1

那是 AT&T 汇编语法。这些寻址模式看起来有点奇怪,但在伪代码中,它们的意思是:

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

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

这是一个完整解释的链接。

于 2012-09-08T02:03:29.933 回答