我是汇编编程的初学者,想澄清一些在解释这段代码时引起的疑惑
%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)resw 1
-
如果我接受来自用户的变量,那么我必须为按下的"Enter"键保留另一个字节 . 是这样吗 ?如果是,那么"Enter"的ascii值是否会被连接为变量的最后一个字节?
-
指令:mov rsi,a(a = 1234H)rsi指向'a'的内存位置?即 - 它存储地址4或地址1 .
-
如果我增加rsi那么它会指向变量a的下一个数字吗?如何在代码的第4行解释“inc rsi”?假设它当前指向“a”的基址,rsi会增加多少位置?增量是否取决于它指向的变量大小?
-
记忆中如何呈现'a'? ie- 1是出现在最低地址还是出现在最高地址相对于其他数字?
-
在指令中:mov rbx,[rsi]有多少'a'进入rbx,rbx可以在其中存储的'a'的最大限制是多少?
-
在指令中:print buff,4它只打印'a'(12)的一半而不是'1234' . 我已经读过打印宏的第二个参数应该是变量的大小(这里是'buff'),但由于buff的大小是2个字节,所以它只是打印一半而不是完全打印 . 相反,如果我将2替换为2,则完成'1234'被打印 . 尺寸意味着什么?是不是 . 字节或其他东西?
1 回答
没有 .
是的 .
x86是小端,因此第一个字节是最低有效字节,即
34h
.不,十六进制数字是4位(半字节) . 您只能指向字节 .
inc rsi
递增1,当用作地址时为1个字节 .见上文第3点 .
由于您正在加载到
rbx
这是一个64位寄存器,这就是您将获得多少 .要打印的文本的长度 . 代码被破坏是因为它将4个字节写入2字节的缓冲区 .