我使用NASM在64位linux中编写了一个代码 [第64位]
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保存“message”的地址(例如0x402044),类似于做类似的事情
lea rax, [message]
我查看了反汇编,发现代码执行如下
movabs rax, 0x402044
在32位MASM中执行mov reg,label命令只是从标签引用的数组中移动了第一个数据
mov ax, label ; same as mov ax, [label]
最后!!,我的问题是为什么32位加载数据值而64位加载地址?这不会产生向后兼容性问题,如果说我想使用在32位系统中用64位写的代码?
如果这个问题非常基本和/或微不足道,我感到非常抱歉。我一直在摸不着头几个小时,并没有完全掌握加载标签的两种不同实现背后的逻辑。谢谢!
答案 0 :(得分:1)
这不是32位和64位之间的区别。这是两个不同汇编程序之间的区别。
在NASM中,mov eax, var
将var
的地址放在eax
中。在MASM中,相同的代码将var
的内容放在eax
。
要获取MASM中var
的地址,您需要使用offset
运算符:
mov eax, offset var
另请参阅NASM文档的this section,其中解释了差异。