Usted está aquí: Inicio Ver Cursos Archivados Arquitectura de Ordenadores ejercicios-1 Capítulo 8. Ejercicios

Capítulo 8. Ejercicios

Acciones de Documento
  • Vista de contenidos
  • Marcadores (bookmarks)
  • Exportación de LTI
Autor: Abelardo Pardo

 

  1. Partiendo del código del ejemplo 8.1, traducir la nueva versión que se muestra en la siguiente figura con la modificación en la última parte de la condición:

    Código de alto nivel
    if ((x <= 3) && (i == j++)) {

    Bloque A

    } else {

    Bloque B

    }
    • ¿En qué lugar se debe insertar la instrucción que incrementa la variable j para mantener el significado de esta construcción?

    • Si la primera sub-expresión de la conjunción es falsa, ¿se incrementa la variable j?

  2. Traducir el siguiente bucle en lenguaje de alto nivel a la porción de código equivalente en lenguaje ensamblador de la arquitectura IA-32. Se asume que todas las variables son de tipo entero.

    for (i = a + b; ((c + d) >= 10) && (i <= (d + e)); i = i + f - g - h ) {

    g--;

    f++;

    a = b + 10;

    }

    Las variables han sido definidas de la siguiente forma:

    a: .int 10

    b: .int 20

    c: .int 30

    d: .int 40

    e: .int 50

    f: .int 60

    g: .int 70

    h: .int 80

    i: .int 10

    La solución puede utilizar cualquier modo de direccionamiento excepto el modo absoluto. Al tratarse de una porción de código aislada, no es preciso salvar ni restaurar el contenido de los registros. La solución debe ser lo más corta posible y utilizar el menor número de registros de propósito general.

  3. La mayor parte de los lenguajes de alto nivel que ofrecen bucles de tipo while también ofrecen otro bucle de estructura similar denominado do/while. La diferencia es que el bloque comienza por la palabra clave do seguida de un bloque de código entre llaves y termina con la palabra while seguida de una condición booleana entre paréntesis.

    El bloque de código se ejecuta al menos una vez y tras él se evalúa la condición para determinar si se continúa iterando. Escribir la estructura en codigo ensamblador resultante de traducir esta construcción. Se puede asumir que el resultado de evaluar la condición está almacenado en %eax.

  4. Escribir las reglas para el paso de parámetros y devolución de resultado a través de la pila:

    • Por parte del programa que llama a la subrutina:

    • Por parte de la subrutina:

  5. Un programador ha escrito la siguiente rutina:

    rutina:

    push %ebp

    mov %esp, %ebp

    add $13, 4(%ebp)

    pop %ebp

    ret

    El programa principal que invoca a esta rutina contiene las siguientes instrucciones tal y como las muestra el compilador en su informe sobre el restulado del ensamblaje:

    1                            .data

    2 0000 50726F67 msg: .asciz "Programa terminado.\n"

    2 72616D61

    2 20746572

    2 6D696E61

    2 646F2E0A

    3

    4 .text

    5 .globl main

    6 main:

    7 0000 50 push %eax

    8 0001 51 push %ecx

    9 0002 52 push %edx

    10

    11 0003 E8FCFFFF call rutina # Llamada a rutina dada

    11 FF

    12

    13 0008 68000000 push $msg

    13 00

    14 000d E8FCFFFF call printf

    14 FF

    15 0012 83C404 add $4, %esp

    16

    17 0015 5A pop %edx

    18 0016 59 pop %ecx

    19 0017 58 pop %eax

    20 0018 C3 ret

    Explicar detalladamente cuál es el resultado de la ejecución de este programa. ¿Ejecuta correctamente? ¿Qué escribe por pantalla? ¿Por qué?

  6. El paso de resultados y devolución de resultados se puede hacer a través de registros, memoria o la pila, pero nada impide utilizar una técnica diferente para parámetros y resultados. Describir las reglas de creación del bloque de activación para los siguientes supuestos.

    1. Parámetros en la pila y resultados a través de registros.

    2. Parámetros en registro y resultados a través de la pila.

Reutilizar Curso
Descargar este curso