2. Definición Simplificada de Segmento
La versión 5.0 de MASM implementa un
sistema simplificado para declarar segmentos.
Por default, las directivas simplificadas de
segmento usan los nombres de los segmentos
y convenciones usadas por Microsoft en sus
lenguajes de alto nivel.
3. Modelos de Memoria.
Especifican el tamaño usado tanto en datos como en
código en el programa. Los lenguajes de alto nivel
requieren la definición de un modelo de memoria
específico, si vamos a enlazarlo con una rutina en
ensamblador, ésta deberá tener la definición del mismo
modelo de memoria. Esta deberá utilizarse antes que
cualquier otra directiva de segmento y si se usa la
directiva DOSSEG, ésta deberá ir antes de la directiva del
modelo de memoria.
DOSSEG nos acomoda los segmentos en el orden prestablecido.
4. Para declarar el tipo de memoria a utilizar en un
programa, la sintaxis es la siguiente :
.MODEL nombre_memoria_modelo
• Donde:
nombre_memoria_modelo -> Corresponde al
tipo de memoria y puede ser una de las
siguientes:
Tiny, Small, Medium, Compact, Large, Huge
5. Los apuntadores NEAR solo
contienen el offset de la
dirección, éstos pueden
inicializarse con la directiva DW.
Los apuntadores FAR contienen
tanto la dirección del segmento
como la del offset, éstos se pueden
inicializar mediante la directiva DD.
6. Modelo Descripción
Tiny Tanto datos como código son acomodados en un mismo segmento.
Small Los datos se escriben en un segmento y el código en otro segmento. Cada segmento
puede tener hasta 64 KB. En este caso se usan punteros NEAR para código y datos.
En este caso se usan punteros NEAR para código y datos.
Medium Todos los datos se escriben en un segmento 64 KB máximo.
El código puede ocupar más de un segmento, entonces los datos se manejan como
NEAR paro el código como FAR.
Compact Todo el código se acomoda en un solo segmento, pero los datos pueden ocupar más
de un segmento, sin embargo los arreglos no pueden ocupar más de 64K.
De esta manera código es NEAR pero los datos son FAR.
Large Tanto el código como los datos pueden ocupar más de un segmento, sin embargo los
arreglos se siguen limitando a 64 KB.
De esta manera, tanto los datos como el código son FAR.
Huge Tanto el código como los datos pueden ocupar más de un segmento, en este caso
también los arreglos pueden ser mas grandes que 64 KB.
Todos los punteros utilizados en este modelo son FAR.
7. Directivas de definición de segmentos
Sintaxis
.STACK [tamaño] Define el tamaño que tendrá la pila.
.CODE Segmento de código.
.DATA Segmento para datos inicializados NEAR.
.DATA? Segmento para datos no inicializados NEAR.
.FARDATA Segmento para datos inicializados
FAR.
.FARDATA? Segmento para datos no inicializados
FAR.
.CONST Segmento para datos constantes.
8. Orden de los segmentos.
Los segmentos deberán ser ordenados de acuerdo a la convención para segmentos
del DOS, esta convención se utiliza por Microsoft para los lenguajes de alto nivel.
• Cuando se usa esta directiva los segmentos son ordenados como sigue:
• Segmentos teniendo el nombre de clase 'CODE'.
• Cualquier segmento que no tenga el nombre de clase 'CODE' y no se encuentre en
el DGROUP.
• Segmentos que son parte de DGROUP en el siguiente orden:
– Segmentos con nombre de clase BEGDATA.
(Este nombre se reserva para uso de Microsoft).
–Cualquier segmento cuyo nombre de clase no sea: BEGDATA, CONST, DATA, BSS
ó STACK.
– Segmento de clase CONST.
– Segmentos de clase DATA.
– Segmentos de clase BSS.
– Segmento de clase STACK.
9. STACK
BSS
DATA
DGROUP
CONST
BEGDATA
Otros segmentos
CODE
Orden de los segmentos
10. Valores de segmento.
•Para cada una de las directivas de segmento existe su correspondiente valor, el
cual se expresa por su mismo nombre, excepto que este valor inicia con el signo
(@) y la directiva empieza con un punto (.).
Nombres de segmentos predefinidos.
• En esta sección analizaremos solo los correspondientes al modelo Small.
Segmentos y tipos para el Modelo de Memoria SMALL.
Modelo Directiva Nombre Alineación Combinación Clase Grupo
Small .CODE _TEXT WORD PUBLIC ‘CODE’
.DATA _DATA WORD PUBLIC ‘DATA’ DGROUP
.CONST CONST WORD PUBLIC ‘CONST’ DGROUP
.DATA? _BSS WORD PUBLIC ‘BSS’ DGROUP
.STACK STACK PARA STACK ‘STACK’ DGROUP