-
汇编语言程序语句除指令以外还可以由伪操作和宏指令组成
.
伪操作又称伪指令
,
它不
像机器指令那样是在程序运行期间由计算机来执行的
,
它是在汇
编程序对源程序汇编期间由
汇编程序处理的操作
,
这们可以完成如数据定义、分配存储区、指示程序结束等功能。
一、数据定义及存储器分配伪操作
这一类伪操作的格式是:
[Variable] Mnemonic
Operand,...,Operand[;Comments]
其中变量
(Variable)
字段是可有可无的
,
p>
它用符号地址表示
,
其作用与指令语句前的
标
号相同
,
但它的后面不跟冒号
.
如果语句中有变量则汇编程序使其记以第一个字节的偏移地
址
.
注释
(Comm
ents)
字段用来说明该伪操作的功能
,
它也是可有可无的
.
助记符
(M
nemonic)
字段说明所用伪操作的助记符
,
常用的有以下几种
:
DB
伪操作用来定义字节
,
其后的每个操作数都占有一个字节
.
DW
伪操作用来定义字
< br>,
其后的每个操作数都占有一个字
(
低位字节在第一个字节地址中
,
高位字节在第二个字节地址
中
).
DD
伪操作用来定义双字
p>
,
其后的每个操作数占有二个字
.
DQ
伪操作用来定义四个字
,
其后的每个操作占有四个字
.
DT
< br>伪操作用来定义十个字节
(
五个字
),
其后的每个操作数占有十个字节
,
形成压缩的
BCD
码
.
操作数字段还可以使用复制操作符
(duplication
opreator)
来复制某个操作数
,
例
:
ARRAY1 DB 2 DUP(0,1,2,?)
注
1:
使用
P
TR
属性操作符
,
可以指定
操作数的类型属性
.
例
:
MOV AX,WORD
PTR OPER1
注
2:
使用
p>
LABEL
伪操作可以使同一变量具有不同的类型属性
.
例
:
BYTE_ARRAY LABEL BYTE
WORD_ARRAY DW 50 DUP(?)
二、表达式赋值伪操作
EQU
格式
:
变量名
EQU
表达式
例
:
CONST EQU 256
数赋以符号名
DATA EQU
HEIGHT+12
地址表达式赋以符号名
ALPHA EQU 7
BETA EQU ALPHA-2
B EQU [BP+8]
变址引用赋以符号名
B
P8 EQU
DS:[BP+8]
另有一个与
EQU
类似的
=
伪操作也可以作为赋值操作使用
.
这们之间的区别是
EQU
伪操作
中的表达式名是不允许重复定义的
,
而
=
伪操作则允许重复定义
.
例
:
EMP=7
EMP=EMP+1
三、段定义伪操作
存储器的物理地址
是由段地址和偏移地址组合而成的
,
汇编程序在把源程序转换为
目标
程序时
,
必须确定标号和变量的偏
移地址
,
并且需要把有关信息通过目标模块传送给连接程
序
,
以便连接程序把不同的段和模块连接在一
起形成一个可执行程序
.
为此
,
需要用到段定义
伪操作
,
段定义伪操作的格式如下
:
segment_name
SEGMENT
...
segment_name
ENDS
其中删节号部分
,
对于数据段、附加段
和堆栈段来说,一般是存储单元的定义、分配等
伪操作;对于代码段则是指令及伪操作。
此外,还必须明确段和段寄存储器的关系,这可用
ASSUME
伪操作来实现,其格式为:
ASSUME assignment
,
...
,
assignment
<
/p>
其中
assignment
说明分配情况
,其格式为:
segment_register_name:segment_name
其中段寄存器名必须是
CS
、
< br>DS
、
ES
和
< br>SS
中的一个,
而段名必须是由
SEGMENT
定义的段
中的段名。而
ASSUME NOTHING
则可取消前面由
ASSUME<
/p>
所指定的段寄存器。
由于
ASSUME
伪操作只是指定某个段分配给哪一个段寄存器,它并不能把段地
址装入段
寄存器中,
所以在代码段中,还必须把段地址装入相应
的段寄存器中。
但是,代码段不需要
这样做,代码段的这一操作
是在程序初始化时完成的。
SEGMENT
< br>伪操作还可以增加类型及属性的说明,格式如下:
segname SEGMENT [align_type]
[combine_type]
['class']
...
segname ENDS