Jump to content

Recommended Posts

Posted

Olá, sou um autodidata que esta estudando assembly nasm x86-64 e C. 
Estou fazendo um programa para treinar meus conhecimentos em C e assembly, o código que estou com erro será uma função em assembly que vou chamar em C, porém isso não é relevante ao erro, vou tratar o código aqui como se fosse um programa individual.
Meu erro acontece quando eu tento validar a entrada do usuário de números inteiros de  1 a 9, porém primeiro eu tento valida-las como caractere, as condições de validação nunca são atendidas e meu programa entra em loop quase infinito, alguém me ajuda?? Por favor!!!!!!

Cóidigo:

Bits 64

section .data
        msg db 'Você digitou um caracterer ou valor invalido para a operação!', 0xA, 'por favor digite apenas números inteiros de 1 a 9.', 0xA
        tam5 equ $-msg
        msg1 db 'Digite (1) para realizar a operação novamente:', 0xA
        tam6 equ $-msg1
        msg3 db 'Deu bom garoto', 0xA
        tam7 equ $-msg3


section .bss
        user1 resb 21
        tam1 equ $-user1
        user2 resb 1
        tam2 equ $-user2


section .text

global _start
_start:
        mov rax, 0
        mov rdi, 0
        mov rsi, user1
        mov rdx, tam1
        syscall ; vamos pegar a entrada do usuario em caractere e armazenar no endereço de user1.      
        xor rcx, rcx ; limpei rcx para a operação seguinte.


        /* No procedimento seguinte esta meu erro, não importa oque eu faça o caractere nunca é validado
            e sempre salta para o procedimento invalido, onde entra quase em um loop infinito
            eu ja tive o mesmo problema com saltos em outros programas testes que eu faço para treinar.
            acredito que o erro esteja na entrada do usuario, mas relamente n consigo entender*/
verifica:

        mov rax, user1 ; movi para rax o endereço da entrada do usuario   
        mov al, [rax + rcx]
 
    /* Estou movendo o valor do byte menos significativo, que esta em uma posição de memória resultante da operação que fiz com o endereço que esta em rax + rcx.
       Aqui eu levo em consideração que cada caractere de 1-9 contem sua representação em 1 byte, o grande problema vem a seguir */  

        cmp al, 0 
        je valido ; compara com nullo (fim da entrada do usuario) e salta pro fim do programa 
        cmp al, '0' 
        jl invalido ; compara se é menor que a representação do caractere 0.
        cmp al, '9' 
        jg invalido ; compara se é menor que a representação do caractere 9.
        inc rcx  
        jmp verifica

invalido:
        mov rax, 1
        mov rdi, 1
        mov rsi, msg
        mov rdx, tam5
        syscall

        mov rax, 1
        mov rdi, 1
        mov rsi, msg1
        mov rdx, tam6
        syscall

        mov rax, 0
        mov rdi, 0
        mov rsi, user2
        mov rdx, tam2
        syscall

        xor rax, rax
        mov rax, user2
        mov al, [rax]
        cmp al, '1'
        je _start

        mov rax, 60
        mov rdi, 0
        syscall

valido:
        mov rax, 1
        mov rdi, 1
        mov rsi, msg3
        mov edx, tam7
        syscall

        mov rax, 60
        mov rdi, 0
        syscall

Meu código.txt

  • Administrators
Posted
Em 20/05/2023 em 14:19, Samuel Araujo disse:
        cmp al, 0 
        je valido ; compara com nullo (fim da entrada do usuario) e salta pro fim do programa 

Oi Samuel. Bem vindo à Mente Binária! 🙂

O trecho que citei não tá certo. O fim da string de entrada não contém um caractere nulo (0x00) e sim um caractere de nova linha, porque o usuário pressionou ENTER, que é o 0x0a. Ou seja, se você comparar com 0x0a, 10 ou `\n` (que dá tudo no mesmo), resolve este caso. 😉

Abraço.

Posted

Uauu, que honra o Fernando comentando meu erro!!!Muito obrigado, agora tudo faz sentido..Agr que vc falou se n me engano vc cita em alguma aula do curso de C que o ultimo caractere é o de nova linha, acho que é a aula sobre array, n lembro...Eu acompanho o mente binaria faz 2 anos já, vcs me influenciaram a aprender programação, e não só isso...Me deram um caminho para aprender pelo baixo nível...fiquei 9 mêses estudando o livro de Arquitetura e Organização de Computadores do Willian Stalins, e agr comecei a estudar a matéria de programação, capengando com erros e pesquisas, estudos..Mas é isso, continue com o projeto e muito obrigado novamente.

  • Curtir 1
  • Administrators
Posted
Em 20/05/2023 em 19:57, Samuel Araujo disse:

Uauu, que honra o Fernando comentando meu erro!!!

Hahaha tamo aqui pra isso. Honra minha em ajudar num primeiro tópico tão foda. 🙂

Em 20/05/2023 em 19:57, Samuel Araujo disse:

Muito obrigado, agora tudo faz sentido..Agr que vc falou se n me engano vc cita em alguma aula do curso de C que o ultimo caractere é o de nova linha, acho que é a aula sobre array, n lembro...

Desconheço hehe. No caso de uma C string (um array de chars), o último elemento é um nullbyte mesmo. Só pra deixar claro, no caso aí da SYS_read (mov rax, 0), o que acontece é que como você tá usando um terminal (o usuário digita num terminal), o padrão para encerrar a linha é o newline (0x0a). Então não é que a SYS_read pára ao encontrar o newline, é que o usuário manda um newline através de um terminal interativo. Então, quando você busca um newline pra encontrar o "fim da linha", só vai funcionar assim, quando o usuário digita. Se ele ler da entrada padrão ou encerrar a digitação com outro caractere que não seja o ENTER, seu programa não vai pegar (referência). Mas para os fins do que você está estudando agora, acho que ok. 👌 

Em 20/05/2023 em 19:57, Samuel Araujo disse:

Eu acompanho o mente binaria faz 2 anos já, vcs me influenciaram a aprender programação, e não só isso...Me deram um caminho para aprender pelo baixo nível...fiquei 9 mêses estudando o livro de Arquitetura e Organização de Computadores do Willian Stalins, e agr comecei a estudar a matéria de programação, capengando com erros e pesquisas, estudos..Mas é isso, continue com o projeto e muito obrigado novamente.

Que bela história @Samuel Araujo! 9 meses estudando um livro. Poxa, muito foda mesmo. 🙂 E ficamos felizes em saber que fazermos parte da tua jornada de aprendizado. Precisamos, estamos aqui! E se quiser compartilhar programas como esse com a gente, só postar aqui no fórum. 

Abraço!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...