9. (1 punto) Se dispone de un sistema para generar código

Anuncio
9. (1 punto) Se dispone de un sistema para generar código ensamblador directamente a
partir del árbol de derivación. El módulo de generación de código incluye las siguientes
funciones de ayuda para la generación:
int CAC (opd *x, opd *y)
{
if (AC!=NULL && AC==y) return 1;
if (AC!=x) {
if (AC!=NULL) GEN ("MOV", AC, "EAX");
GEN ("MOV", "EAX", x);
AC=x;
}
return 0;
}
NEG (opd *x, opd *z)
{
CAC (x, NULL);
GEN ("NEG", "EAX");
AC=z;
}
SUMA (opd *x, opd *y, opd *z)
{
if (CAC (x, y)) GEN(“ADD”, “EAX”, x)
else GEN ("ADD”, “EAX", y);
AC=z;
}
Además, la rutina GEN imprime sus argumentos en el formato ensamblador adecuado, por
ejemplo, GEN(“ADD”, “EAX”, “c”) añade la siguiente línea al código generado: ADD
EAX, [c]
Suponiendo que el valor de la variable AC es “b” y que estamos generando el código para
la asignación: “c = -a + d”, utilizar las funciones SUMA, NEG, CAC y GEN para generar
el código ensamblador correspondiente a dicha asignación.
4. Utilizando las tablas que se proporcionan, ¿cuántas instrucciones en ensamblador se
generarán para una operación de suma en la que el primer operando es de tipo “int” y el
segundo operando de tipo “double”?
a)
b)
c)
d)
1
2
3
4
Tabla 1. Generación de código ensamblador para la operación suma.
Tipo del
operando
izquierdo x
unsigned
char
int
Registro
entero
Constante
entera
double
Registro
double
Tipo del operando derecho y
unsigned
char
int
Registro
entero
Constante
entera
double
Registro
double
Carga x
Repite suma
Intercambio
Repite suma
Intercambio
Repite suma
Carga x
Repite suma
Carga x
Repite suma
Carga x
Repite suma
Carga y
Repite suma
Carga y
Repite suma
Carga y
Repite suma
ADD x,y
ADD y,x
Carga x
Repite suma
MOV T,x
Repite suma
FIADD x
ADD x,y
Carga y
Repite suma
ADD x,y
Intercambio
Repite suma
Intercambio
Repite suma
Intercambio
Repite suma
-
Carga x
Repite suma
FADD x
Carga y
Repite suma
Intercambio
Repite suma
Carga y
Repite suma
Intercambio
Repite suma
Intercambio
Repite suma
Intercambio
Repite suma
Intercambio
Repite suma
Intercambio
Repite suma
Carga y
Repite suma
Intercambio
Repite suma
FADD x
MOV T,x
Repite suma
FADD y
Tabla 2. Generación de código ensamblador para la carga de un operando sobre un registro.
Carga sobre un
registro de tipo
unsigned
char
Tipo del operando que hay que cargar
int
constante entera real
entero
XOR RH,RH
MOV RL,x
MOV RX,x
MOV RX,x
doble
XOR RH,RH
MOV RL,x
MOV T,x
FLD T
FILD x
MOV T,x
FLD T
FLD x
FISTP x
MOV RX,x
FLD x
11. Dado el siguiente código ensamblador
1
2
3
4
5
MOV EAX, [B]
ADD EAX, [C]
MOV [A], EAX
MOV EAX, [D]
ADD EAX, [C]
Una llamada a la función CAC con los parámetros D y C, ¿qué líneas de ensamblador
puede generar?
a)
b)
c)
d)
líneas 3 y 4
líneas 4 y 5
líneas 3, 4 y 5
Ninguna de las anteriores
Descargar