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