我编写了以下代码:
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
发布于 2016-07-01 18:27:01
%define len msg-4是一个文本替代,见下文。
通常的方法是用$ - start计算对象后面的长度。简单地给结束贴上标签也会奏效。
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宏中大量使用()的所有原因也适用于这里。
%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)这仍然是一种令人费解的方法。从实际打印的缓冲区中减去两个位置,再减去相同的值,就可以得到长度。
发布于 2016-07-01 18:02:23
看看最上面的台词-你说
section .text
%define len msg-4
global _start
msg: db "Thank you"
var: dd 0x31323334MSG-4,而不是msg + 4,这就是你所看到的不同之处。
https://stackoverflow.com/questions/38150945
复制相似问题