Estructura de Computadores. Examen 03.

Autor: Arturo Olivares Martos


  • Asignatura: Estructura de Computadores.
  • Curso Académico: 2023-24.
  • Grado: Doble Grado en Ingeniería Informática y Matemáticas.
  • Grupo: A.
  • Profesor: Ignacio Rojas Ruiz.
  • Fecha: 20-11-2023.
  • Descripción: Repetición del examen de Temas 1 y 2 de Teoría, y prácticas 1-3.

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.


  1. 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?

  2. 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?

  3. 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?

  4. 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?

  5. 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?

  6. 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?

  7. ¿Cuál de las siguientes parejas de nemotécnicos de ensamblador corresponden a la misma instrucción máquina?

  8. 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?

  9. ¿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

  10. 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:

  11. 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?

  12. Para crear espacio en la pila para variables locales sin inicializar suele realizarse la siguiente operación:

  13. 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?

  14. 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:

  15. Respecto a la inicialización de los elementos del array:
    #define SIZE (1<<16)
    for (i=0; i<SIZE; i++)
    lista[i]=i;

  16. 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?

  17. Al traducir la sentencia C
    r->i = val;
    gcc genera el código ASM:
    movl %edx, 8(%rax)
    Se puede deducir que:

  18. 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: