2009-07-16 8 views
2

다음 프로그램을 어셈블 할 때 어떤 오류로 인해 ******Fatal** C:\TASM\emu8086\M3\M3.asm(243) Unexpected end of file encountered****이 발생할 수 있습니다. 243 행은 프로그램의 마지막 부분이지만 잘못된 것이 무엇인지 알 수는 없습니다.어셈블리 8086 프로그램 - 어셈블리 오류

.model small 
.stack 100h 

;org  100h 

; pular seção de dados: 
;jmp  inicio 

; ------ data section ------ 
.data 

s_tamanho equ  7 

; coordenadas da cobra 
; (da cauda à cabeça) 
; low byte à esquerda, high byte 
; no top - [top, esquerda] 
cobra dw s_tamanho dup(0) 

cauda dw  ? 

; direcao 
;   (codigos de tecla da bios): 
esquerda equ  4bh 
direita equ  4dh 
up  equ  48h 
baixo equ  50h 

; direçao atual da cobra: 
cur_dir db  direita 

espera_tempo dw 0 

; mensagem inicial 
msg  db "==== como jogar ====", 0dh,0ah 
    db "controle a cobra utilizando as setas direcionais", 0dh,0ah 
    db "qualquer outra tecla fará a cobra parar.", 0dh,0ah, 0ah 

    db "aperte ESC para sair.", 0dh,0ah 
    db "====================", 0dh,0ah, 0ah 
    db "aperte qualquer tecla para iniciar...$" 

; ------ seção de codigo ------ 

.code 

inicio: 

; imprime msg inicial: 
mov dx, offset msg 
mov ah, 9 
int 21h 


; espera teclado: 
mov ah, 00h 
int 16h 


; esconde o cursor: 
mov  ah, 1 
mov  ch, 2bh 
mov  cl, 0bh 
int  10h   


jogo_loop: 

; escolhe primeira tela do video 
mov  al, 0 ; numero da tela. 
mov  ah, 05h 
int  10h 

; mostra nova cabeça: 
mov  dx, cobra[0] 

; posiciona cursor em dl,dh 
mov  ah, 02h 
int  10h 

; imprime '*' no local: 
mov  al, '*' 
mov  ah, 09h 
mov  bl, 0eh ; attribute. 
mov  cx, 1 ; single char. 
int  10h 

; mantem a cauda: 
mov  ax, cobra[s_tamanho * 2 - 2] 
mov  cauda, ax 

call movimento_cobra 


; esconde a cauda velha: 
mov  dx, cauda 

; posiciona o curso em dl,dh 
mov  ah, 02h 
int  10h 

; imprime ' ' no local: 
mov  al, ' ' 
mov  ah, 09h 
mov  bl, 0eh ; atribuir. 
mov  cx, 1 ; único char. 
int  10h 



aguarda_entrada_teclado: 

; buscar comando: 
mov  ah, 01h 
int  16h 
jz  no_key 

mov  ah, 00h 
int  16h 

cmp  al, 1bh ; tecla - ESC? 
je  parar_jogo ; 

mov  cur_dir, ah 

no_key:  

; aguardar: 
; pegar intervalos do relogio 
; (aprox 18 por segundo) 
; desde 00:00 ateh cx:dx 

mov  ah, 00h 
int  1ah 
cmp  dx, espera_tempo 
jb  aguarda_entrada_teclado 
add  dx, 4 
mov  espera_tempo, dx  

; loop infinito: 
jmp  jogo_loop 

parar_jogo: 

; mostrar cursor: 
mov  ah, 1 
mov  ch, 0bh 
mov  cl, 0bh 
int  10h 

ret 

; ------ seção das funções ------  
; este procedimento cria a 
; animação movimentando todas as 
; partes ateh a cauda, 
; a ultima parte da cauda some: 
; [ultima parte (cauda)]-> some 
; [parte i] -> [parte i+1] 
;------------------------------------------------------------------ 

movimento_cobra proc near 

; seta es para o segmento de informação da bios: 

mov  ax, 40h 
mov  es, ax 

    ; aponta di para a cauda 

    mov di, s_tamanho * 2 - 2 
    ; movimenta todo o corpo 
    ; (ultima parte some) 
    mov cx, s_tamanho-1 
movimento_array: 
    mov ax, cobra[di-2] 
    mov cobra[di], ax 
    sub di, 2 
    loop movimento_array 


cmp  cur_dir, esquerda 
    je movimento_esquerda 
cmp  cur_dir, direita 
    je movimento_direita 
cmp  cur_dir, up 
    je movimento_up 
cmp  cur_dir, baixo 
    je movimento_baixo 

jmp  parar_movimento  ; sem direção. 


movimento_esquerda: 
    mov al, b.cobra[0] 
    dec al 
    mov b.cobra[0], al 
    cmp al, -1 
    jne parar_movimento  
    mov al, es:[4ah] ; numero da coluna. 
    dec al 
    mov b.cobra[0], al ; retornar a direita. 
    jmp parar_movimento 

movimento_direita: 
    mov al, b.cobra[0] 
    inc al 
    mov b.cobra[0], al 
    cmp al, es:[4ah] ; col number. 
    jb parar_movimento 
    mov b.cobra[0], 0 ; return to esquerda. 
    jmp parar_movimento 

movimento_up: 
    mov al, b.cobra[1] 
    dec al 
    mov b.cobra[1], al 
    cmp al, -1 
    jne parar_movimento 
    mov al, es:[84h] ; numero da fileira -1. 
    mov b.cobra[1], al ; voltar para baixo. 
    jmp parar_movimento 

movimento_baixo: 
    mov al, b.cobra[1] 
    inc al 
    mov b.cobra[1], al 
    cmp al, es:[84h] ; numero da fileira -1. 
    jbe parar_movimento 
    mov b.cobra[1], 0 ; voltar ao topo. 
    jmp parar_movimento 

parar_movimento: 
    ret 
movimento_cobra endp 
;------------------------------------------------------------------ 
mov ah,4ch 
int 21h 

이 프로그램은 숙제 지정 용이며 뱀 게임입니다. 의견은 포르투갈어로되어 있습니다.

+0

조립 코드의 주석은 도움이되는 경향이 있습니다. : o –

답변

3

아마 일반 텍스트로 저장하지 않을 수도 있습니다. Word 형식이 아니거나 유니 코드 형식이 아닌지 확인하십시오. 오류 메시지가 표시되면

+0

+1 소스 코드에 아스키 문자가 아닌 문자가 있습니다 (TASM +의 '예상치 못한 파일 끝에 도달 함'으로 관련 정보를 표시 할 수 있음) –

3

"end"문과 함께 추가 선을 추가해야 모든 어셈블러가 소스를 읽었 음을 어셈블러에 알릴 수 있습니다. 이것은 소스 파일의 마지막 중괄호에 줄 바꿈이없는 경우 오류를 던지는 많은 C 컴파일러와 매우 비슷합니다.