Ensamblador - Ayuda con programa de assembler

 
Vista:

Ayuda con programa de assembler

Publicado por Amrod (3 intervenciones) el 27/11/2005 18:41:41
Hola,
En la uni m han mandado hacer un programa de ensamblador en el que se tiene q hacer lo siguiente:

-Grabar la pantalla actual
- ha de funcionar con las RAIS de teclado y reloj
- Mientras no se pulse ESC debe seguir funcionando
- Si se pulsa la c se crea una pelota '*' que se movera por la pantalla e ira rebotando con los bordes de la pantalla.
- Se puede crear hasta 5 pelotas.
- con la d se destruyem pelotas
- con la r se acelerara el movimiento
- con la i de decrementara el movimiento
- finalmente volvemos a restaurar la pantalla

Tengo casi todo el codigo, ya que nos dan la estructura y lo he hecho practicamente todo.
Pero cuando lo ejecuto m da error y no se exactamente por que, ya que si lo ejecuto por el debugger parece q funciona. Creo q el problema esta en el display de la pelota.

Si alguien m puede ayudar a buscar el error estaria muy agradecido..

Aqui os pongo el codigo... (los comentarios estan en catalan, lo siento...XD)
PONGO EL CODIGO EN VARIOS POSTS QUE NO CABE..

.model small
.stack 1024

VECT_T EQU 09h ;vector del teclat
VECT_R EQU 08h ;vector del rellotge
SEGPANTALLA EQU 0B800H ;adre‡a mem•ria video

MIN_RETARD EQU 8 ;n§ de tics m¡nim de retard

BYTES_PILOTA EQU 6 ;n§ de bytes ocupats per cada estructura PILOTA
MAX_PILOTES EQU 5

MAX_COLUMNA EQU 60
MIN_COLUMNA EQU 20
MIN_FILA EQU 5
MAX_FILA EQU 20

.data
; x,dx,y,dy,car…cter,color
pilotes db BYTES_PILOTA * MAX_PILOTES dup(0)
nPILOTA db 0 ;PILOTA m…xima creada( 0<= nPILOTA <)maxPILOTES)
iPILOTA db 0 ;PILOTA actual (0<=iPILOTA<nPILOTA)
fonsPilotes dw MAX_PILOTES dup(0) ;array per guardar els fons de les
; pilotes

Tecla db 0 ;car…cter de la tecla
ticksretard db 16 ;ticks de retard entre PILOTES
Ticks db 0 ;n§ de interrupcions produides pel rellotge
sortir db 0
Endavant db 0

BufferP dw 2000 dup(?) ;buffer per a guardar la pantalla

Trad db 0,1,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,'qwertyuiop'
db 0,0,0,0,'asdfghjkl'
db 0,0,0,0,0,'zxcvbnm'
db 0,0,0,0,0,0,0

RAI_R_Seg dw ? ;adre‡a de segment de la RAI de rellotge original
RAI_R_Dir dw ? ;adre‡a dins el segment de la RAI de rellotge original
RAI_T_Seg dw ? ;adre‡a de segment de la RAI de teclat original
RAI_T_Dir dw ? ;adre‡a dins el segment de la RAI de teclat original

Llavor1 dw ?
Llavor2 dw ?
Llavor3 dw ?
Llavor4 dw ?

rndX db ?
rndY db ?
rndDX db ?
rndDY db ?
rndColor db ?

tmp dw ?
ValorTmpX db ?
ValorTmpY db ?


.code

;********************************************************
;SalvaPantalla()
;
;Sense par…metres.
;Salva el contingut de tota la pantalla dins la variable
;
;********************************************************
SalvaPantalla : ;inirutina

push si
push ax
push cx
mov si, 0
mov cx, 2000
bucleSP:
mov ax, es:[si]
mov [BufferP+si], ax
add si, 2
loop bucleSP
pop cx
pop ax
pop si
ret
;firutina


;*********************************************************
;RestauraPantalla()
;
;Sense par…mertes.
;Restaura BufferP en las posiciones originales de pantalla.
;
;*********************************************************
RestauraPantalla : ;inirutina


;
;Escriure el codi

push si
push ax
push cx
mov si, 0
mov cx, 2000
bucleEP:
mov ax, [BufferP+si] ;Passem a ax el q tenim al bufferP
mov es:[si], ax ;Posem a pantalla el caracter de ax
add si, 2
loop bucleSP
pop cx
pop ax
pop si
ret
;firutina


