我试图找出这部分汇编代码的作用。它是从.o文件反编译的,我没有源代码。
我相信这段代码应该无限循环,因为%eax每次迭代减少4次,它永远不应该等于中断案例%eax == 0x18
00000000 <_funct>"
0: push %ebp /set up stack for function
1: mov %esp,%ebp /
3: mov $0x0,%eax / assign 0 to %eax
8: subb $0x4, 0x0(%eax) / subtract 4 from %eax which is stored into %eax
f: inc $eax / add 1 to %eax which is stored into %eax
10: cmp $0x18,%eax / if %eax is not equal to 0x18
13: jne 8 <_funct+0x8> / go to subb command
15: leave / return from function
16: ret /
这段代码怎么不进入无限循环?
答案 0 :(得分:2)
subb $0x4, 0x0(%eax)
有一个内存引用,它从eax
指向的内存位置中减去。 eax
寄存器本身不受此指令的影响。
因此,此循环从24(=0x18
)个连续内存位置减去4。
PS:这似乎是从objdump
输出的。您可能希望使用-dr
标志运行它以查看重定位条目。我怀疑0x0
会有一些偏移,否则会由于空指针而爆炸。