0

我使用 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 位编写的代码,这不会产生向后兼容性问题吗?

如果问题非常基本和/或微不足道,我感到非常抱歉。几个小时以来,我一直在摸不着头脑,并不太了解加载标签的两种不同实现背后的逻辑。谢谢!!

4

1 回答 1

1

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

在 NASM 中,mov eax, var将地址var放入eax. 在 MASM 中,相同的代码将 in 的内容var放入eax.

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

mov eax, offset var

另请参阅解释差异的 NASM 文档的这一部分

于 2012-12-23T09:44:56.253 回答