【发布时间】:2016-10-19 09:40:33
【问题描述】:
在调试某些软件时,我注意到在许多情况下,子程序之间插入了 INT3 指令。
我认为从技术上讲,这些不是插入“介于”函数之间,而是在它们之后插入,以便在子例程由于任何原因最后没有执行 retn 时暂停执行。
我的假设是否正确?如果不是,这些说明的目的是什么?
【问题讨论】:
-
这肯定是函数之间的空白。一个非常基本的 x86 优化是让函数从 16 的倍数的地址开始。如果你必须想出 some 字节值来填补空白,那么 0xcc 是迄今为止最好的选择.捕捉程序跳入遗忘的极端情况。
-
有时令我惊讶的是,数十亿个微型晶体管如何能够如此可靠地工作,以至于可以安全地编写循环条件,例如
dec / jnz(do{}while(--i)) 而不是dec / jg(do{}while(--i > 0))。我想如果在计数器中稍微翻转一下,编写可能仍然有效的代码会“更安全”,但显然没有必要。 (当然,乱序执行 CPU 内的翻转位不太可能在架构状态下简单地翻转位;更有可能你会得到更奇怪的东西。)
标签: assembly compiler-construction x86