我正在做一个项目,我必须通过查看它的汇编代码来调试"二进制炸弹",以帮助我们了解汇编。 这句话让我感到困惑。
cmp (%esi),%eax
je 80486d1 <main+0xaa>
当代码由于两个寄存器相等而跳跃时,我会"解决"炸弹,如果不匹配,我会失败。 但是,当我将 %eax 设置为与 %esi 相同的值时,它不会跳转并且我失败了。 以下是紧接在 cmp 语句之前的 gdb 信息寄存器输出:
eax 0x804a048 134520904
ecx 0x0 0
edx 0x0 0
ebx 0x1 1
esp 0xffffd7c0 0xffffd7c0
ebp 0xffffd9e8 0xffffd9e8
esi 0x804a048 134520904
edi 0xf7fac5a0 -134560352
eip 0x80486c8 0x80486c8 <main+161>
eflags 0x286 [ PF SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
%esi 和 %eax 值相同,但它没有按预期工作。 我唯一能想象的是(%esi(是一个指针?我不确定这是如何工作的,因为我是组装新手,可以使用一些关于这里发生的事情的提示。
是的,(%esi)
表示法意味着它是一个指针。ESI 寄存器保存有效地址。
我不确定这是如何工作的
这是一种基础知识。试图在不掌握基本汇编程序语法的情况下解决复杂的汇编程序之谜是没有意义的。
网络上有许多来源描述了用于 x86 的大量汇编语法。您向我们展示了所谓的"Intel x86的AT&T表示法",所以这里只是一个起点:https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax