De lenguaje Ensamblador a lenguaje Máquina
Después de escribir los otros tutoriales acerca del lenguaje ensamblador en CISC vamos a realizar un tutorial de cómo traduciríamos el lenguaje Ensamblador al lenguaje Máquina.
El lenguaje Máquina es el código que puede ser interpretado directamente por el microprocesador, como ya sabéis todos los lenguajes de programación antes de ser interpretados por el microprocesador son traducidos a lenguaje Máquina.
Para traducir del lenguaje Ensamblador a lenguaje Máquina primero tenemos que tener el código Ensamblador que queremos traducir, que serán estas tres líneas:
MUL R3, [X+R5]
SUB R5, 4
MOV [M], R3
Los valores que utilizaremos serán los siguientes, primeramente el valor del PC es 00002027, por lo tanto las instrucciones se empezarán a codificar a partir de este punto. La dirección de memoria que apunta la variable X será 00000004 y la dirección de memoria que apunta la variable M será 00000008.
Ahora codificaremos el código anterior siguiendo la forma de codificar instrucción, codificar primer operando y codificar segundo operando.
Las instrucciones se codificarán por los valores que les preceden en la tabla:
Operaciones | 27h NEG | |
00h NOP | 20h ADD | Funciones Lógicas |
01h STI | 21h SUB | 30h AND |
02h CLI | 22h MUL | 31h OR |
Movimiento de datos | 23h DIV | 32h XOR |
10h MOV | 24h INC | 33h TEST |
11h PUSH | 25h DEC | 34h NOT |
12h POP | 26h CMP | 27h NEG |
35h SAL | Saltos en la ejecución |
36h SAR | 40h JMP |
41h JE | |
42h JNE | |
43h JL | |
44h JLE | |
45h JG | |
46h JGE |
Y dependiendo del direccionamiento que utilicen los operandos se codificarán de la siguiente manera:
Tipo de direccionamiento |
0h Inmediato |
1h Registro |
2h Memoria |
3h Indirecto |
4h Relativo |
5h Indexado |
6h PC |
Comenzamos codificando la primera instrucción
MUL R3, [X+R5]
Para esto ponemos en @ la dirección que está apuntando PC, después codificamos la instrucción MUL, buscamos el código (22h MUL) y traducimos en la primera celda de la tabla.
@Dir |
Ensamblador |
Código Máquina |
|||||||
00002027 | MUL R3, [X+R5] | 22 | |||||||
|
Bytes |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Después codificamos el primer operador que tenemos, que en este caso es R3, así que asignaremos a la segunda celda el tipo de direccionamiento y el número de registro 1 3.
@Dir |
Ensamblador |
Código Máquina |
|||||||
00002027 | MUL R3, [X+R5] | 22 | 13 | ||||||
|
Bytes |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Para finalizar la instrucción ponemos el segundo operando en la tabla, que como tipo de direccionamiento utiliza el indexado, es decir una dirección de memoria más un desplazamiento, que en este caso se codificaría con el tipo “5” más el identificador del registro que es el “5” también.
Le añadimos la dirección a la que apunta la variable X, que es 00000004 y lo asignaremos de izquierda a derecha en grupos de dos, de esta forma asignaremos los bits de menor peso al número más pequeño y los de mayor peso al número más grande en la codificación.
Quedaría así:
@Dir |
Ensamblador |
Código Máquina |
|||||||
00002027h | MUL R3, [X+R5] | 22 | 13 | 55 | 04 | 00 | 00 | 00 | |
|
Bytes |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Realizamos la suma de los bytes que hemos utilizado e incrementamos la posición de memoria que apunta PC, que en este caso son 7, por lo que la PC ahora tendrá el valor de 00002027h+07h= 0000202Eh.
@Dir |
Ensamblador |
Código Máquina |
|||||||
00002027h | MUL R3, [X+R5] | 22 | 13 | 55 | 04 | 00 | 00 | 00 | |
0000202Eh | |||||||||
|
Bytes |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Ahora realizamos de nuevo los mismos pasos con las otras instrucciones y finalmente la tabla quedaría así:
@Dir |
Ensamblador |
Código Máquina |
|||||||
00002027h | MUL R3, [X+R5] | 22 | 13 | 55 | 04 | 00 | 00 | 00 | |
0000202Eh | SUB R5, 4 | 21 | 15 | 00 | 04 | 00 | 00 | 00 | |
00002036h | MOV [M], R3 | 10 | 20 | 08 | 00 | 00 | 00 | 13 | |
0000203Ch | |||||||||
|
Bytes |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Después de este proceso, finalmente habremos conseguido traducir estas tres lineas de lenguaje Ensamblador a lenguaje Máquina para la arquitectura CISC.