Samuel Araujo Posted May 20, 2023 Posted May 20, 2023 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 Quote
Administrators Fernando Mercês Posted May 20, 2023 Administrators Posted May 20, 2023 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. Quote
Samuel Araujo Posted May 20, 2023 Author Posted May 20, 2023 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. 1 Quote
Administrators Fernando Mercês Posted May 21, 2023 Administrators Posted May 21, 2023 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! Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.