我有一个简单的.asm
文件:
BITS 64
SECTION .text
global main
main:
mov rax, 0x2a ; 42
mov
语句实际上是使用以下命令行编译为机器代码:
nasm.exe -o load_rax.bin -f bin load_rax.asm
...结果二进制输出为:
0xb8 0x2a 0x00 0x00 0x00
当我通过this Online x86 / x64 Assembler and Disassembler编译相同的mov
指令时,我得到了完全不同的东西:
0x48 0xc7 0xc0 0x2a 0x00 0x00 0x00
我是否在通过NASM进行编译时遇到了问题?我知道可能会出现操作码压缩,如果是这种情况,那么我宁愿能够处理,但我需要知道指令是否已被压缩,如何判断以及使用了什么算法
我只在64位工作。
关于为什么这些二进制文件不同的任何想法都会非常有用。
答案 0 :(得分:3)
b8 2a 00 00 00
是mov r32, imm32
的实例,
48 c7 c0 2a 00 00 00
是mov r/m64, imm32
我想,有一个论点是,较长的编码是“你要求的”,因为它明确写入了你告诉它的64位版本的寄存器。另一方面,编码它是没用的,因为无论如何写入32位寄存器都是零扩展的,因此NASM编码没有错,它只是略微减少了字面上的代码。