nasm 中的宏 vs equ

macro vs equ in nasm

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

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” 我已经尝试跟踪这些值,我得到了:var = 0x2011, msg = 0x2008, len = 0x2004,但不知何故 edx 得到了 0x05,我认为它是 0x2011-0x2004 = 0x0D 知道这是为什么吗? 我注意到 equ 的另一件事是,如果我计算 len-var 我得到 0 ,我的猜测是它在内存中没有地址,因为它是一个宏?这个对吗?提前致谢。

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

len equ msg-4

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

mov edx, var-len

var 的偏移量中减去 len 的预计算值,这将是您期望的 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.