B_1.gif (1135 bytes)

INICIO WEB

B_2.gif (1184 bytes)

                    

DIRECTIVAS DE CONTROL DE SEGMENTOS

                  

Las directivas de segmentos controlan como se genera el código y los datos.

   

Estas directivas son las siguientes: ALIGN, ASEG, COMMON, EVEN, ODD, ORG, RSEG y STACK.

          

Sintaxis

       

ALIGN align [,value]

ASEG [start [(align)]]

COMMON segment [: type] [(align)]

EVEN [value]

ODD [value]

ORG expr

RSEG segment [: type] [flag] [(align)]

RSEG segment [: type], address

STACK segment [: type] [(align)]
       

Parámetros

  • address: Dirección donde este segmento va a ser colocado.
  • align: Exponente del valor en el cual la dirección debe ser alineada, en el rango de 0 a 30.

  • expr: Dirección a la que se pone el contador de posición.
  • flag: NOROOT

Este segmento puede ser eliminado por el linker incluso si ningún símbolo en el segmento hace referencia de él. Normalmente todos los segmentos menos el código de startup y los vectores de interrupción deben activarse por este flag. El modo por defecto es ROOT, el cuál indica que el segmento no debe ser eliminado.

REORDER

Permite al linker ordenar los segmentos. Para un segmento dado, todos los segmentos deben especificar este mismo estado para este flag. El modo por defecto es NOREORDER que indica que los segmentos deben permanecer en orden.

SORT

El linker ordenará los segmentos en orden de alineación decreciente. Para un segmento dado todos los segmentos deben especificar este mismo estado para este flag. El modo por defecto es NOSORT que indica que los segmentos no serán ordenados.

  • segment: El nombre del segmento.
  • start: Una dirección de comienzo que tiene el mismo efecto que usar la directiva ORG al comienzo de un segmento absoluto.

  • type: El tipo de memoria; UNTYPED, CODE o DATA. Además los siguiente tipos son generados por compatibilidad con el AVR IAR Compiler: CODE, FARCODE, DATA, FARDATA, XDATA , CONST Y FARCONST. HUGEDATA Y HUGECONST son equivalentes a DATA y CONST respectivamente. El compilador utiliza XDATA para variables de EEPROM.

  • value: Valor de byte usado como relleno, por defecto es cero.
         

Descripción

       

Utilice ASEG para poner el modo absoluto de ensamblado, que es el que viene por defecto al comienzo de un módulo.

Si el parámetro es omitido, la dirección de comienzo del primer segmento es 0 y los segmentos posteriores comenzarán en la dirección siguiente al final de los anteriores segmentos.

    

Utilice RSEG para poner el modo actual de ensamblado para modo de ensamblado recolocable. El ensamblador mantiene contadores de posición diferentes (inicialmente a cero) para todos los segmentos que hacen posible seleccionar segmentos y modos sin necesidad de guardar el contador de posición de segmento actual.

Sólo por encima de 65536, los segmentos recolocables pueden definirse en un simple módulo.

      

Utilice STACK para colocar código o datos asignados de direcciones altas a bajas. El contenido del segmento no se genera en orden inverso.

       

Utilice COMMON para colocar datos en memoria en la misma posición que los segmentos COMMON de otros módulos que tienen el mismo nombre. Lógicamente, el tipo de segmento COMMON no debe usarse para cubrir código ejecutable.

       

Utilice ORG para poner el contador de posición de programa del segmento actual al valor de una expresión. La etiqueta opcional asumirá el valor y tipo del nuevo contador de posición.

Todos los contadores de posición de programa se ponen a cero al comienzo de un módulo de ensamblado.

        

Utilice ALIGN para alinear el contador de posición de programa en una dirección límite específica. La alineación se hace relativamente al comienzo del segmento; normalmente esto significa que la alineación del segmento debe ser por lo menos tan grande como el de la directiva de alineación para dar el resultado deseado.

ALIGN alinea insertando bytes llenos de ceros. La directiva EVEN alinea el contador de programa a una dirección dada (que es equivalente a ALIGN 1) y la directiva ODD alinea el contador de programa en direcciones sueltas.

        

Ejemplos

       

Comienzo de un segmento absoluto

El ejemplo siguiente ensambla la rutina de interrupción introduciendo instrucciones en el vector de interrupción apropiado usando un segmento absoluto.

 

EXTERN             EINT1, EINT2, RESET

    

ASEG    INTVEC

ORG     0h

     

RJMP    RESET

RJMP    EINT1

RJMP    EINT2

     

END

     

Comienzo de un segmento recolocable

En el siguiente ejemplo, el dato siguiente a la primera directiva SREG es puesto en un segmento recolocable llamado tabla; la directiva ORG es usada para crear un hueco de 6 bytes en la tabla.

El código siguiente a la segunda directiva SREG es puesto en un segmento recolocable llamado "code".

     

     EXTERN Table1, Table2

      

     RSEG TABLES

     DC16 Table1, Table2

      

     ORG $ + 6

     DC16 Table3

    

     RSEG CONST

    

Table3 DC8 1, 2, 4, 8, 16, 32

     END
        

Comienzo de un segmento de pila

El siguiente ejemplo define dos pilas de 100 byte en un segmento recolocable llamado rpnstack:

 

               STACK    rpnstack

parms      DS8         100

opers       DS8         100

               END

  

Los datos son colocados de las direcciones altas a las bajas.

     

Comienzo de un segmento común

El siguiente ejemplo define dos segmentos comunes que contienen variables:

     
                  NAME             common1
                  COMMON      data
count          DD                  1
                  ENDMOD
                  NAME             common2
                  COMMON      data
up               DB                   1

                  ORG               $ + 2

down          DB                  1

                  END

       

Como los segmentos comunes tienen el mismo nombre, data, las variables up y down se refieren a la misma posición en memoria como el primer y el último byte de la cuenta de 4 byte.

          

Alineación de un segmento

Este ejemplo comienza un segmento recolocable, lo mueve a una dirección igual y le añade algunos datos. Entonces los alinea en el límite de los 64 bytes antes de crear una tabla de 64 byte.

     

                   RSEG      data

                   EVEN

   

target           DC16       1

    

best             DC16       1

                   ALIGN     6

         

results          DS8         64

                   END
             
                                         

B_1.gif (1135 bytes)

B_3.gif (1151 bytes)

B_2.gif (1184 bytes)