我现在正在 gdb 上运行一些代码,但我不知道这两条指令实际上是做什么的。如果有人可以帮助我,我将不胜感激。
add -0x2c(%ebp, %ebx, 4), %eax
cmp %eax, -0x28(%ebp, %ebx, 4)
我现在正在 gdb 上运行一些代码,但我不知道这两条指令实际上是做什么的。如果有人可以帮助我,我将不胜感激。
add -0x2c(%ebp, %ebx, 4), %eax
cmp %eax, -0x28(%ebp, %ebx, 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]
OF
SF
ZF
AF
PF
CF
cmp
sub
sub
cmp
比较类型通常以条件跳转的形式创建。在 x86 汇编中有很多条件跳转,它们是否分支取决于标志的值。
那是 AT&T 汇编语法。这些寻址模式看起来有点奇怪,但在伪代码中,它们的意思是:
eax = *(ebp + ebx*4 - 0x2c)
和
compare eax to *(ebp + ebx*4 - 0x28)
这是一个完整解释的链接。