这个问题已经在这里有一个答案:
- 什么是MOV(%R11,%r12,1),EDX%的含义是什么? 2个回答
- 如何“MOV(%EBX,EAX%,4),%eax中”的工作? [重复] 1个回答
我通过一些代码运行,现在在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)
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
)进行比较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)
这里有一个链接完整的解释 。