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 00
是 mov r32, imm32
,
的实例
48 c7 c0 2a 00 00 00
是 mov r/m64, imm32
的实例
我想,有人认为较长的编码是 "what you asked for",因为它明确地写入了 64 位版本的寄存器,就像你告诉它的那样。另一方面,以这种方式编码是没有用的,因为写入 32 位寄存器无论如何都是零扩展的,所以 NASM 编码没有错,它只是让你的代码稍微少一点字面意思。
我有一个简单的 .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 00
是 mov r32, imm32
,
的实例
48 c7 c0 2a 00 00 00
是 mov r/m64, imm32
我想,有人认为较长的编码是 "what you asked for",因为它明确地写入了 64 位版本的寄存器,就像你告诉它的那样。另一方面,以这种方式编码是没有用的,因为写入 32 位寄存器无论如何都是零扩展的,所以 NASM 编码没有错,它只是让你的代码稍微少一点字面意思。