如何在汇编中使用带寄存器的指针?

How to use pointers with registers in assembly?

我正在开展一个项目,我必须通过查看其汇编代码来调试 "binary bomb" 以帮助我们了解汇编。这一行让我很困惑。

cmp    (%esi),%eax
je     80486d1 <main+0xaa>

我"solve"因为两个寄存器相等导致代码跳转的时候炸弹,不相等就输了。但是,当我将 %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 寄存器保存有效地址。

I'm not exactly sure how this works

这是一种基础知识。在不掌握基本汇编程序语法的情况下尝试解决复杂的汇编程序谜题毫无意义。

网络上有许多资源描述了用于 x86 的多种汇编语法。您向我们展示了什么叫做 "AT&T notation for Intel x86",所以这里只是它的一个起点: https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax