如何在程序集中使用带有寄存器的指针



我正在做一个项目,我必须通过查看它的汇编代码来调试"二进制炸弹",以帮助我们了解汇编。 这句话让我感到困惑。

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

最新更新