我有这个:
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
发布于 2021-01-29 04:13:14
64位模式下的操作码81
需要更多5个字节(modrm + imm32),但是您的.text
段在此之前结束,所以反汇编程序放弃了。如果你用更多的字节填充文本部分(比如times 10 db 0
),你会得到一些东西。
您使用bits 16
将非64位机器码放入64位目标文件中,因此,您当然应该预料到通常会出现错误。
16位模式的默认操作数大小(16)不同于32和64位模式的默认操作数大小(32),因此66
操作数大小前缀与之相反。在32位或64位模式(如add cx, 1234
)中需要66
前缀的指令要求在16位模式中不存在该前缀。(正如您上一个问题的@fuz's answer中所述)
https://stackoverflow.com/questions/65948483
复制相似问题