【发布时间】:2014-12-17 18:05:51
【问题描述】:
我正在学习 64 位 nasm,我通过执行以下操作来组装仅包含 64 位寄存器的 .nasm 文件
nasm -f elf64 HelloWorld.nasm -o HelloWorld.o
并链接它执行以下操作
ld HelloWorld.o -o HelloWorld
当我运行file 命令时,程序运行正确,甚至说它是64 位ELF,但是当我使用objdump 或gdb 反汇编可执行文件时,我将寄存器设置为64 位代码中的寄存器在反汇编时显示为 32 位寄存器。 (例如:源代码中的rax在反汇编时显示为eax)
这是为什么?
这不会发生在一台计算机上,它是一个新问题,以前没有这样做过。
HelloWorld.nasm:
global _start
section .text
_start:
mov rax, 1
mov rdi, 1
mov rsi, hello_world
mov rdx, length
syscall
mov rax, 60
mov rdi, 11
syscall
section .data
hello_world: db 'Hello World',0xa
length: equ $-hello_world
拆解的 HelloWorld:
...
00000000004000b0 <_start>:
4000b0: b8 01 00 00 00 mov eax,0x1
4000b5: bf 01 00 00 00 mov edi,0x1
4000ba: 48 be d8 00 60 00 00 movabs rsi,0x6000d8
4000c1: 00 00 00
4000c4: ba 0c 00 00 00 mov edx,0xc
4000c9: 0f 05 syscall
4000cb: b8 3c 00 00 00 mov eax,0x3c
4000d0: bf 0b 00 00 00 mov edi,0xb
4000d5: 0f 05 syscall
...
【问题讨论】:
-
它不是 所有 寄存器,只有那些你 mov 适合 32 位的值的寄存器,见stackoverflow.com/questions/11177137/…
标签: assembly nasm x86-64 cpu-registers