- Código: Selecionar todos
; multi-segment executable file template.
data segment
PALAVRA DB "MIGUEL$"
RESPOSTA DB "------$"
PULALINHA DB 13,10,"$"
MENSAGEM DB "ENTRE COM UMA LETRA",13,10,"$"
SEGUNDOS_INICIAL DW 0
SEGUNDOS_FINAL DW 0
MEN_PERD DB "INFELIZMENTE ACABARAM SUAS CHANCES",13,10,"$"
RAPIDO DB "PARABENS, RESOLVEU DENTRO DO TEMPO",13,10,"$"
LENTO DB "SINTO MUITO, VOCE NAO RESPONDEU A TEMPO",13,10,"$"
CABECA DB " *** ",13,10 ;CABECA
DB " ***** ",13,10
DB " * * ",13,10
DB " * ",13,10
DB " * * ",13,10
DB " * ",13,10,"$"
PESCO DB " * ",13,10
DB " * ",13,10
DB " * ",13,10
DB " * ",13,10
DB " * ",13,10
DB " * ",13,10,"$"
BRACOS DB " *** ",13,10
DB " ***** ",13,10
DB " * *** * ",13,10
DB " * *** * ",13,10
DB " * *** * ",13,10
DB " *** ",13,10,"$"
PERNAS DB " *** ",13,10
DB " * * ",13,10
DB " * * ",13,10
DB " * * ",13,10
DB " * * ",13,10
DB " * * ",13,10,"$"
SAPATOS DB " * * ",13,10
DB " **** **** ",13,10
DB " **** **** ",13,10
DB " **** **** ",13,10
DB " **** **** ",13,10
DB " **** **** ",13,10,"$"
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
; add your code here
CALL PEGA_HORA_INICIAL
XOR CH,CH
CONTINUA:
CALL IMPRIME_FORCA
CALL IMPRIME_MENSAGEM
CALL ENTRA_LETRA
MOV DH,'N'
CALL PROCURA_LETRA
CMP DH,'S'
JE VERIFICA_SE_ACABOU
INC CH
CALL IMPRIME_BONECO
CMP CH,5
JE PERDIDO
JMP CONTINUA
PERDIDO:
MOV AH,9
MOV DX, OFFSET MEN_PERD
INT 21H
MOV AH,9
MOV DX,OFFSET PALAVRA
INT 21H
JMP FINALIZA2
VERIFICA_SE_ACABOU:
CALL ACABOU
CMP DH,'N'
JE FINALIZA
JMP CONTINUA
FINALIZA:
CALL IMPRIME_FORCA
CALL PEGA_HORA_FINAL
CALL CALCULA_TEMPO
FINALIZA2:
mov ax, 4c00h ; exit to operating system.
int 21h
IMPRIME_FORCA:
MOV AH,9
MOV DX, OFFSET RESPOSTA
INT 21H
PULA_LINHA:
MOV AH,9
MOV DX, OFFSET PULALINHA
INT 21H
RET
IMPRIME_MENSAGEM:
MOV AH,9
MOV DX, OFFSET MENSAGEM
INT 21H
RET
ENTRA_LETRA:
; RETORNA EM AL
MOV AH,8
INT 21H
RET
PROCURA_LETRA:
MOV SI,0
MOV BX, OFFSET PALAVRA
PROXIMA:
MOV CL,'$'
CMP [BX+SI],CL
JE FIM_PROCURA
CMP [BX+SI],AL
JE MOVIMENTA
INC SI
JMP PROXIMA
FIM_PROCURA:
RET
MOVIMENTA:
MOV DH,'S'
PUSH BX
MOV BX,OFFSET RESPOSTA
MOV [BX+SI],AL
POP BX
INC SI
JMP PROXIMA
ACABOU:
;RETORNA EM DH SE ACABOU OU NAO
PUSH BX
MOV DH,'N'
MOV BX, OFFSET RESPOSTA
COMPARA_ACHOU:
MOV DL,'$'
CMP [BX],DL
JE FIM_ACABOU
MOV DL,'-'
CMP [BX],DL
JE ACHOU_
INC BX
JMP COMPARA_ACHOU
ACHOU_:
MOV DH,'S'
FIM_ACABOU:
POP BX
RET
IMPRIME_BONECO:
CMP CH,1
JNE PART2
JMP ULTIMO_CABECA
PART2:
CMP CH,2
JNE PART3
JMP ULTIMO_PESCOCO
PART3:
CMP CH,3
JNE PART4
JMP ULTIMO_BRACOS
PART4:
CMP CH,4
JNE PART5
JMP ULTIMO_PERNAS
PART5:
CMP CH,5
JNE PART6
JMP ULTIMO_SAPATOS
PART6:
RET
IMPRIME_CABECA:
MOV AH,9
MOV DX, OFFSET CABECA
INT 21H
RET
IMPRIME_PESCOCO:
MOV AH,9
MOV DX, OFFSET PESCO
INT 21H
RET
IMPRIME_BRACOS:
MOV AH,9
MOV DX, OFFSET BRACOS
INT 21H
RET
IMPRIME_PERNAS:
MOV AH,9
MOV DX, OFFSET PERNAS
INT 21H
RET
IMPRIME_SAPATO:
MOV AH,9
MOV DX, OFFSET SAPATOS
INT 21H
RET
ULTIMO_SAPATOS:
CALL IMPRIME_CABECA
CALL IMPRIME_PESCOCO
CALL IMPRIME_BRACOS
CALL IMPRIME_PERNAS
CALL IMPRIME_SAPATO
RET
ULTIMO_PERNAS:
CALL IMPRIME_CABECA
CALL IMPRIME_PESCOCO
CALL IMPRIME_BRACOS
CALL IMPRIME_PERNAS
RET
ULTIMO_BRACOS:
CALL IMPRIME_CABECA
CALL IMPRIME_PESCOCO
CALL IMPRIME_BRACOS
RET
ULTIMO_PESCOCO:
CALL IMPRIME_CABECA
CALL IMPRIME_PESCOCO
RET
ULTIMO_CABECA:
CALL IMPRIME_CABECA
RET
PEGA_HORA_INICIAL:
MOV AH,2CH
INT 21H
MOV AL,60
MUL CL
; CL CONTEM MINUTOS
; AX TEM SEGUNDOS (AX = AL * CL)
; AX TEM SEGUNDOS (AX = 60 * MINUTOS)
; DH CONTEM SEGUNDOS
; DX = DH DL
; DX = SEGUNDOS DL=SUJEIRA
XCHG DH,DL ; TRANFORMA DH EM BITS MENOS
MOV DH,0 ; SIGNIFICATIVOS DE DX E ANULA DH
; DX = DH=0 E DL=SEGUNDOS
ADD AX,DX ; SOMA MAIS SEGUNDOS
MOV WORD PTR SEGUNDOS_INICIAL,AX
RET
PEGA_HORA_FINAL:
MOV AH,2CH
INT 21H
MOV AL,60
MUL CL
; CL CONTEM MINUTOS
; AX TEM SEGUNDOS (AX = AL * CL)
; AX TEM SEGUNDOS (AX = 60 * MINUTOS)
; DH CONTEM SEGUNDOS
; DX = DH DL
; DX = SEGUNDOS DL=SUJEIRA
XCHG DH,DL ; TRANFORMA DH EM BITS MENOS
MOV DH,0 ; SIGNIFICATIVOS DE DX E ANULA DH
; DX = DH=0 E DL=SEGUNDOS
ADD AX,DX ; SOMA MAIS SEGUNDOS
MOV WORD PTR SEGUNDOS_FINAL,AX
RET
CALCULA_TEMPO:
MOV AX,WORD PTR SEGUNDOS_FINAL
MOV BX,WORD PTR SEGUNDOS_INICIAL
SUB AX,BX
CALL PRINT_AX
CMP AX,10
JLE PARABENS
MOV AH,9
MOV DX, OFFSET LENTO
INT 21H
RET
PARABENS:
MOV AH,9
MOV DX, OFFSET RAPIDO
INT 21H
RET
;===================================
; rotina do emu8086.com
print_ax proc
cmp ax, 0
jne print_ax_r
push ax
mov al, '0'
mov ah, 0eh
int 10h
pop ax
ret
print_ax_r:
pusha
mov dx, 0
cmp ax, 0
je pn_done
mov bx, 10
div bx
call print_ax_r
mov ax, dx
add al, 30h
mov ah, 0eh
int 10h
jmp pn_done
pn_done:
popa
ret
endp
print_nl proc
push ax
push dx
mov ah, 2
mov dl, 0Dh
int 21h
mov dl, 0Ah
int 21h
pop dx
pop ax
ret
endp
ends
end start ; set entry point and stop the assembler.