我对程序集编程很陌生,我试图解释以下代码,在其中我必须打印.data部分中的数组:下面是代码:
%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
section .data
msg db 10,"Array is : ",10
len equ $-msg
array dq 11234H, 0AB32H, -3326H, 056BH
newline db 10
section .bss
buff resb 16;
section .code
global _start
_start:
print msg,len
mov rsi,array
mov rcx,4
back:
mov rbx,[rsi]
push rsi
push rcx
call HextoASCII
print newline,1
pop rcx
pop rsi
add rsi,8
loop back
exit
HextoASCII:
mov rsi,buff
mov rcx,16
back1:
rol rbx,4
mov al,bl
and al,0fh
cmp al,9h
jbe add_30h
add al,7h
add_30h:
add al,30h
mov [rsi],al
inc rsi
loop back1
print buff,16
ret我有几个问题要问,以澄清我的疑虑:
rsi公司
据说rsi增加了1,但是这里的1是位还是字节,或者是8字节(rsi的大小)。
发布于 2018-03-28 18:45:32
10不是msg的大小。那些只是嵌入的行提要。大小计算为len equ $-msg,因此将始终与您提供的文本长度相匹配。11234H是0000000000011234H,并且是正的。FFFFFFFFH是一个很大的正数。FFFFFFFFFFFFFFFFH可能是更大的数字或-1,这取决于您是将它解释为无符号还是签名。1。它只是在rsi中添加一个值。当以后用作地址时,这将意味着1字节。0值为30h (以此类推)。是的,如果您读取文本,您将需要从ascii转换为二进制。rsi以将其他数字放在后面是有意义的。不知道为什么你认为这是相反的。print,因此缩短输出适用于每个元素,而不是整个输出。当然,这将是更高的数字,因为这就是他们在记忆中的表现。见上文第7点。https://stackoverflow.com/questions/49541502
复制相似问题