【问题标题】:Difference between label address loading in x86 and x64x86和x64中标签地址加载的区别
【发布时间】: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


    【解决方案1】:

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

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

    要在MASM中获取var的地址,需要使用offset操作符:

    mov eax, offset var
    

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

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多