Autor: Arturo Olivares Martos
El primer parcial se invalidó y se repetió por ser muy complicado y entrar materia que no habíamos dado.
Cada persona tenía un examen, por lo que hubo muchas versiones de este examen. De una batería de preguntas del profesor (salía de forma aleatoria); por lo que no hay un único examen, sino muchos. Esta es la primera versión subida.
Cada respuesta correcta suma 1 punto, y cada respuesta incorrecta resta 0.33 puntos. Las preguntas no respondidas no suman ni restan. La puntuación total es sobre 18.
Dado el siguiente fragmento de programa en ensamblador:
xor %rbx,%rbx
xor %rcx,%rcx
sub $56,%rcx
mov $0x1,%ebx
rcr %cl,%rbx
¿Cuál es el valor del registro RBX
al finalizar la última instrucción?
Dado el siguiente fragmento de programa en ensamblador:
xor %rbx,%rbx
xor %rax,%rax
sub $1, %rax
rcr $4,%rbx
¿Cuál es el valor del registro RBX
al finalizar la última instrucción?
Dado el siguiente fragmento de programa en ensamblador:
mov $-18,%eax
sar $0x46,%eax
and $0xFF,%eax
¿Cuál es el valor del registro RAX
al finalizar la última instrucción?
Dado el siguiente fragmento de programa en ensamblador:
mov $-18,%eax
sar $0x46,%eax
and $0xFF000000,%eax
¿Cuál es el valor del registro RAX
al finalizar la última instrucción?
Dado el siguiente fragmento de programa en ensamblador:
mov $-14,%eax
sar $3,%eax
and $0xFF,%eax
¿Cuál es el valor del registro RAX
al finalizar la última instrucción?
Dado el siguiente fragmento de programa en ensamblador:
xor %rcx,%rcx
add $7,%rcx
mov $0x1234,%ebx
rcr %cl,%rbx
¿Cuál es el valor del registro RBX
al finalizar la última instrucción?
¿Cuál de las siguientes parejas de nemotécnicos de ensamblador corresponden a la misma instrucción máquina?
Suponga la siguiente sentencia asm en un programa:
asm(" add (%[a],%[i],4),%[r]"
:[r] "+r" (result)
:[i] "r" (i),
[a] "r" (array)
);
¿Cuál de las siguientes afirmaciones es incorrecta?
¿Cuál de las siguientes funciones en C NO puede traducirse al siguiente código en ensamblador?
movslq %esi,%rsi
movq (%rdi,%rsi,8), %rax
ret
Dado el código de una función
funcion: movq %rdi, %rax
movl $64, %ecx
shrq %cl, %rax
addq %rdi, %rax
ret
este código:
Si en la práctica "media" se programa la suma de una lista de 16 enteros de 4B para producir un resultado de 8 B, primero sin signo y luego con signo, y la lista se rellena con el valor 0x0400 0000
, ¿en qué se diferencian los resultados de ambos programas?
Para crear espacio en la pila para variables locales sin inicializar suele realizarse la siguiente operación:
En la secuencia de programa siguiente:
628: e8 cd ff ff ff callq 5fa suma
62d: 48 83 c4 20 add $0x20,%rsp
¿cuál es el valor que introduce en la pila la instrucción callq
?
En x86-64, una función con 10 parámetros de tipo long que devuelve el valor del 8º parámetro y no modifica el puntero de pila puede traducirse a ensamblador como:
Respecto a la inicialización de los elementos del array:
#define SIZE (1<<16)
for (i=0; i<
lista[i]=i;
La siguiente función calcula el factorial:
fact:
pushq reg # preservar registro
movl %edi, %ebx
movl $1, %eax
testl %edi, %edi
je .L4
leal -1(%rbx), %edi
call fact
imull %ebx, %eax
.L4:
popq reg # restaurar registro
ret
¿Cuál es el registro <reg>
que tiene que guardarse en la pila?
Al traducir la sentencia C r->i = val;
gcc genera el código ASM:movl %edx, 8(%rax)
Se puede deducir que:
Si el registro r12b
contiene la variable booleana cond
, y rax
la variable valor
, la secuencia de instrucciones:
testb %r12b, %r12b
movq $13, %rax
cmove $17, %rax
realiza la operación: