首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nasm中的宏与equ

nasm中的宏与equ
EN

Stack Overflow用户
提问于 2020-07-03 14:16:35
回答 1查看 240关注 0票数 2

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

代码语言:javascript
复制
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
代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-03 15:09:22

第一段代码起作用是因为当您使用EQU时,这一行:

代码语言:javascript
复制
len equ msg-4

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

代码语言:javascript
复制
mov edx, var-len

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

当你使用:

代码语言:javascript
复制
%define len msg-4

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

代码语言:javascript
复制
mov edx, var-len

文本替换将其转化为:

代码语言:javascript
复制
mov edx, var-msg-4

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

代码语言:javascript
复制
mov edx, var-(msg-4)

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

代码语言:javascript
复制
%define len (msg-4)

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

代码语言:javascript
复制
mov edx, var-(msg-4)

计算时,它应该生成值13,并将其放在EDX中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62717276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档