;

ret
;firutina

;*********************************************************
;iniPILOTA
;
;Inicialitza amb nous valors la PILOTA que indica
;la variable global "nPILOTA"
;
;*********************************************************
iniPILOTA : ;inirutina

;
;Escriure el codi

call Rand
mov ah, 0
mov al, nPILOTA
mov [tmp], BYTES_PILOTA
imul [tmp] ;multipliquem el contador per els bytes d'una
mov si, ax ;pilota i ho posem a si
mov al, [rndX]
mov [pilotes+si], al
mov al, [rndY]
mov [pilotes+si+1], al
mov al, [rndDX]
mov [pilotes+si+2], al
mov al, [rndDY]
mov [pilotes+si+3], al
mov [pilotes+si+4], '*'
mov al, [rndColor]
mov [pilotes+si+5], al
add nPILOTA, 1 ;sumem 1 al contador de pilotes

;

ret
;firutina


;*********************************************************
;mourePILOTA
;
;Actualitza les cooredenades (x,y) de la PILOTA que indica
;la variable "iPILOTA" segons la seva direcci¢ (dx,dy)
;*********************************************************
mourePILOTA : ;inirutina

;
;Escriure el codi
mov ah, 0
mov al, [iPILOTA]
mov [tmp], BYTES_PILOTA
imul [tmp] ;multipliquem el contador per els bytes d'una
sub ax, BYTES_PILOTA
mov si, ax ;pilota i ho posem a si

mov ah, 0
mov al, MAX_COLUMNA
cmp [pilotes+si], al ;mirem si la pilota esta al limit
jge cambiaDireccionX
mov ah, 0
mov al, MIN_COLUMNA
cmp [pilotes+si], al
jle cambiaDireccionX
jmp NocambiaDireccionX
CambiaDireccionX:
mov al, [pilotes+si+2]
mov [tmp], -1
imul [tmp]
mov [pilotes+si+2], al

NocambiaDireccionX:
mov al, [pilotes+si+2] ;posem a ax dx
add [pilotes+si], al ; sumem a x el valor de dx (si es -1 es restara)
jmp comparaFila


comparaFila:
mov bh, 0
mov bl, MAX_FILA
cmp [pilotes+si+1], bl
jge NocambiaDireccionY
mov bh, 0
mov bl, MIN_FILA
cmp [pilotes+si+1], bl
jle cambiaDireccionY
jmp NocambiaDireccionY
CambiaDireccionY:
mov bl, [pilotes+si+3]
mov [tmp], -1
imul [tmp]
mov [pilotes+si+3], bl

NocambiaDireccionY:
mov bh, 0
mov bl, [pilotes+si+3] ;fem el mateix amb dy
add [pilotes+si+1], al

mov ah, 0
mov bh, 0
mov al, [pilotes+si] ;posem a ax l'actual valor de x
mov bl, [pilotes+si+1] ; a bx posem el valor de y
push ax ;ho posem a la pila
push bx
call obtenirDesplacament ;cridem a la rutina per obtenir el valor
; del despla‡ament

;

ret
;firutina
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con programa de assembler

Publicado por Amrod (3 intervenciones) el 27/11/2005 18:43:35
;*********************************************************
;obtenirDespla‡ament
;
;rep per la pila la posici¢ x,y de la qual ha de
;calcular el despla‡ament, tenint en conta la
;f•rmula: despla‡ament de x,y=b800+(x-1)*160+(y-1)*2
;deixant el resultat tamb‚ a la pila
;*********************************************************
obtenirDesplacament : ;inirutina

;
;Escriure el codi
pop cx
pop bx ;recullim de la pila els valors de x i y
pop ax

mov [ValorTmpX], al
mov [ValorTmpY], bl

sub [ValorTmpX], 1
mov al, [ValorTmpX] ;Calculem (x-1)*2
mov [tmp], 2
imul [tmp]
mov [ValorTmpX], al

sub [ValorTmpY], 1
mov al, [ValorTmpY] ;Calculem (y-1)*160
mov [tmp], 160
imul [tmp]
mov [ValorTmpY], al

mov al, [ValorTmpX]
add al, [ValorTmpY] ;sumem les dues parts
mov [tmp], ax

;ens posicionem en aquesta posici¢
mov di, [tmp]

;

ret 2
;firutina

