Samuel Araujo Postado Maio 20, 2023 em 17:19 Compartilhar Postado Maio 20, 2023 em 17:19 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Fernando Mercês Postado Maio 20, 2023 em 21:54 Compartilhar Postado Maio 20, 2023 em 21:54 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Samuel Araujo Postado Maio 20, 2023 em 22:57 Autor Compartilhar Postado Maio 20, 2023 em 22:57 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Fernando Mercês Postado Maio 21, 2023 em 09:07 Compartilhar Postado Maio 21, 2023 em 09:07 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
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.