【问题标题】:macro vs equ in nasmnasm中的macro vs equ
【发布时间】:2020-10-24 06:55:15
【问题描述】:

我很难理解两者之间的区别,下面的例子真的让我很困惑:

section .data
msg: db "Thank you"
var: dd 0x31323334
len equ msg-4

section .text
global main
main:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, var-len
section .data
%define len msg-4
msg: db "Thank you"
var: dd 0x31323334


section .text
global main
main:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, var-len

第一个程序打印“Thank you4321”,这很明显,但出于某种原因,第二个程序打印“Thank you” 我试过跟踪这些值,我得到了:var = 0x2011, msg = 0x2008, len = 0x2004,但不知何故edx 得到了0x05,我认为它会是0x2011-0x2004 = 0x0D 知道这是为什么吗? 我注意到 equ 的另一件事是,如果我计算 len-var 我得到 0 ,我的猜测是它在内存中没有地址,因为它是一个宏?它是否正确?提前致谢。

【问题讨论】:

  • 我已经修复了你的代码。您应该始终将代码复制并粘贴到 Stackoverflow 中。你拼写错了define,并且在定义var 时漏掉了dd
  • 对此表示感谢和抱歉。
  • 为了记录,len equ msg-4 有一个完全误导性的名称。别叫len,是msg前4个字节的地址。见How does $ work in NASM, exactly? - 通常你会len equ var - msg,或者(在msg之后,在var之前)len equ $-msg。我假设您从类似的东西开始玩,并且在将其修改为完全不同后没有更改名称。

标签: assembly x86 macros nasm


【解决方案1】:

第一个代码有效,因为当您使用EQU 时,这一行:

len equ msg-4

len 设置为从表达式msg-4 计算的值,并将结果存储在常量len 中。然后当你这样做时:

mov edx, var-len

len 的预计算值从 var 的偏移量中减去,这将是 13,这是您所期望的。

使用时:

%define len msg-4

它将len 定义为字符串 msg-4。当你像这样使用len 时:

mov edx, var-len

文本替换把它变成这样:

mov edx, var-msg-4

这将产生值 5。这不是您想要的计算。你希望它产生的是:

mov edx, var-(msg-4)

为此,将%define 语句更改为:

%define len (msg-4)

当文本替换完成后,它将产生表达式:

mov edx, var-(msg-4)

计算时它应该产生值 13 并将其放入 EDX

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2015-05-10
    • 2013-06-15
    • 2021-12-03
    • 2020-07-29
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    相关资源
    最近更新 更多