Assembly 如何在汇编中使用带寄存器的指针?
我正在从事一个项目,我必须通过查看其汇编代码来调试“二进制炸弹”,以帮助我们了解汇编。这一行让我困惑Assembly 如何在汇编中使用带寄存器的指针?,assembly,x86,att,Assembly,X86,Att,我正在从事一个项目,我必须通过查看其汇编代码来调试“二进制炸弹”,以帮助我们了解汇编。这一行让我困惑 cmp (%esi),%eax je 80486d1 <main+0xaa> cmp(%esi),%eax je 80486d1 当代码由于两个寄存器相等而跳转时,我“解决”了这个问题,如果不相等,我就输了。但是,当我将%eax设置为与%esi相同的值时,它不会跳转,我失败了。以下是紧靠cmp语句之前的gdb info寄存器输出: eax 0x
cmp (%esi),%eax
je 80486d1 <main+0xaa>
cmp(%esi),%eax
je 80486d1
当代码由于两个寄存器相等而跳转时,我“解决”了这个问题,如果不相等,我就输了。但是,当我将%eax设置为与%esi相同的值时,它不会跳转,我失败了。以下是紧靠cmp语句之前的gdb info寄存器输出:
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
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
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使用的大量程序集语法。您向我们展示了所谓的“英特尔x86的AT&T表示法”,因此这里仅是一个起点:
如果(%esi)
处的数据是指向自身的指针,则%esi==%eax
将使(%esi)==%eax
为真。i、 e.void*foo=&foo代码>,或长度为1的循环链接列表。