我从事C语言的工作有一段时间了,最近才开始接触ASM。当我编译一个程序时:
int main(void)
{
int a = 0;
a += 1;
return 0;
}
objdump反汇编有代码,但ret之后没有代码:
...
08048394 <main>:
8048394: 55 push %ebp
8048395: 89 e5 mov %esp,%ebp
8048397: 83 ec 10 sub $0x10,%esp
804839a: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp)
80483a1: 83 45 fc 01 addl $0x1,-0x4(%ebp)
80483a5: b8 00 00 00 00 mov $0x0,%eax
80483aa: c9 leave
80483ab: c3 ret
80483ac: 90 nop
80483ad: 90 nop
80483ae: 90 nop
80483af: 90 nop
...
从我学到的东西中,nops什么也不做,因为在此之后ret甚至不会被执行。
我的问题是:为什么要麻烦呢?ELF(linux-x86)不能与任何大小的主节(+ .text )一起工作吗?
我很感谢任何人的帮助,只是想学点东西。
发布于 2011-10-27 14:44:53
据我所知,指令在cpu中是流水线的,不同的cpu块(加载器、解码器等)处理后续的指令。当执行RET
指令时,很少有后续指令已经加载到cpu流水线中。这只是一个猜测,但你可以从这里开始挖掘,如果你发现了(可能是安全的NOP
的具体数量,请分享你的发现。
https://stackoverflow.com/questions/7912464
复制相似问题