我使用 NASM [bits 64] 在 64 位 linux 中编写了代码
section .text
global main
main: ; ELF entry point
mov rax, 1
mov rdi, 1
mov rsi, message ; buffer
mov rdx, [messageLen] ; length of buffer
syscall
mov rax, 60 ; sys_exit
mov rdi, 0 ; 0
syscall
ret
section .data
data1: db 35,36,37
messageLen: dq message.end-message
message: db 'Hello 999 World!!!', 10
.end:
现在,在
mov rax, message
rax 保存“消息”的地址(例如 0x402044),类似于说做这样的事情
lea rax, [message]
我查看了反汇编,发现代码执行如下
movabs rax, 0x402044
在 32 位 MASM 中执行 mov reg, label 命令只是从标签所指的数组中移动了第一个数据
mov ax, label ; same as mov ax, [label]
所以最后!!,我的问题是为什么 32 位加载数据值而 64 位加载地址?如果说我想在 32 位系统中使用 64 位编写的代码,这不会产生向后兼容性问题吗?
如果问题非常基本和/或微不足道,我感到非常抱歉。几个小时以来,我一直在摸不着头脑,并不太了解加载标签的两种不同实现背后的逻辑。谢谢!!