En las entradas anteriores se ha descrito el hardware del C64 (microprocesador, memoria ROM, memoria RAM y dispositivos de E/S) y el mapa de memoria más habitual. Se ha comentado, también, que en la memoria RAM se almacenan programas y datos de usuario, y en la memoria ROM se almacenan programas y datos del sistema.
Entonces… ¿en qué consiste exactamente un programa en ensamblador? ¿Y un programa en código máquina?
Un programa, en términos generales, es una secuencia de instrucciones que opera sobre unos datos para conseguir un objetivo. Cuando ese programa está en su formato original, o fuente, entonces se dice que es un programa en ensamblador (si es que está escrito en lenguaje ensamblador, claro). La apariencia que tiene un programa en ensamblador es la que se vio en la entrada “Un primer programa en ensamblador para el Commodore 64”. Es decir, se trata de una secuencia de instrucciones, o nemónicos, que operan sobre unos operandos (valores, posiciones de memoria, etc.).
El programa fuente se ensambla mediante una aplicación llamada “ensamblador” (ej. CBM prg Studio o Kick Assembler), y entonces se convierte en un programa en código máquina. Es un proceso similar a la compilación de los lenguajes de alto nivel. El código máquina también es un programa, pero tiene otra forma: una secuencia de bytes almacenados en memoria (o en un fichero).
En definitiva, son las dos caras de la misma moneda. Cuando el programa está en su formato fuente, que es de fácil comprensión para el programador, se habla de “ensamblador”. Y cuando ya se ha ensamblado y es una secuencia de bytes en memoria se habla de “código máquina” o «lenguaje máquina».
El código máquina es el lenguaje que entiende de forma nativa el microprocesador y lo que puede ejecutar. Para ejecutar el código máquina, el microprocesador va leyendo el programa desde la memoria y va ejecutando sus instrucciones (bytes en memoria). Las instrucciones operan sobre datos, que son otros bytes en memoria.
El proceso de ensamblado traduce el programa en ensamblador (uno o varios ficheros *.asm) en el código máquina (una secuencia de bytes en memoria o fichero). En el caso particular del microprocesador 6510, toda instrucción ocupa 1, 2 o un máximo de 3 bytes en memoria.
El juego de instrucciones completo del microprocesador 6510 se puede consultar aquí.
Dada una instrucción, por ejemplo “lda”, es importante notar que tiene diferentes “modos de direccionamiento”. Los modos de direccionamiento son las formas de acceder a los operandos o datos. Y, para cada modo de direccionamiento:
- La instrucción tiene una sintaxis diferente.
- Se traduce a un byte diferente ($A9, $A5, $B5, …). Estos bytes se llaman “opcodes”.
- Tiene un tamaño diferente (1, 2 o 3 bytes). Este tamaño incluye los operandos.
- Tarda en ejecutarse más o menos ciclos de reloj.
Lógicamente el microprocesador tarda algunos ciclos de reloj en leer la instrucción y sus operandos. Y también tarda otros ciclos de reloj en ejecutar la instrucción. El reloj del C64 funciona a 1 MHz aproximadamente, es decir, tiene un millón de ciclos en un segundo.
Por lo cual, se puede deducir/resumir; asm está compuesto por mnemónicos… y el CM está compuesto por opcodes.
No es así?
Me gustaMe gusta
Hola.
Exacto. Son las dos caras de la misma moneda.
Lo primero, una aclaración: En español llamamos «ensamblador» tanto al lenguaje como a la aplicación en la que se programa. En inglés no existe esta ambigüedad porque el lenguaje se llama «assembly» y la aplicación «assembler».
Mientras el programador programa, el código que va generando (unos ficheros de texto) se dice que están en «ensamblador». El programador utiliza nemónicos, etiquetas para direcciones de memorias, variables, etc.
Cuando el programador ha terminado de programar ejecuta el proceso de ensamblado. Por ejemplo, en el caso de CBM prg Studio es con Ctrl + F5. Mediante este proceso, el ensamblador (la aplicación) ensambla el código y genera el código máquina, que es el resultado del proceso. Es un proceso parecido al de la compilación de un lenguaje de alto nivel.
El código máquina básicamente son bytes de instrucciones y datos. Se graban en un fichero (ej. en formato PRG) y se carga en memoria y ejecuta cuando interesa.
Espero que ahora esté más claro.
Un saludo.
Me gustaMe gusta