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
|
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 |