OpCode压缩、解压和编码的区别?

OpCode compression, decompression and encoding differences?

我有一个简单的 .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 位上工作。

关于为什么这些二进制文件不同的任何想法都将非常有帮助。

b8 2a 00 00 00mov r32, imm32,
的实例 48 c7 c0 2a 00 00 00mov r/m64, imm32

的实例

我想,有人认为较长的编码是 "what you asked for",因为它明确地写入了 64 位版本的寄存器,就像你告诉它的那样。另一方面,以这种方式编码是没有用的,因为写入 32 位寄存器无论如何都是零扩展的,所以 NASM 编码没有错,它只是让你的代码稍微少一点字面意思。