Ensamblador
Publicado por Alfonso (1 intervención) el 11/12/2008 00:12:34
Hola, estoy atascado con un punto de mi programa (un buscaminas en ensamblador). Llevo varias semanas con este tema pero no soy capaz de averiguar que estoy haciendo mal.
Os cuento lo que me pasa:
Una de las rutinas que tengo creadas es esta:
UpdateBoard:
push ax
push cx
push si
push BX
mov dh,03 ;fila inicial
mov dl,22 ;columna inicial
mov cx,1 ;número de caracteres a escribir
mov bh,00h ;página
mov bl,07h ;atributo
mov si,0 ;índice para acceder a los datos.
LoopUB:
mov ah,02h ;servicio para posicionar el cursor
int BIOSSERVICE
pop BX
mov al,[BX][SI] ;carácter de la matriz que estamos mostrando
push BX
mov bh,00h ;página
mov bl,07h ;atributo
mov ah,09h ;servicio para escribir carácter.
int BIOSSERVICE
inc si
add dl,2
cmp dl, 38
jle LoopUB
mov dl, 22
add dh,2 ; fila
cmp dh,19
jle LoopUB
lea dx,NumMines
push dx
call ShowDigits
add sp,2
pop BX
pop si
pop cx
pop ax
ret
Esta parte final llama a otra rutina llamada ShowDigits y quiero pasar por la pila el valor de NumMines ya que ese valor también lo varian otras rutinas (por ejemplo para calcular el número de minas de las casillas de alrededor).
La rutina showdigits es:
ShowDigits:
push bp
mov bp,sp
push ax
push bx
push cx
push dx
cmp NumMines,0
jne minasactual
call MineCounter
jmp minasinicio
minasinicio:
mov dh,21
mov dl,21
mov bh,00h
mov ah,02h
int BIOSSERVICE
mov ax,NumMines
jmp imprimir
minasactual:
mov dh,21
mov dl,21
mov bh,00h ;página
mov ah,02h ;servicio para posicionar el cursor
int BIOSSERVICE
lea ax,[bp+4]
imprimir:
mov bl,10
div bl
add ah,'0'
add al,'0'
mov di, ax
mov bl,07h ;atributo de color: fondo negro y color blanco
mov ax,di
mov bh,00h
mov cx,1
mov ah,09h
int BIOSSERVICE
add dl,1
mov bh,00h
mov ah,02h
int BIOSSERVICE
mov ax,di
mov al,ah
mov bh,00h
mov cx,1
mov ah,09h
int BIOSSERVICE
pop dx
pop cx
pop bx
pop ax
pop bp
ret
Lo que quiero conseguir es poder escribir en pantalla (en ascii) el valor que tiene NumMines en la rutina anterior (updateboard). Alguien puede decirme que estoy haciendo mal? En lugar de salirme el número correcto (17, 16, etc...) me salen caraceteres raros....
Muchisimas gracias, estoy totalmente desesperado.
Os cuento lo que me pasa:
Una de las rutinas que tengo creadas es esta:
UpdateBoard:
push ax
push cx
push si
push BX
mov dh,03 ;fila inicial
mov dl,22 ;columna inicial
mov cx,1 ;número de caracteres a escribir
mov bh,00h ;página
mov bl,07h ;atributo
mov si,0 ;índice para acceder a los datos.
LoopUB:
mov ah,02h ;servicio para posicionar el cursor
int BIOSSERVICE
pop BX
mov al,[BX][SI] ;carácter de la matriz que estamos mostrando
push BX
mov bh,00h ;página
mov bl,07h ;atributo
mov ah,09h ;servicio para escribir carácter.
int BIOSSERVICE
inc si
add dl,2
cmp dl, 38
jle LoopUB
mov dl, 22
add dh,2 ; fila
cmp dh,19
jle LoopUB
lea dx,NumMines
push dx
call ShowDigits
add sp,2
pop BX
pop si
pop cx
pop ax
ret
Esta parte final llama a otra rutina llamada ShowDigits y quiero pasar por la pila el valor de NumMines ya que ese valor también lo varian otras rutinas (por ejemplo para calcular el número de minas de las casillas de alrededor).
La rutina showdigits es:
ShowDigits:
push bp
mov bp,sp
push ax
push bx
push cx
push dx
cmp NumMines,0
jne minasactual
call MineCounter
jmp minasinicio
minasinicio:
mov dh,21
mov dl,21
mov bh,00h
mov ah,02h
int BIOSSERVICE
mov ax,NumMines
jmp imprimir
minasactual:
mov dh,21
mov dl,21
mov bh,00h ;página
mov ah,02h ;servicio para posicionar el cursor
int BIOSSERVICE
lea ax,[bp+4]
imprimir:
mov bl,10
div bl
add ah,'0'
add al,'0'
mov di, ax
mov bl,07h ;atributo de color: fondo negro y color blanco
mov ax,di
mov bh,00h
mov cx,1
mov ah,09h
int BIOSSERVICE
add dl,1
mov bh,00h
mov ah,02h
int BIOSSERVICE
mov ax,di
mov al,ah
mov bh,00h
mov cx,1
mov ah,09h
int BIOSSERVICE
pop dx
pop cx
pop bx
pop ax
pop bp
ret
Lo que quiero conseguir es poder escribir en pantalla (en ascii) el valor que tiene NumMines en la rutina anterior (updateboard). Alguien puede decirme que estoy haciendo mal? En lugar de salirme el número correcto (17, 16, etc...) me salen caraceteres raros....
Muchisimas gracias, estoy totalmente desesperado.
Valora esta pregunta
0