Olá pessoal, boa noite!
Estou abrindo esse tópico pois preciso de ajuda para um entendimento em um código em assembly que aparece no livro "Programação em Baixo Nível - Igor Zhirkov" na página 52 ele mostra um código que tem o objetivo de mostrar o valor do registrador RAX, segue abaixo:
section .data
codes:
db "0123456789ABCDEF"
section .text
global _start
_start:
mov rax, 0x1122334455667788
mov rdi, 1
mov rdx, 1
mov rcx, 64
; Cada 4 bits devem ser exibidos como um dígito hexadecimal
; Use o deslocamento (shift) e a operação bit a bit AND para isolá-los
; o resultado é o offset no array 'codes'
.loop:
push rax
sub rcx, 4
; cl é um registrador, a parte menor de rcx
; rax -- eax -- ax -- ah + al
; rcx -- ecx -- cx -- ch + cl
sar rax, cl
and rax, 0xf
lea rsi, [codes + rax]
mov rax, 1
push rcx
syscall
pop rcx
pop rax
test rcx, rcx
jnz .loop
mov rax, 60
xor rdi, rdi
syscall
O que eu não estou conseguindo compreender é:
Na linha onde está "sar rax,cl" vi que isso é uma operação de bit shifting para a direita, pesquisei em alguns sites para ver como ficaria essa operação e o resultado é sempre 5, mas rodando o programa o resultado é 1, por que?
Não entendi o propósito do programa em si, quem souber explicar fico muito grato.
Tentei procurar na internet e utilizar o ChatGPT mas ainda não consegui entender na totalidade a ponto de saber explicar para alguém, quem puder me ajudar agradeço muito.