【发布时间】: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。我假设您从类似的东西开始玩,并且在将其修改为完全不同后没有更改名称。