【发布时间】:2018-09-08 14:28:19
【问题描述】:
我是汇编编程的初学者,想澄清我在解释这段代码时引起的一些疑问
%macro print 2
mov rax,1
mov rdi,1
mov rsi,%1
mov rdx,%2
syscall
%endmacro
%macro exit 0
mov rax,60
mov rdi,0
syscall
%endmacro
%macro accept 2
mov rax,0
mov rdi,0
mov rsi,%1
mov rdx,%2
syscall
%endmacro
section .data
a dw 123AH
section .bss
b resb 2;
buff resb 2;
section .code
global _start
_start:
accept b,2
mov rsi,a ;3
mov rbx,[rsi] ;6
call hextoascii
mov rsi,buff
exit
hextoascii:
mov rcx,4
mov rsi,buff
back:
rol bx,4
mov al,bl
and al,0Fh
cmp al,09H
jbe add30h
add al,7h
add30h:
add al,30h
mov [rsi],al
inc rsi ;4
loop back
print buff,2 ;7
ret
我有几个问题要问:
- 以下两者在内存中的存储或任何其他方面是否有任何区别 a) 一个 resb 2 b) 回复 1
- 如果我接受来自用户的变量,那么我必须为按下的“Enter”键保留另一个字节。是这样吗 ?如果是,那么“Enter”的ascii值是否会被连接为变量的最后一个字节?
指令:mov rsi,a (a=1234H) rsi 指向“a”的哪个内存位置?即——它存储的是4的地址还是1的地址。
如果我增加 rsi 那么它会指向变量 a 的下一个数字吗?我该如何解释代码最后第四行中的“inc rsi”? 假设 rsi 当前指向 "a" 的基地址,它会增加多少位置?增量是否取决于它指向的变量的大小?
'a' 是如何出现在内存中的?即- 相对于其他数字,1 出现在最低地址还是出现在最高地址?
在指令中:mov rbx,[rsi] 有多少 'a' 进入 rbx 以及 rbx 可以存储在其中的 'a' 的最大限制是多少?
- 在指令中:打印 buff,4 它只打印 'a' (12) 值的一半,而不是完全打印 '1234'。我已经读过 print 宏的第二个参数应该是变量的大小(这里是 'buff')但是由于 buff 的大小是 2 个字节,它只是打印一半而不是完全。相反,如果我将 2 替换为 4,则会打印完整的“1234”。这里的大小是什么意思?是不是。字节或其他东西?
【问题讨论】:
-
第 4 部分是您之前从另一个同名帐户发布的问题的副本。 stackoverflow.com/questions/49541502/…。
inc rsi将 64 位整数值加 1。当用作指针时,它始终表示下一个字节,不管其他任何内容。 -
啊,重复帐户...
-
@Jacob:使用调试器(如 GDB)单步执行代码,并执行
print /x *(char*)$rsi(或x /xbc $rsi)之类的操作来检查内存中的字节以查看 RSI 是什么指向。您可以通过一些实验自己回答大部分问题。 -
好吧,我不知道变量存储值的方式(小端序),这让我非常困惑,以至于我不得不就新代码提出问题!我无法使用该帐户发布新问题!