第3节 伪指令

段定义伪指令(SEGMENT/ENDS)

1.段名
该段名字,用来指出汇编程序为该段分配的存储区起始位置。
2.定位类型(指定该段起始地址边界值的类型)
(1)BYTE:表示本段起始地址可以从任一地址处开始存放。
(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。
(3)DWORD:表示本段要从双字边界处开始存放,即段起始地址的最低二位必须是0。
(4)PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。
(5) PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。
3.组合类型(用来告诉连接程序link.exe,本段与其它模块中同名段的组合连接关系)
有六种类型可供选择。
(1)“不选择”
(2)PUBLIC:连接时,把与该段名相同的段连接在一起。
(3)STACK:指定该段为堆栈段的一部分
(4)COMMON:指定该段与其它同名的段有相同的段起始地址。
(5)MEMORY:指定该段将分配在所有其它段的前面(高地址)。
(6)PRIVATE: 该段为独立段,不与其它同名段合并。
(7)AT 表达式:用于指定由表达式值所确定的段所在的起始地址。不能用于代码段
4.字长类型(用于386以上,用来说明使用16位寻址方式或32位寻址方式)
(1)USE16:使用16位寻址方式。
(2)USE32:使用32位寻址方式。
5.类别(连接时,连接程序会把类别相同的所有段放在连续的内存区域中)
‘DATA’ :段类别是数据段。
‘CODE’ :段类别是代码段。
‘STACK’ :段类别是堆栈段。
‘EXTRA’ :段类别是附加数据段。
对连接程序进行连接后存储区各段相对位置分布。
DATA1 SEGMENT ‘DATA’
CODE SEGMENT ‘CODE’
STACK1 SEGMENT ‘STACK’
DATA2 SEGMENT ‘DATA’
STACK2 SEGMENT ‘STACK’
经连接程序连接后,各段的相对位置如下:
DATA1 SEGMENT ‘DATA’
DATA2 SEGMENT ‘DATA’
STACK1 SEGMENT ‘STACK’
STACK2 SEGMENT ‘STACK’
CODE SEGMENT ‘CODE’
【例】有两个模块,各模块段定义如下:


模块1、模块2连接后段的定位组合方式示意图

假定伪指令 (ASSUME) --段分配伪指令
ASSUME 段寄存器:段名,段寄存器:段名,…
功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。
ASSUME CS:CODE, DS:DATA1, ES:DATA3, SS:DATA2

段组定义伪指令 (GROUP)
段组名 GROUP 段名,段名,…
功能:将GROUP后段名所指定的段分配在同一个物理存储器段中,分给该段一个段组名。

地址计数器伪指令 (ORG,EVEN,ALIGN)
地址计数器(偏移计数器)
- $ :本指令地址
- ORG 表达式
--设置地址计数器 - EVEN
--使下一变量或指令开始于偶数地址。 - ALIGN n
--使下一变量或指令开始于n的整数倍地址。 N=2,4,8,16,…
数据定义伪指令 (DB,DW,DD,DF,DQ,DT)

- 常数、表达式

- 字符串

- ?

- n DUP( )
ORG 300H
DATA1 DB 2 DUP(12H,34H,56H)

过程定义伪指令(PROC/ENDP)

用CALL 过程名调用此过程
模块连接伪指令(PUBLIC,EXTRN)

符号可以是:常量、变量、标号、过程名。


