Debugging 0x cc vs 0x cd 03(int 3)

Debugging 0x cc vs 0x cd 03(int 3),debugging,x86,Debugging,X86,调试器在断点处生成int3指令,以便控件转到调试异常处理程序。对于int3,调试器将插入0x cc。为什么他们不插入0x cd 03,这也意味着int3?如果插入0x cd 03而不是0x cc,会发生什么情况?英特尔针对该指令的文档为您解答了问题:第2卷手册条目中的“说明”部分说明: INT3指令使用单字节操作码(CC),用于调用带有断点异常(#BP)的调试异常处理程序。(这种单字节形式很有用,因为它可以替换需要断点的任何指令的第一个字节,包括其他单字节指令,,而不覆盖其他指令) 有一些1字节

调试器在断点处生成int3指令,以便控件转到调试异常处理程序。对于int3,调试器将插入0x cc。为什么他们不插入0x cd 03,这也意味着int3?如果插入0x cd 03而不是0x cc,会发生什么情况?

英特尔针对该指令的文档为您解答了问题:第2卷手册条目中的“说明”部分说明:

INT3指令使用单字节操作码(CC),用于调用带有断点异常(#BP)的调试异常处理程序。(这种单字节形式很有用,因为它可以替换需要断点的任何指令的第一个字节,包括其他单字节指令,,而不覆盖其他指令

有一些1字节x86指令,如
push-reg
。或在16/32位模式下
inc/dec reg
如果1字节指令是分支目标之前的最后一条指令,则用较长的指令覆盖它会损坏指令的第一个字节,该指令可以在不到达断点的情况下运行


对于vm86模式
int3
的双字节
cd 03
编码与1字节
int3
编码之间存在其他差异,同样在手册中有详细说明。(可能是为了更容易编写从vm86环境外部调试vm86来宾的调试器。)

INTO
INT3
INT1
指令生成的中断与
INT n
指令生成的中断有以下不同:

  • 在virtual-8086模式下不会进行正常的IOPL检查。使用任何IOPL值进行中断(无故障)
  • 虚拟8086模式扩展(VME)启用的中断重定向不会发生。中断始终由受保护模式处理程序处理
(这些功能不适用于
CD03
,即INT 3的“普通”2字节操作码。英特尔和微软汇编程序不会从任何助记符生成
CD03
操作码,但可以通过直接数字代码定义或自修改代码来创建此操作码。)

顺便说一句,在NASM/YASM中,1字节编码确实需要使用
int3
助记符<代码>int 3是否装配到CD 03

气体组件
int$3
int3
相同,连接到
0xcc


当然,调试器使用的是二进制机器代码,而不是asm源代码。程序集助记符只适用于在asm源中手动包含断点。(是的,这是您可以做的事情。大多数调试器会让您跳过该指令继续。)

英特尔针对该指令的文档为您解答了问题:第2卷手册条目中的“说明”部分说明:

INT3指令使用单字节操作码(CC),用于调用带有断点异常(#BP)的调试异常处理程序。(这种单字节形式很有用,因为它可以替换需要断点的任何指令的第一个字节,包括其他单字节指令,,而不覆盖其他指令

有一些1字节x86指令,如
push-reg
。或在16/32位模式下
inc/dec reg
如果1字节指令是分支目标之前的最后一条指令,则用较长的指令覆盖它会损坏指令的第一个字节,该指令可以在不到达断点的情况下运行


对于vm86模式
int3
的双字节
cd 03
编码与1字节
int3
编码之间存在其他差异,同样在手册中有详细说明。(可能是为了更容易编写从vm86环境外部调试vm86来宾的调试器。)

INTO
INT3
INT1
指令生成的中断与
INT n
指令生成的中断有以下不同:

  • 在virtual-8086模式下不会进行正常的IOPL检查。使用任何IOPL值进行中断(无故障)
  • 虚拟8086模式扩展(VME)启用的中断重定向不会发生。中断始终由受保护模式处理程序处理
(这些功能不适用于
CD03
,即INT 3的“普通”2字节操作码。英特尔和微软汇编程序不会从任何助记符生成
CD03
操作码,但可以通过直接数字代码定义或自修改代码来创建此操作码。)

顺便说一句,在NASM/YASM中,1字节编码确实需要使用
int3
助记符<代码>int 3是否装配到CD 03

气体组件
int$3
int3
相同,连接到
0xcc


当然,调试器使用的是二进制机器代码,而不是asm源代码。程序集助记符只适用于在asm源中手动包含断点。(是的,这是你可以做的事情。大多数调试器会让你跳过该指令继续。)

好吧,英特尔的软件开发人员手册(请浏览)中记录了两者之间的差异,但一个非常明显的区别是,1字节断点可以放在任何地方;2字节断点更难放置,尤其是在1字节指令上。如果用2字节断点挤压A,则会损坏下一条指令。1) 如果该指令是分支/跳转/调用的目标,则可以完全中断代码或将其完全转换为不同的(序列)指令。2) 如果下一条指令上也应该有断点,那是不可能的。3) 正如您所指出的,可能没有空间放置它。1字节指令可保证安装在任何位置