;*********************************************************
;esborraPILOTA
;
;Per a esborrar la PILOTA, reescriure el background" original
;a la posici¢ (x,y). El background original s'obte de BufferP
;El n§ de PILOTA a esborrar ho rep per la pila
;*********************************************************
esborraPILOTA: ;inirutina

;
;Escriure el codi

mov al, iPILOTA ;ens posicionem al array de fons a la
mov si, ax ;posicio que toca
mov ax, [fonsPilotes+si]
mov es:[di], ax

;

ret
;firutina

;*********************************************************
;dibuixarPILOTA
;
;Dibuixa el car…cter de la PILOTA a la seva posici¢ (x,y).
;La PIOTA a tractar est… definida a la variable iPILOTA
;*********************************************************
dibuixarPILOTA : ;inirutina

;
;Escriure el codi

mov al, iPILOTA ;ens posicionem al array de fons a la
mov si, ax ;posicio que toca
mov ax, es:[di]
mov [fonsPilotes+si], ax ;gravem a l'array el fons de pantalla
mov al, [pilotes+si+4]
mov ah, [pilotes+si+5]
mov es:[di], ax ;imprimim a la pantalla la pilota

;

ret
;firutina

;*********************************************************
;seguentPILOTA
;
;Avancem circularment el n§ de PILOTA a tractar (iPILOTA)
;0<= iPILOTA < nPILOTA
;*********************************************************
seguentPILOTA : ;inirutina

;
;Escriure el codi

; mov al, nPILOTA
; cmp iPILOTA, al
; jl sumarPILOTA
; mov IPILOTA, 0

;sumarPILOTA:
add IPILOTA, 1
jmp finSeguentPilota

finSeguentPilota:
;

ret
;firutina

;*********************************************************
;Llavor
;Funci¢ per generar n§ aleatoris. S'ha de executar un sol cop abans
; de Rand
;*********************************************************
Llavor:

push ax
push bx
push cx
push dx
mov ah, 02h
int 01Ah
mov ax, dx
mov bx, cx
mov [Llavor1], ax
xchg al, ah
sbb ah, al
adc ax, ax
ror bx, cl
mov [Llavor2], ax
ror ax, cl
mov [Llavor3], ax
mov cx, ds
adc cx, bx
adc ax, bx
xchg ah, bl
xchg al, ah
mov [Llavor4], ax
pop dx
pop cx
pop bx
pop ax

ret

;*******************************************************
;
;Rand
; Genera valors per a les variables ale…tories (rnd...)
;*******************************************************
Rand:
push ax
push bx
push cx
push dx

mov ax, [Llavor1]
mov bx, [Llavor2]
mov cx, [Llavor3]
mov dx, [Llavor4]

add ax, bx
xchg cl, ch
sbb dx, ax
adc cl, al
adc ah, bl
adc ax, dx
ror dx, cl
rol ax, cl
adc ax, cx
xchg dl, ch
xchg dx, bx
xchg ch, al
xchg bl, dh
sbb ax, cx
adc ax, bx
mov [Llavor1], ax
mov [Llavor2], bx
mov [Llavor3], cx
mov [Llavor4], dx

mov ah, 0
mov cl, MAX_FILA-MIN_FILA
div cl
add ah, MIN_FILA
mov [rndY],ah

mov bh, 0
mov cl, MAX_COLUMNA-MIN_COLUMNA
mov ax, bx
div cl
add ah, MIN_COLUMNA
mov [rndX], ah

veure_dx:
and cx, 1
jz rndx1
mov rndDX, -1
jmp veure_dy
rndx1:
mov [rndDX], 1

veure_dy:
and dx, 1
jz rndy1
mov [rndDY], -1
jmp rndcol
rndy1:
mov rndDY, 1

rndcol:
mov bx, ax
mov cl, 15
mov ah, 0
div cl
inc ah
mov [rndColor], ah

finrnd:
pop dx
pop cx
pop bx
pop ax
ret
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con programa de assembler

Publicado por Amrod (3 intervenciones) el 27/11/2005 18:44:18
;*******************************************************
;Instalúlaci¢ de kes rutines d'atenci¢ a la interrupci¢
; sense par…metres
; instalúla els vetors de rellotge i teclat
; salva les direccions antigues dins de les variables RAI_R_DIR, RAI_R_Seg,
; RAI_T_Dir i RAI_T_Seg
;*******************************************************
instalaRAIs: ;inirutina
xor ax, ax
mov es, ax ;posem zero al registre es
mov ax, es:[32] ;salvem la rutina del rellotge i del teclat
mov RAI_R_DIR, ax
mov ax, es:[34]
mov RAI_R_Seg, ax
mov ax, es:[36] ;salvem la
mov RAI_T_Dir, ax
mov ax, es:[38] ;salvem els dos bytes restants
mov RAI_T_Seg, ax

