关于0xCC
和0xCD
特别是,这些是从遗物英特尔8088 / 8086在1980处理器指令集回来。0xCC
是软件中断操作码 的特例。特殊的单字节版本允许程序生成中断3。INT
0xCD
0xCC
尽管从原则上讲,软件中断号是任意的,INT 3
但传统上它是用于调试器的break或breakpoint函数,这一约定一直存在至今。每当启动调试器时,它都会安装一个中断处理程序,INT 3
以便在执行该操作码时将触发调试器。通常,它将暂停当前正在运行的程序并显示交互式提示。
通常,x86 INT
操作码为两个字节:0xCD
后跟0-255之间的所需中断号。现在,尽管您可以提出0xCD 0x03
要求INT 3
,但英特尔还是决定添加一个特殊版本- 0xCC
不增加任何字节-因为操作码必须仅为一个字节,才能用作未使用内存的可靠“填充字节”。
这里的重点是,如果处理器错误地跳入不包含任何预期指令的内存,则可以进行正常恢复。多字节指令不适合此目的,因为错误的跳转可能落在任何可能的字节偏移处,在这种情况下,它必须继续以正确形成的指令流继续。
显然,一字节操作码对此很简单,但是也可能有一些古怪的例外:例如,考虑到填充序列0xCDCDCDCD
(也在本页上提到),我们可以看到它是相当可靠的,因为无论指令指针位于何处(除了可能的最后一个填充字节之外),CPU可以继续执行有效的两个字节的 x86指令CD CD
,在这种情况下,会产生软件中断205(0xCD)。
尽管如此,Weirder仍然CD CC CD CC
是100%可以解释的-给出一个INT 3
或一个INT 204
序列CC CD CC CD
的可靠性较低,如图所示仅为75%,但作为整数大小的存储填充物重复使用时通常为99.99%。
宏汇编程序参考,1987年