【发布时间】:2012-12-23 08:57:20
【问题描述】:
我使用 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 持有“消息”的地址(例如 0x402044),类似于说做这样的事情
lea rax, [message]
我查看了反汇编,发现代码执行如下
movabs rax, 0x402044
在 32 位 MASM 中执行 mov reg, label 命令只是从标签引用的数组中移动了第一个数据
mov ax, label ; same as mov ax, [label]
最后!!,我的问题是 为什么 32 位加载数据值而 64 位加载地址?如果说我想使用在 32 位系统中用 64 位编写的代码?
如果问题非常基本和/或微不足道,我感到非常抱歉。几个小时以来,我一直在摸不着头脑,并不太了解加载标签的两种不同实现背后的逻辑。谢谢!!
【问题讨论】:
标签: assembly x86 64-bit nasm masm