如何强制 NASM 将 int3 编码为 0xCC

How to force NASM to encode int3 as 0xCC

我正在尝试 assemble 以下代码 NASM

 section .text
 global _start


_start:

mov eax, 1
int 3

Objdump -D 产量:

test:     file format elf64-x86-64


Disassembly of section .text:

0000000000400080 <_start>:
 400080:    b8 01 00 00 00          mov    [=12=]x1,%eax
 400085:    cd 03                   int    [=12=]x3

有趣的是,当 assembled 使用 GAS 时,int 3 被编码为 0xCC 而不是 cd 03,这是为什么呢?

使用 int3 特殊 one-byte 编码的助记符。

nasm -l /dev/stdout /tmp/foo.asm
 1 00000000 CD03                    int 3
 2 00000002 CC                      int3

来自Intel's insn set manual entry for int

An interrupt generated by INTO or INT3 (CC) differs from one generated by INT n in the following ways:

  • The normal IOPL checks do not occur in virtual-8086 mode. The interrupt is taken (without fault) with any IOPL value.

  • The interrupt redirection enabled by the virtual-8086 mode extensions (VME) does not occur. The interrupt is always handled by a protected-mode handler.

These features do not pertain to CD03, the “normal” 2-byte opcode for INT 3

它还说:

Intel and Microsoft assemblers will not generate the CD03 opcode from any mnemonic

因为 2 字节编码没有任何正常/常见的 use-cases。 NASM 保持简单,并始终使用 CD 操作码作为 int 助记符。

当 NASM 确实将 mov rax, 1 优化为 mov eax,1 时,它是使用相同助记符的不同操作码。 IDK 如果实施起来不方便,或者 NASM 只是决定不这样做。将 int3 视为特殊指令是有道理的,与 int n 不同,因为它只有 1 个字节。