x86和x64中标签地址加载的区别

时间:2012-12-23 08:57:20

标签: assembly x86 64-bit nasm masm

我使用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位写的代码?

如果这个问题非常基本和/或微不足道,我感到非常抱歉。我一直在摸不着头几个小时,并没有完全掌握加载标签的两种不同实现背后的逻辑。谢谢!

1 个答案:

答案 0 :(得分:1)

这不是32位和64位之间的区别。这是两个不同汇编程序之间的区别。

在NASM中,mov eax, varvar的地址放在eax中。在MASM中,相同的代码将var的内容放在eax

要获取MASM中var的地址,您需要使用offset运算符:

mov eax, offset var

另请参阅NASM文档的this section,其中解释了差异。