cli
lea ax, [RAIreloj]
mov es:[32], ax
mov es:[34], cs
lea ax, [RAIteclat]
mov es:[36], ax ;posem l'adre‡a
mov es:[38], cs ;posem el segment
sti

ret
;firutina

;*******************************************************
;Desinstalúlar RAIs
; sense par…metres
; recupera els vetors de rellotge i teclat originals
;*******************************************************
desinstalaRAIs: ;inirutina

cli
mov ax, RAI_T_SEG
mov es:[38], ax
mov ax, RAI_T_DIR
mov es:[36], ax
mov ax, RAI_R_SEG
mov es:[34], ax
mov ax, RAI_R_DIR
mov es:[32], ax
sti

ret
;firutina

;-------------------------------------------------------
;RAIreloj()
;-------------------------------------------------------
RAIreloj: ;inirutina
push ax
push dx
push ds

mov ax, @DATA
mov ds, ax

;
;Escriure el codi

inc [ticks]
cmp [ticks], 150
jne FiRAIrel

mov [Ticks], 0

;

FiRAIrel:
mov al, 20h
out 20h, al

pop ds
pop dx
pop ax
iret
;firutina

;----------------------------------------------------------
;RAIteclat:
; en funci¢ de la tecla, modifiquem la variable [tecla]
; ninguna tecla v…lida: [tecla] = 0
; <ESCAPE> [tecla] = 1
; altres: [tecla]= ASCII de tecla
;----------------------------------------------------------
RAIteclat: ;inirutina
push ds
push ax

mov ax, @DATA
mov ds, ax

;
;Escriure el codi

in al, [60h]
test al, 80h
jne final2
es_mak:
cmp al, 01
jne seguim

mov [tecla], 1
jmp final2

seguim:
mov ah, 0
mov si, ax

mov dl, [trad+si]
cmp dl, -1
mov [tecla], 0
je final2

mov [tecla], dl
final2:
mov [Ticks], 0

;

finalRAIec:
mov al, 20h
out [20h], al

pop ax
pop ds
iret
;firutina

;**********************************************************
;inici
;
;Programa Principal
;
;**********************************************************
inici:
STARTUPCODE
call Llavor

mov ax, SEGPANTALLA
mov es, ax

;Inicialitcem sistema de video
;Necesari per NT/w2k/XP, no per win98ï
mov ax, 01A00h
int 010h

;
;Escriure codi

call SalvaPantalla ;primer de tot salvem la pantalla

mov nPILOTA,0 ;initcialitzem la varible npilota

call instalaRAIs ;ara instalem la RAI

iniciBucle:

cmp [tecla], 1 ;si es pitja ESC sortim del programa
je FinalPrograma

cmp [tecla], 'c' ;initciem un altre pilota si es pitja c
jne NoCreaPilota
call iniPilota
mov al, [nPilota]
mov [iPilota], al
call dibuixarPILOTA
NoCreaPilota:

cmp [tecla], 'd' ;esborrem una pilota si es pitja d
jne NoDestrueixPilota
call esborraPilota
dec [nPILOTA]
NoDestrueixPilota:

cmp [tecla], 'r' ;incrementem la velocitat si es pitja r
jne NoIncrementaVel

NoIncrementaVel:

cmp [tecla], 'i' ;decrementem la velocitat si es pitja i
jne NoDecrementaVel

NoDecrementaVel:

mov [iPILOTA], 0

perMoure:
mov al, [iPILOTA]
cmp al, [nPILOTA]
je ContinuarBucle
call seguentPILOTA
call mourePILOTA ;fem el bucle per moure les pilotes
call dibuixarPILOTA
jmp perMoure

ContinuarBucle:

mov [tecla], ' '

jmp IniciBucle

FinalPrograma:

call desinstalaRAIs ;Desinstalem la RAI

call RestauraPantalla ;per acabar tornem a posar la pantalla
;com estava al comen‡ament
;

EXITCODE 0

end inici


MUCHISIMAS GRACIAS!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar