我是组装编程的初学者,想澄清我在解释此代码时引起的一些疑问
%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(ASB 2b(resw 1
- 如果我接受用户的变量,则必须为按下" Enter"键保留另一个字节。是这样吗 ?如果是,那么"输入"的ASCII值将被串联为变量的最后一个字节?
指令:mov rsi,a(a = 1234h(RSI指向哪个内存位置?即,它存储4个地址或1。
的地址如果我增加了RSI,那么它会指向变量A的下一个数字吗?在代码的第四行中,我该如何解释" Inc RSI"?假设它当前指向" A"的基本地址,则RSI会增加多少?增量会取决于指向的可变量大小吗?
记忆中如何存在'a'?即,与其他数字相对于其他数字的最高地址存在1个?
在说明中:mov rbx,[rsi]RBX中有多少" A",RBX可以存储在其中的最大限制是多少?
- 在说明中:打印抛光,4它仅印刷" A"(12(而不是" 1234"的价值的一半。我已经读到打印宏的第二个参数应该是变量的大小(此处为" buff"(,但是由于buff的大小为2个字节,因此它只是打印一半而不是完全。如果我用4替换2,则打印" 1234"。大小在这里意味着什么?是不。字节还是其他?
- 否。
- 是。
- x86是小末日,所以第一个字节是最不重要的字节,即
34h
。 - 不,十六进制的数字为4位(半字节(。您只能指向字节。
inc rsi
递增1,当用作地址时,它是1个字节。 - 请参见上面的第3点。
- 由于您正在加载到64位寄存器中的
rbx
中,所以您将获得多少。 - 要打印的文本的长度。该代码被打破了,因为它将4个字节写入2个字节的缓冲区。