我正在学习64位nasm,我组装的。nasm文件,其中仅包含64位寄存器,通过执行以下操作
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
...
1条答案
按热度按时间cedebl8k1#
为什么
被分解为
因为文字
0x1
适合32位,the upper 32 bits of a 64 bit register are set to0
when loading the lower 32 bits通过相应的E
寄存器。因此,汇编程序可以将mov
优化为32位操作。请注意,加载到
rsi
中的地址可能不适合32位,因此rsi
保持原样。如果加上下面的说明,效果就可以非常清楚地看到:
被分解为
您可以使用
-O0
禁用nasm优化,在这种情况下,指令将保持其长格式:结果: