Categorías
Programación

Debugeando o depurar ensamblador

Para depurar el código necesitamos bajarnos la aplicación openMSX debugger, pincha aquí, también puedes bajártela de su página web  una vez:

Una vez descomprimida como es un ejecutable, hacemos doble click openmsx-debugger.exe:

Una vez abierta, demos de tener el openMSX abierto, pero antes copia y pega este código en visual studio code en en archivo por ejemplo “b.asm” y este archivo mételo dentro de una carpeta por ejemplo asm, leyéndolo sabrás que es lo que hace:

  output "b.bin"   ; debemos de poner esta instrucción o nos generaría un archivo.out, ponle espacios al principio
        
    db   0FEh               ; ID archivo binario, siempre hay que poner el mismo 0FEh
    dw   INICIO             ; dirección de inicio
    dw   FINAL - 1          ; dirección final
    dw   INICIO             ; dircción del programa de ejecución (para cuando pongas r en bload"nombre_programa", r)

    org #8200               ; org se utiliza para decirle al z80 en que posición de memoria empieza nuestro programa (es la 33280 en decimal), en hezadecimal sería 08200h

  
INICIO:
    ld hl,variable ;leemos en hl el comienxo de la dirección de memoria que almacna nuestra variable    
    call leer_string ;llamamos a la rutina leer_string
    ret ;devolvemos el control al basic
 
leer_string:
    ld a,(hl) ;alamcenamos en a el 1 byte que será "E"
    cp 0; si el caracter es 0 pondrá la la bandera z a 1 del registro z del z80 y saldrá con ret z
    ret z
    call #00A2 ;rutina bios que muestra en pantalla el caracter ascii almacenado en el registro a
    inc hl ;si no es cero llamaremos de nuevo a leer_string con jp
    jr leer_string ;volverá a llamar a la rutina



;cONSTANTES
;texto_el_valor_es: db "El valor de mi variable es: ",0
variable:  db "Esto es una prueba",0	; Crea una dirección en la memoria con la etiqueta mensaje, el cero indica el fin del texto  

FINAL:


Compílalo para generar el punto .bin:

Abre el catapult y pincha en el botón Dis A y elige Browse for disk folder y presiona Start, una vez abierto el openMSX pincha en el botón connect del debugger:

Como sabemos que nuestro código empieza en el registro #8200 (hexadecimal) de la RAM hacemos hacemos click en ese punto para crear un breakpoint (punto de ruptura), para eso tendremos que bajar por lo registros hasta encontrar el 8200

Ahora ejecutamos el programa y veremos que la memoria RAM se llena de nuestras instrucciones, si no te deja hacer nada presiona el botón Run para que te devuelva el control :

Si está el botón break en rojo puedes ir instrucción por instrucción viendo si corresponde con tu código, para eso tendrás que presionar Step into, step back para volver:

Fijate que las rutinas de la bios llegan hasta el registro 8000, fijate también en la zona donde aparecen los registros del z80 y donde aparecen los flags o banderas del registro f del z80:

En la 1 intrucción o paso llegamos a la variable que tiene la referencia de nuestro mensaje y lo almacena en hl que es #8211, es decir nuestro texto estará escrito en los registros 8211 en adelante, 8211 tiene 45 que en decimal es 69 que en la tabla ASCII es la E mayúscula, 8212 tiene 73 que en decimal es 115 que en la tabla ASCII es la s minúscula y así:

En la siguiente instrucción llamamos al método leer_string que está en el registro #8207 y salatá a el:

3 clicks en step into llegarás a la instrucción call que es la llamada a una rutina de la bios , otro click en step to into y te meterás en la ruina de la bios, para salir de ella pincha en el botón step out:

Si te lias mucho siempre puedes pinchar en Run volver a openMSX y subir con los cursores del teclado hasta que se situe el cursor en bload y volver a pulsar intro, el debugger volverá al principio:

Como nota diré que la información que el compilador sjasm en su fichero .lst es muy interesante, en esta se detallan las posiciones o registros de memoria, fijate como nuestra variable mensaje va de los registros #8211 a la #8221:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *