首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在表达式中减去NASM宏的意外结果

在表达式中减去NASM宏的意外结果
EN

Stack Overflow用户
提问于 2016-07-01 17:25:01
回答 2查看 130关注 0票数 3

我编写了以下代码:

代码语言:javascript
复制
 section .text
    %define len msg-4
    global _start 
    msg: db "Thank you"
    var: dd 0x31323334

_start:
    mov ecx, msg
    debug:
    mov edx, var-len ; **** the problem is here
    mov ebx, 1
    mov eax, 4
    int 80h
    mov eax, 1 
    mov ebx, 1
    int 80h ; exit         

我期望edx保存值13,因为var-len= var-msg+4= 13 ( var地址与msg的距离为9,因为msg为9字节)。因此,我想这段代码会打印“谢谢”。

但是,edx得到了5,“谢谢”被打印出来了。

为什么edx得到5而不是13

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-01 18:27:01

%define len msg-4是一个文本替代,见下文。

通常的方法是用$ - start计算对象后面的长度。简单地给结束贴上标签也会奏效。

代码语言:javascript
复制
section .rodata           ; groups read-only together inside the .text section
    msg: db "Thank you"
    var: db 0x34, 0x33, 0x32, 0x31   ; dd 0x31323334  ; Since you're passing these bytes to write(2), writing them separately is probably less confusing.  (x86 is little-endian, so they will come out "backwards")

    ;; apparently you want to include var as part of the message, for some reason
    msglen equ $ - msg    ; $ is the current position

    ;; msgend:            ; alternative: label the end.  There doesn't have to be a db or anything; it's fine to have multiple labels for the same address


section .text
    global _start 
_start:
    mov    edx, msglen        ; message length
    ;; mov edx, msgend - msg  ; alternative

为什么你有5

%define 是一个文本替代,类似于C预处理器。如果你使用(msg-4)的话,它会像你预期的那样工作。在CPP宏中大量使用()的所有原因也适用于这里。

代码语言:javascript
复制
 %define len msg-4        ; first of all, this is a terrible name: it's not the length!
 mov    edx, var - len    ; expands to var-msg-4,  not var - (msg-4)

 %define msg_minus_varlen  (msg-4)
 mov    edx, var - msg_minus_varlen;  expands to var - (msg-4)

这仍然是一种令人费解的方法。从实际打印的缓冲区中减去两个位置,再减去相同的值,就可以得到长度。

票数 6
EN

Stack Overflow用户

发布于 2016-07-01 18:02:23

看看最上面的台词-你说

代码语言:javascript
复制
 section .text
    %define len msg-4
    global _start 
    msg: db "Thank you"
    var: dd 0x31323334

MSG-4,而不是msg + 4,这就是你所看到的不同之处。

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

https://stackoverflow.com/questions/38150945

复制
相关文章

相似问题

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