OpCode压缩,解压缩和编码差异?

时间:2017-04-05 21:14:52

标签: assembly 64-bit nasm x86-64

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

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

1 个答案:

答案 0 :(得分:3)

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

的一个实例

我想,有一个论点是,较长的编码是“你要求的”,因为它明确写入了你告诉它的64位版本的寄存器。另一方面,编码它是没用的,因为无论如何写入32位寄存器都是零扩展的,因此NASM编码没有错,它只是略微减少了字面上的代码。