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.
我很难理解两者之间的区别,下面的例子让我很困惑:
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.