JOGO DA FORCA

Software e Hardware para linha x86

Moderadores: andre_luis, 51

JOGO DA FORCA

Mensagempor tcpipchip » 03 Nov 2011 08:23

Programa exemplo que fiz para gurizada...usei o emu8086.com
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.
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor enigmabox » 04 Nov 2011 18:20

Legal tcpipchip,

Hora que tiver tempo vou carregar seu codigo Assembly numa maquina antiga que tenho aqui pra ver o que acontece.....

:wink:
enigmabox
 

Mensagempor fender » 05 Nov 2011 14:23

Tcpipchip, seu livro de java para microcontrolador já está à venda?
fender
Byte
 
Mensagens: 268
Registrado em: 13 Out 2006 19:31

Mensagempor tcpipchip » 07 Nov 2011 09:27

Infelizmente, ainda nao...
Estamos reescrevendo...pq a programacao será agora via MPLAB-X...tambem encaminhamos a proposta do livro para a editora da universidade e estamos aguardando a resposta e liberacao da grana para imprimir 1000 livros..
TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor mastk » 08 Nov 2011 21:00

Ja faz tempo que nao vejo um codigo em ASM bem feitinho assim. So de lembrar os que tenho que dar manutencao tenho vontade de chorar.
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor fabim » 09 Nov 2011 07:36

Fazia tempos que não via um professor com tanto tempo ocioso assim.
Se escreve-se mais, teriam mais livros pra gente ler e aprender..
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

ULTIMA VERSAO

Mensagempor tcpipchip » 15 Nov 2011 15:08

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
   
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.
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!


Voltar para Intel x86

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x