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