为什么 NASM 16 位模式下的"add cx, 1234"会<unknown>使用 objdump 生成?



我有这个:

bits 16
global start
section .text
start:
add cx, 1234

使用这个Makefile:

test:
@nasm -f macho64 test.asm
@objdump -x86-asm-syntax=intel --full-leading-addr -d test.o
.PHONY: test

它打印:

% make
test.o: file format Mach-O 64-bit x86-64

Disassembly of section __TEXT,__text:
0000000000000000 start:
0: 81 c1                          <unknown>
2: d2 04                          <unknown>

为什么它产生了<unknown>而没有在这里显示指令?我做错什么了吗?我还在学习机器代码的基本知识,很抱歉,如果这是显而易见的。

在32位模式下似乎工作得很好:

bits 32
global start
section .text
start:
add cx, 1234

输出:

% make
test.o: file format Mach-O 64-bit x86-64

Disassembly of section __TEXT,__text:
0000000000000000 start:
0: 66 81 c1 d2 04                 add cx, 1234

操作码81在64位模式下需要5个字节(modrm + imm32),但您的.text段在此之前结束,因此反汇编器放弃。如果用更多的字节填充文本部分(如times 10 db 0),您将得到一些东西。

您使用bits 16将非64位机器码放入64位目标文件中,因此当然您应该预料到通常会出错。

16位模式的默认操作数大小(16)与32位和64位模式的默认操作数大小(32)不同,因此66操作数大小前缀使事情相反。在32位或64位模式下需要66前缀的指令(如add cx, 1234),要求在16位模式下不存在它。(正如@fuz对你上一个问题的回答所提到的)

相关内容

  • 没有找到相关文章

最新更新