【问题标题】:What does an lea instruction after a ret instruction mean?ret 指令后的 lea 指令是什么意思?
【发布时间】:2015-10-30 03:55:25
【问题描述】:

我在使用 clang 和 gcc 制作的可执行文件中发现了 x86 lea 指令。 lea 指令在ret 指令之后,如下所示。

 0x???????? <func>
   ...
   pop %ebx
   pop %ebp
   ret
   lea 0x0(%esi,%eiz,1),%esi
   lea 0x0(%edi,%eiz,1),%edi

 0x???????? <next_func>
   ...

这些lea 指令是做什么用的? lea 指令中没有 jmp 指令。

我的环境是 Ubuntu 12.04 32 位和 gcc 4.6.3。

【问题讨论】:

  • 你也可以打印二进制代码吗?
  • 我建议用gcc -fverbose-asm -O -S foo.c 编译你的C 源代码foo.c,然后查看生成的汇编程序foo.s。我猜lea实际上是你代码段中的一些数据
  • 是的 - 一些 const/static 的东西。
  • 顺便说一句,你的 Ubuntu 已经很老了,你的 GCC 编译器也太老了。当前的 GCC 是 5.2。

标签: c gcc assembly x86


【解决方案1】:

它可能什么都不是——它只是让下一个函数从一个可能是至少 8 倍数(很可能是 16)的地址开始的填充。

根据其余代码,可能它实际上是一个表格。例如,switch 语句的某些实现使用了一个经常存储在代码段中的常量表(尽管严格来说,它更像是数据而不是代码)。

第一个可能性更大。顺便说一句,这样的空间通常用 0x03 填充。这是一个单字节调试中断指令,因此如果某些未定义的行为导致尝试执行该代码,它会立即停止执行并中断调试器(如果可用)。

【讨论】:

  • 非常感谢您可以理解的解释!通过重写 lea 对齐指令,它可能是各种各样的东西。
  • 这条指令只是一个很长的nop。
猜你喜欢
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多