我需要理解汇编代码中的add指令:
=> 0x08048bff <+43>: add 0x14(%esp,%ebx,4),%eax
(gdb) i r
eax 0x1 1
ecx 0x0 0
edx 0x0 0
ebx 0x1 1
esp 0xffffcd70 0xffffcd70
ebp 0xffffcdc8 0xffffcdc8
esi 0x0 0
edi 0x0 0
eip 0x8048bff 0x8048bff <phase_2+43>
eflags 0x202 [ IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
我认为0x14(%esp,%ebx,4)
的答案是(%ebx*4)+%esp+0x14
,但我得到的是0xffffcd82
而且我不知道寄存器中的地址是什么。有人可以解释我应该放在%eax
中的价值吗?
答案 0 :(得分:0)
是的,0x14(%esp,%ebx,4)
是(%ebx*4)+%esp+0x14
的语法,你是对的。因此,地址为0xffffcd88
。您可以让gdb使用p/x $ebx*4+$esp+0x14
为您计算。 add
指令将在该地址的内存中获取4字节整数,并将其添加到%eax
中已有的内容中。您可以使用例如x/d 0xffffcd88
来检查gdb中的内存内容。
PS:您可以切换gdb以使用英特尔语法,使用set disassembly-flavor intel
更容易阅读。