我有这个:
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对你上一个问题的回答所提到的)