Ir para conteúdo

Programação em Baixo Nível - print_rax.asm


Nitczi

Posts Recomendados

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.

 

rax1.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Legais as perguntas! 🙂

Em 17/10/2023 em 21:39, Nitczi disse:

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?

O nome é deslocamento aritimético para a direita. Tem o deslocamento lógico também, que é feito pela instrução SHL. 😉

O que essa instrução faz é, tomando o número em binário, "empurrar" todos os bits para a direita e aí o bit que "sobra" à esquerda é preenchido com zero ou um (caso ele já seja 1). Por exemplo:

0011 SAR 1 = 0001
1100 SAR 1 = 1110

O código faz 0x1122334455667788 SAR 0x3c (60) na primeira iteração do loop. Para entender, você teria que converter 0x1122334455667788 para binário e fazer a operação de deslocamento aritimético para a direita sessenta vezes, entende? Então vamos lá:

0x1122334455667788 em binário é: 0001 0001 0010 0010 0011 0011 0100 0100 0101 0101 0110 0110 0111 0111 1000 1000 (observe a parte em negrito, que será deslocada para a direita).

Deslocando somente uma vez para a direita, teremos:

0000 1000 1001 0001 0001 1001 1010 0010 0010 1010 1011 0011 0011 1011 1100 0100

O zero foi colocado à esquerda porque o bit original era zero.

Agora você teria que fazer o processo mais 59 vezes para chegar no resultado 1. 🙂

Fiz um programa em Python aqui para simular, trabalhando com o número como se fosse uma string. Espero que não confunda mais. 🤣

rax = '0001000100100010001100110100010001010101011001100111011110001000'

print(f'rax = {rax}')

for i in range(1, 61):
    if rax[0] == '0':
        rax = '0' + rax[:-1]
    else:
        rax = '1' + rax[:-1]

    print(f'rax SAR {i:02d} = {rax}')

A saída é:

rax = 0001000100100010001100110100010001010101011001100111011110001000
rax SAR 01 = 0000100010010001000110011010001000101010101100110011101111000100
rax SAR 02 = 0000010001001000100011001101000100010101010110011001110111100010
rax SAR 03 = 0000001000100100010001100110100010001010101011001100111011110001
rax SAR 04 = 0000000100010010001000110011010001000101010101100110011101111000
rax SAR 05 = 0000000010001001000100011001101000100010101010110011001110111100
rax SAR 06 = 0000000001000100100010001100110100010001010101011001100111011110
rax SAR 07 = 0000000000100010010001000110011010001000101010101100110011101111
rax SAR 08 = 0000000000010001001000100011001101000100010101010110011001110111
rax SAR 09 = 0000000000001000100100010001100110100010001010101011001100111011
rax SAR 10 = 0000000000000100010010001000110011010001000101010101100110011101
rax SAR 11 = 0000000000000010001001000100011001101000100010101010110011001110
rax SAR 12 = 0000000000000001000100100010001100110100010001010101011001100111
rax SAR 13 = 0000000000000000100010010001000110011010001000101010101100110011
rax SAR 14 = 0000000000000000010001001000100011001101000100010101010110011001
rax SAR 15 = 0000000000000000001000100100010001100110100010001010101011001100
rax SAR 16 = 0000000000000000000100010010001000110011010001000101010101100110
rax SAR 17 = 0000000000000000000010001001000100011001101000100010101010110011
rax SAR 18 = 0000000000000000000001000100100010001100110100010001010101011001
rax SAR 19 = 0000000000000000000000100010010001000110011010001000101010101100
rax SAR 20 = 0000000000000000000000010001001000100011001101000100010101010110
rax SAR 21 = 0000000000000000000000001000100100010001100110100010001010101011
rax SAR 22 = 0000000000000000000000000100010010001000110011010001000101010101
rax SAR 23 = 0000000000000000000000000010001001000100011001101000100010101010
rax SAR 24 = 0000000000000000000000000001000100100010001100110100010001010101
rax SAR 25 = 0000000000000000000000000000100010010001000110011010001000101010
rax SAR 26 = 0000000000000000000000000000010001001000100011001101000100010101
rax SAR 27 = 0000000000000000000000000000001000100100010001100110100010001010
rax SAR 28 = 0000000000000000000000000000000100010010001000110011010001000101
rax SAR 29 = 0000000000000000000000000000000010001001000100011001101000100010
rax SAR 30 = 0000000000000000000000000000000001000100100010001100110100010001
rax SAR 31 = 0000000000000000000000000000000000100010010001000110011010001000
rax SAR 32 = 0000000000000000000000000000000000010001001000100011001101000100
rax SAR 33 = 0000000000000000000000000000000000001000100100010001100110100010
rax SAR 34 = 0000000000000000000000000000000000000100010010001000110011010001
rax SAR 35 = 0000000000000000000000000000000000000010001001000100011001101000
rax SAR 36 = 0000000000000000000000000000000000000001000100100010001100110100
rax SAR 37 = 0000000000000000000000000000000000000000100010010001000110011010
rax SAR 38 = 0000000000000000000000000000000000000000010001001000100011001101
rax SAR 39 = 0000000000000000000000000000000000000000001000100100010001100110
rax SAR 40 = 0000000000000000000000000000000000000000000100010010001000110011
rax SAR 41 = 0000000000000000000000000000000000000000000010001001000100011001
rax SAR 42 = 0000000000000000000000000000000000000000000001000100100010001100
rax SAR 43 = 0000000000000000000000000000000000000000000000100010010001000110
rax SAR 44 = 0000000000000000000000000000000000000000000000010001001000100011
rax SAR 45 = 0000000000000000000000000000000000000000000000001000100100010001
rax SAR 46 = 0000000000000000000000000000000000000000000000000100010010001000
rax SAR 47 = 0000000000000000000000000000000000000000000000000010001001000100
rax SAR 48 = 0000000000000000000000000000000000000000000000000001000100100010
rax SAR 49 = 0000000000000000000000000000000000000000000000000000100010010001
rax SAR 50 = 0000000000000000000000000000000000000000000000000000010001001000
rax SAR 51 = 0000000000000000000000000000000000000000000000000000001000100100
rax SAR 52 = 0000000000000000000000000000000000000000000000000000000100010010
rax SAR 53 = 0000000000000000000000000000000000000000000000000000000010001001
rax SAR 54 = 0000000000000000000000000000000000000000000000000000000001000100
rax SAR 55 = 0000000000000000000000000000000000000000000000000000000000100010
rax SAR 56 = 0000000000000000000000000000000000000000000000000000000000010001
rax SAR 57 = 0000000000000000000000000000000000000000000000000000000000001000
rax SAR 58 = 0000000000000000000000000000000000000000000000000000000000000100
rax SAR 59 = 0000000000000000000000000000000000000000000000000000000000000010
rax SAR 60 = 0000000000000000000000000000000000000000000000000000000000000001

Com isso você prova que 0x1122334455667788 SAR 60 é igual a 1. Mas na próxima iteração do loop, RAX sofrerá uma operação SAR com 56, que já não é 1, e por aí vai... Ou seja, não é que é sempre 1. 😉

O objetivo deste programa é você imprimir na tela cada dígito hexa do registrador RAX, não importa o que você coloque lá. Testa com 0xf0f0caf0f0ca2023 por exemplo. 😉

Abraço!

  • Agradecer 1
Link para o comentário
Compartilhar em outros sites

  • Fernando Mercês changed the title to Programação em Baixo Nível - print_rax.asm

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...