Enviado em 16/05/2017 - 17:08h
Olá pessoal,
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 2,3,4,5,6,7,Q,J,K e A] ',13,10,0
tamanhoTextoErroCarta: equ $ - TextoErroCarta
TextoErroNaipe: db 'Naipe digitado inválido. [Digite P para Paus, C para Copas, E para Espadas e O para Ouros] ',13,10,0
tamanhoTextoErroNaipe: equ $ - TextoErroNaipe
QuebraLinha: db 13,10,0
tamanhoQuebraLinha: equ $ - QuebraLinha
arrayCartas db '2','3','4','5','6','7','Q','J','K','A'
arrayNaipes db 'P','C','E','O'
section .bss
cartaDigitada: resb 21
tamanhoCartaDigitada equ $ - cartaDigitada
naipeDigitado: resb 21
tamanhoNaipeDigitado: equ $ - naipeDigitado
CARTA: resb 4
NAIPE: resb 4
section .text
global _start
;Esta rotina pede uma carta e verifica se
; o valor é válido
; Entradas:
; ECX - texto complementar da carta
; EDX - tamanho do texto complementar
; EDI - ponteiro para o local onde a carta será colocada
Pede1Carta:
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoPedeCarta
mov edx,tamanhoTextoPedeCarta
int SYSTEM_CALL
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
pop edx
pop ecx
; precisa guardar os valores para
; caso ocorra erro de digitação
push ecx
push edx
int SYSTEM_CALL
mov eax,SYS_READ_FILE
mov ebx,SYS_STANDARD_INPUT
mov ecx,cartaDigitada
mov edx,tamanhoCartaDigitada
int SYSTEM_CALL
call VerificaCarta
Pede1Naipe:
push edi
push ecx
push edx
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoPedeNaipe
mov edx,tamanhoTextoPedeNaipe
int SYSTEM_CALL
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
pop edx
pop ecx
; precisa guardar os valores para
; caso ocorra erro de digitação
push ecx
push edx
int SYSTEM_CALL
mov eax,SYS_READ_FILE
mov ebx,SYS_STANDARD_INPUT
mov ecx,naipeDigitado
mov edx,tamanhoNaipeDigitado
int SYSTEM_CALL
VerificaCarta:
mov eax,10
mov ecx, arrayCartas
call loop
loop:
mov ebx,[cartaDigitada]
cmp [ebx],ecx
add ecx,1
jz Pede1Carta
dec eax
jnz loop
CartaIncorreta:
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoErroCarta
mov edx,tamanhoTextoErroCarta
int SYSTEM_CALL
jmp Pede1Carta
CartaCorreta:
mov eax,[cartaDigitada]
mov [CARTA],eax
ret
_start:
call Pede1Carta
call Pede1Naipe
mov eax,SYS_EXIT_PROGRAM
mov ebx,0
int SYSTEM_CALL
Automatizando digitação de códigos 2FA no browser
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Como converter imagens PNG/JPEG para SVG em linha de comando
Fez porcaria no teu repositório Git? Aprenda a restaurar uma versão anterior do seu código!
Restaurando Fontes de Download do Hydra no Linux
Atualizando "na marra" o YT-DLP quando começa a dar erro de downloads
Como instalar o WPS com interface e corretor ortográfico em PT-BR no Arch Linux
Erro na atualização dos pacotes (0)
Linux não desliga a tela da TV nunca (3)
Fila de impressão em C++ [RESOLVIDO] (6)