首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么GCC的pad可以和NOPs一起工作?

为什么GCC的pad可以和NOPs一起工作?
EN

Stack Overflow用户
提问于 2011-10-27 14:39:44
回答 1查看 9.4K关注 0票数 85

我从事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 )一起工作吗?

我很感谢任何人的帮助,只是想学点东西。

EN

回答 1

Stack Overflow用户

发布于 2011-10-27 14:44:53

据我所知,指令在cpu中是流水线的,不同的cpu块(加载器、解码器等)处理后续的指令。当执行RET指令时,很少有后续指令已经加载到cpu流水线中。这只是一个猜测,但你可以从这里开始挖掘,如果你发现了(可能是安全的NOP的具体数量,请分享你的发现。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7912464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档