Definición
Lenguaje de programación de bajo nivelpara los computadores, microprocesadores, microcontroladores y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar unaarquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador.

Lenguaje de máquina
Un lenguaje de máquina es aquel con el que trabaja el microprocesador; para reaccionar y efectuar la operación que se desea, necesita de una secuencia de señales eléctricas almacenadas como "unos" y "ceros" en las posiciones de la memoria. Una y solo una secuencia de señales concreta, realiza una determinada operación. Identificaremos a partir de ahora la existencia de señal con un "1" y la ausencia con un "0".
El Spectrum trabaja con el microprocesador Z-80 cuyo funcionamiento se explicará en el capítulo 3 de este curso. El Z-80 es un microprocesador un tanto complejo, de forma que para introducirnos en el estudio del código máquina vamos a idear un microprocesador umaginario con un funcionamiento extremadamente simplificado.
Supongamos un microprocesador que tiene un registro de índice "I" y uno aritmético "A", a los que identifica como "01" y "10" respectivamente.
Un registro en un microprocesador es un campo interno modificable; denominamos campo a un lugar donde se almacenan datos; de esto forma, un registro es algo similar a una posición de memoria pero interno al microprocesador, su función es parecida a la de las variables en el BASIC.
También dispone del siguiente repertorio de instrucciones, cada una de las cuales tiene asignado un código de operación:
|
|||||||||||||||||||
Suponemos que el ordenador en el que está incorporado utiliza posiciones de memoria de 10 bits (el Spectrum las utiliza de 8). Nuestro microprocesador trabaja con un formato fijo para entender la secuencia de señales tal que:
-- Los tres primeros bits son el identificativo o código de la operación que se quiere realizar.
-- Los dos siguientes son el identificativo del registro sobre el que se opera.
-- Los cinco siguientes y últimos indican la posición de memoria, si procede, que va desde 00000 a 11111.
El formato de instrucción quedaría como se muestra en la FIGURA 1 y las instrucciones serían las siguientes:
CARGAR REGISTRO:
Definición: Carga el registro indicado con el contenido de la posición de memoria.
Formato:
ALMACENAR REGISTRO:
Definición: Almacena el contenido del registro indicado en la posición de memoria.
Formato:
SUMAR EN REGISTRO ARITMÉTICO:
Definición: Suma en el registro aritmético el contenido de la posición de memoria que resulta de sumar la posición de memoria indicada en la instrucción con el contenido del registro índice si está indicado
Formato:
RESTAR EN REGISTRO ARITMÉTICO:
Definición: Resta en el registro aritmético el contenido de la posición de memoria que resulta de sumar la posición de memoria indicada en la instrucción con el contenido del registro índice si está indicado
Formato:
SALTAR POR CONTENIDO CERO:
Definición: Salta a la posición de memoria indicada si el valor del registro señalado es cero
Formato:
SALTAR POR CONTENIDO NO CERO:
Definición: Salta a la posición de memoria indicada si el valor del registro señalado es distinto de cero
Formato:
DECREMENTAR EL REGISTRO ÍNDICE:
Definición: Resta uno al valor del registro índice
Formato:
Definido ya este microprocesador con la única intención de hacer más comprensibles los conceptos que se pretenden adquirir vamos, siguiendo la misma línea, a dar solución a un supuesto problema.
Se quiere sumar el contenido de las diez posiciones de memoria a partir de la posición 10110. Si todos los valores son cero o el resultado es 11111, almacenaremos 11111 en la posición 00000; si no, ponemos el resultado en la posición 00001.
Para irnos acostumbrando a trabajar con métodos de programación empezaremos por hacer el organigrama. Es interesante intentar hacerlo en un papel aparte y luego comprobar resultados. No tiene porqué ser exactamente igual; cualquier organigrama es válido siempre que funcione. Un posible organigrama está representado en la FIGURA 2.
Basándonos en los códigos definidos anteriormente, iremos definendo las posiciones de memoria.
Campos:
|
El programa lo cargaremos a partir de la posición de memoria 01000.
Instrucciones:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
La memoria quedaría configurada de la siguiente manera:
Memoria:
|
Como se puede ver, esto supone un trabajo tremendo, y la facilidad de cometer errores es evidente. Siguiendo nuestro desarrollo de microprocesador simulado, tenemos que buscar una manera de facilitar el trabajo, para lo cual vamos a hacer corresponder a cada instrucción con una secuencia de letras que nos sirva para recordarla y nos de una idea de la operación que debe realizar. A esto se le denominarepresentación simbólica o código nemotécnico.
|
||||||||||||||||||||||||||||||||||||||||||||||
Se verá que es más fácil recordar el código nemotécnico o simbólico que los números de código máquina.
Sigamos simplificando, cuando nos refiramos a los registros en lugar de llamarlos 01 y 10 llamaremos al registro índice "I" y al registro aritmético "A".
|
Por último, cada vez que nos refiramos a una posición de memoria en lugar de recordar el valor numérico de su dirección, le daremos un nombre o literal, este literal tiene el valor de la dirección que representa y se le conoce con el nombre genérico de etiqueta.
Entonces diremos que la representación simbólica de una instrucción es la siguiente:
|
Codificación del supuesto en lenguaje simbólico:
Campos:
|
Cuando ponemos el número entre paréntesis indicamos el contenido del campo, y cuando se pone el signo "=" nos referimos al valor que tiene el literal. Cualquier simbólico tiene que diferenciar entre dirección y contenido.
Instrucciones:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
¿Qué se ha hecho?
