【发布时间】:2023-03-09 22:02:02
【问题描述】:
我有一个简单的.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 位中工作。
任何关于为什么这些二进制文件不同的想法都会非常有帮助。
【问题讨论】:
-
有时有多种不同的方式来编码相同的指令,在这种情况下,汇编器(应该)选择最小的编码,如果有多个最短的编码,那么选择是任意的。在某些情况下,有较短的指令与给定的(但不同的)指令执行完全相同的操作,并且汇编程序通常会替换较短的指令作为优化。没有进行“操作码压缩”。
标签: assembly 64-bit nasm x86-64