Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在汇编中使用带寄存器的指针?_Assembly_X86_Att - Fatal编程技术网

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的循环链接列表。