装配8086程序 - 装配错误

时间:2009-07-16 01:51:32

标签: assembly

尝试汇编以下程序时可能导致错误******Fatal** C:\TASM\emu8086\M3\M3.asm(243) Unexpected end of file encountered****的原因。第243行是该计划的最后一个,但我无法弄清楚出了什么问题。

.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

该程序用于家庭作业,应该是蛇游戏。评论是葡萄牙语。

3 个答案:

答案 0 :(得分:3)

也许你没有把它保存为纯文本。确保它不是Word格式甚至是Unicode。

答案 1 :(得分:3)

你需要在“end”语句中添加一个额外的行来告诉汇编程序它已经读取了所有的源代码。这很像许多C编译器,如果源文件中的最后一个大括号后面没有换行符,则会抛出错误。

答案 2 :(得分:1)

当您收到错误消息时,通常可以通过Google搜索找到确切消息文本的解决方法,例如:http://www.google.ca/search?hl=en&q=tasm+%22Unexpected+end+of+file+encountered%22

很可能以前有人曾经问过这个问题。

在您的情况下,如果它不是Unicode问题,则可能需要某种end语句。