Hey Frank!
Thanks a lot again!
I've done some changes at this point based on your tips again.
Let me show the code:
section .data
SYS_EXIT_PROGRAM equ 1
SYS_STANDARD_OUTPUT equ 1
SYS_STANDARD_INPUT equ 2
SYS_READ_FILE equ 3
SYS_WRITE_FILE equ 4
SYSTEM_CALL equ 0x80
;textos de exibicao para entrada do programa
TextoPedeCarta: db 'Informe a Carta: ',0
tamanhoTextoPedeCarta: equ $ - TextoPedeCarta
TextoPedeNaipe: db 'Informe o Naipe: ',0
tamanhoTextoPedeNaipe: equ $ - TextoPedeNaipe
;textos de exibicao para erros de entrada
TextoErroCarta: db 'Carta digitada inválida. [Digite uma carta entre 4,5,6,7,Q,J,K,A,2 e 3]',10
tamanhoTextoErroCarta: equ $ - TextoErroCarta
TextoErroNaipe: db 'Naipe digitado inválido. [Digite P para Paus, C para Copas, E para Espadas e O para Ouros]',10
tamanhoTextoErroNaipe: equ $ - TextoErroNaipe
QuebraLinha: db 13,10,0
tamanhoQuebraLinha: equ $ - QuebraLinha
arrayCartas db '4','5','6','7','Q','J','K','A','2','3'
tamArrayCartas: equ $ - arrayCartas
arrayNaipes db 'P','C','E','O'
tamArrayNaipes: equ $ - arrayNaipes
NaipePaus: db 'P'
NaipeCopas: db 'C'
NaipeEspadas: db 'E'
NaipeOuros: db 'O'
SimbPaus: db '?',0
SimbCopas: db '?',0
SimbEspadas: db '?',0
SimbOuros: db '?',0
section .bss
cartaDigitada: resb 21
tamanhoCartaDigitada equ $ - cartaDigitada
naipeDigitado: resb 21
tamanhoNaipeDigitado: equ $ - naipeDigitado
CARTA: resb 1
tamCARTA : equ $ - CARTA
NAIPE: resb 4
tamNAIPE : equ $ - NAIPE
section .text
global _start
Pede1Carta:
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoPedeCarta
mov edx,tamanhoTextoPedeCarta
int SYSTEM_CALL
mov eax,SYS_READ_FILE
mov ebx,SYS_STANDARD_INPUT
mov ecx,cartaDigitada
mov edx,tamanhoCartaDigitada
int SYSTEM_CALL
jmp VerificaCarta
Pede1Naipe:
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoPedeNaipe
mov edx,tamanhoTextoPedeNaipe
int SYSTEM_CALL
mov eax,SYS_READ_FILE
mov ebx,SYS_STANDARD_INPUT
mov ecx,naipeDigitado
mov edx,tamanhoNaipeDigitado
int SYSTEM_CALL
jmp VerificaNaipe
VerificaCarta:
mov eax,tamArrayCartas
mov ecx, arrayCartas
mov bl,[cartaDigitada] ;mov a carta digitada para bl
cmp bl, 'a'
jb loopCartas
cmp bl, 'z'
ja loopCartas
and bl, 0DFh ; força para letras maiusculas
mov [cartaDigitada],bl
jmp loopCartas
loopCartas:
cmp bl,[ecx] ; compara bl com o valor de ecx (ecx = MEU VETOR)
jz CartaCorreta ; se a comparacao com o ELEMENTO ATUAL for igual a zero (ou seja, se forem iguais), pulo para CartaCorreta
add ecx,1 ;senao, adiciono mais um no ecx (anda um indice no vetor)
dec eax ; diminuo um do eax (eax = tamArrayCartas)
jnz loopCartas ; enquanto eax != 0 ,faça loop
jmp CartaIncorreta ; pula para CartaIncorreta
VerificaNaipe:
mov eax,tamArrayNaipes
mov ecx, arrayNaipes
mov bl,[naipeDigitado] ;mov a carta digitada para bl
cmp bl, 'a'
jb loopNaipes
cmp bl, 'z'
ja loopNaipes
and bl, 0DFh ; força para letras maiusculas
mov [naipeDigitado],bl
jmp loopNaipes
loopNaipes:
cmp bl,[ecx] ; compara bl com o valor de ecx (ecx = MEU VETOR)
jz NaipeCorreto ; se a comparacao com o ELEMENTO ATUAL for igual a zero(ou seja, se forem iguais), pulo para NaipeCorreto
add ecx,1 ;senao, adiciono mais um no ecx (anda um indice no vetor)
dec eax ; diminuo um do eax (eax = tamArrayNaipes)
jnz loopNaipes ; enquanto eax != 0 ,faça loop
jmp NaipeIncorreto ; pula para NaipeIncorreto
CartaIncorreta:
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoErroCarta
mov edx,tamanhoTextoErroCarta
int SYSTEM_CALL
jmp Pede1Carta
CartaCorreta:
mov ecx,[cartaDigitada]
mov [CARTA],ecx
ret
NaipeIncorreto:
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoErroNaipe
mov edx,tamanhoTextoErroNaipe
int SYSTEM_CALL
jmp Pede1Naipe
NaipeCorreto:
mov ecx,[naipeDigitado]
mov [NAIPE],ecx
jmp MudaNaipe
MudaNaipe:
mov bl,[NAIPE]
cmp bl,'P'
jz MudaPaus
cmp bl,'C'
jz MudaCopas
cmp bl,'E'
jz MudaEspadas
cmp bl, 'O'
jz MudaOuros
MudaPaus:
mov eax,[SimbPaus]
mov [NAIPE],eax
ret
MudaCopas:
mov eax,[SimbCopas]
mov [NAIPE],eax
ret
MudaEspadas:
mov eax,[SimbEspadas]
mov [NAIPE],eax
ret
MudaOuros:
mov eax,[SimbOuros]
mov [NAIPE],eax
ret
MontaCarta:
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,CARTA
mov edx,tamCARTA
int SYSTEM_CALL
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,NAIPE
mov edx,tamNAIPE
int SYSTEM_CALL
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,QuebraLinha
mov edx,tamanhoQuebraLinha
int SYSTEM_CALL
ret
_start:
call Pede1Carta
call Pede1Naipe
call MontaCarta
mov eax,SYS_EXIT_PROGRAM
mov ebx,0
int SYSTEM_CALL