如何强制 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 个字节。
我正在尝试 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
orINT3
(CC) differs from one generated byINT 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 个字节。