Ir para conteúdo

Erro com saltos condicionais na validação de entrada do usuário, assembly nasm x86-64 S.O linux.


Samuel Araujo

Posts Recomendados

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

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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!

Link para o comentário
Compartilhar em outros sites

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...