Codificar en lenguaje ensamblador CISC códigos realizados en C
En este dos ejemplos vamos a codificar en lenguaje ensamblador CISC la siguiente estructura hecha en C.
Suponemos que tenemos una matriz de 8 filas y 20 números enteros por fila, y queremos poner a 0 el elemento número 20 de cada fila.
El código en C, sería así:
i = 0;
do {
Matriz[i][20]=0;
i = i+1;
}
while (i<8);
Y en lenguaje ensamblador CISC esta sería la solución:
PUSH R1
MOV R1, 80
DO:
MOV [Matz + R1], 0
ADD R1, 80
CMP R1, 720 ; (640+80 iniciales)
JL DO
POP R1
Descripción del código ensamblador:
PUSH R1
Guardamos el valor de R1 para que cuando acabe el subprograma devolvamos a R1 el valor que tenía antes de entrar en el subprograma.
MOV R1, 80
Le damos a R1 el valor en el que se va a encontrar el primer elemento dentro de la matriz Matz.
Si queremos acceder al elemento 0 de la matriz R1 sería 0, el elemento 1 R1 sería 4 pues 4 son los bytes que ocupa un número entero.
Entonces como queremos acceder a la columna 20 de la matriz R1 será igual a 20 x 4 bytes de cada elemento = 80 bytes.
Con esto podemos saber que cada fila de la matriz ocupará en memoria 80 bytes.
MOV [Matz + R1], 0
Nos ponemos en el primer elemento y le asignamos un 0.
ADD R1, 80
Si cada fila son 80 bytes, podemos ir al siguiente elemento que se encuentra 80 bytes más adelante, por eso sumamos 80 a R1.
CMP R1, 640
Cómo el total de filas que queremos cambiar son 8, puesto que empezamos en la fila 0 y cambiaremos los valores hasta la fila 7 (8 filas en total),
Multiplicaremos el valor de cada fila 80 bytes por el número de filas que queremos remplazar que son 8, esto nos da 640.
JL DO
Después de la comparación valoramos si ha sido menor de 720 (640+80 iniciales) seguiremos realizando el bucle, sino finalizará el subprograma.
POP R1
Devolvemos a R1 el valor que tenía antes.
Ahora realizaremos un segundo ejemplo solo que esta vez la matriz será de 100 columnas. Por consiguiente, la matriz tendrá 8 filas por 100 columnas de números enteros.
El código en C, sería igual que el anterior solo que el número de columnas cuando se declare la matriz será mayor:
i = 0;
do {
Matriz[i][20]=0;
i = i+1;
}
while (i<8);
Y esta sería la solución en lenguaje ensamblador CISC:
PUSH R1
MOV R1, 80
DO:
MOV [Matz + R1], 0
ADD R1, 400 ; ahora la fila es de 100 elementos (100*4)
CMP R1, 3280 ; 8 f. * 400 bytes fila= 3200+80 iniciales
JL DO
POP R1
El desarrollo del código sigue el mismo procedimiento que el anterior.