¿Cómo se asignan los datos en un lenguaje ensamblador utilizando el conjunto de instrucciones?

1

Considere el siguiente extracto del código de ensamblaje escrito para la arquitectura del procesador integrado Nios II :

    .section .data
    .align 2
va:   .long 0x0
vb:   .long 0x11223344
vc:   .long 0x55667788

Se debe hacer lo siguiente:

  • Asigne suficiente memoria para las tres variables
  • Asegúrese de que la memoria asignada sea contigua
  • Traduzca las instrucciones que usan el nombre de una variable en instrucciones que usen la dirección de la variable

No veo cómo se puede hacer esto a través del conjunto de instrucciones y esperaba obtener alguna información sobre cómo ocurre la traducción del código anterior al conjunto de instrucciones.

    
pregunta Farhad Yusufali

2 respuestas

3

Esto está asignando la memoria, y no tiene nada que ver con el conjunto de instrucciones. Los ensambladores son increíblemente simples: las líneas en el archivo de ensamblaje se corresponden casi exactamente con el binario de salida, se realiza muy poca reorganización. La línea ".long 0x0" simplemente significa 'dame cuatro bytes aquí y cárgalos con el valor 0x0'. Los datos se 'asignan' de la misma manera que las instrucciones. Una línea 'MOV R12, R11' simplemente significa 'dame cuatro bytes aquí mismo y cárgalos con la codificación binaria para MOV R12, R11'. Los datos son contiguos por el mismo motivo por el que sus instrucciones son contiguas: las escribió en líneas contiguas en el archivo de ensamblaje. El "va:" simplemente significa 'llamar a la ubicación de estos cuatro bytes "va"'. Esto solo se usa dentro del ensamblador. Siempre que haga referencia a 'va' en el código, el ensamblador insertará la dirección de los cuatro bytes de datos a los que se refiere 'va', que es solo un número. Tenga en cuenta que esto puede no ser hecho por el ensamblador, esto puede ser hecho por el enlazador. Sin embargo, la cadena 'va' nunca aparecerá en el binario de salida.

Básicamente, el ensamblaje es casi una representación directa de los contenidos de la memoria. Las líneas sucesivas de montaje terminarán en direcciones sucesivas. La única excepción es cuando cambias secciones (.sección). Cualquier dato que se encuentre explícitamente en el código será contiguo si es contiguo en el archivo de ensamblaje. Ahora, las secciones se atornillan un poco con esto. Es posible que todo .data termine en una parte de la memoria y todo .text termine en otra parte. Sin embargo, los bloques no se dividirán: si son contiguos en el archivo de ensamblaje, entonces serán contiguos en la salida.

    
respondido por el alex.forencich
2

Los datos como este no se "asignan" de la misma manera.

Lo que sucede es que, cuando ejecutas un programa, ese programa se carga en la memoria. Si ese programa contiene 0x000000001122334455667788 en algún lugar, entonces esas ubicaciones de memoria (12 en total a menos que haya contado mal) contendrán esos valores. Cuando compila su código, todos los NOMBRES se traducen en direcciones de memoria. A partir de ese momento, no se ejecutan instrucciones para que esto suceda: la memoria está ahí, está "asignada" (se asigna suficiente memoria para contener todo el programa, variables estáticas como esta y todas), y porque se coloca todo el programa. en esa memoria, las variables se inicializan.

Luego, cuando diga "cargar la variable va en el registro 'X'", el código compilado (que dice "cargar la dirección 0x84573412 en el registro 'X'") obtendrá el bit de datos correcto.

Los nombres de las variables solo están allí para su comodidad, de lo contrario, tendría que asignar direcciones específicas usted mismo.

    
respondido por el AMADANON Inc.

Lea otras preguntas en las etiquetas