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
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


0