同一个程序中,标号或变量只能定义一次.
标号有三种属性:段、偏移、类型(NEAR PTR,WORD PTR,FAR PRT,DWORD PTR)
?
?
一。数值回送操作符:TYPE、LEGNTH、SIZE、OFFSET、SEG
1.?TYPE????expression_r(or label)
如果表达式是变量,则回送该变量以字节数表示的类型:DB为 1, DW为 2, DD为 4...
如果表达式是标号,则回送该标号类型的数值:NEAR为 -1, FAR为 -2.
如果表达式是常量,则回送0.
array??DW A110H,B02CH,C322H???
ADD????AX, TYPE??array??等价于 ADD????AX, 2
2.?LENGTH????variable????对于变量使用DUP的情况,将回送分配给该变量的单元数; 对其它情况则回送1.
fees??DW 100 DUP(?)??????????
MOV??CX, LEGNTH??fees??等价于MOV??CX, 100
3.?SIZE????variable????回送分配给该变量的字节数
MOV????CX, SIZE??fees 等价于 MOV CX, 200
4.?OFFSET????variable (or lable)????????回送变量或标号的偏移地址.
MOV????BX,OFFSET OPER_ONE 等价于 LEA BX,OPER_ONE 语句 ,将OPER_ONE的偏移地址送入BX
5.?SEG????variable(or lable)???????回送变量或标号的段地址.
若OPER_ONE是DATA_SEG数据段中的一个变量,下面语句取得DATA_SEG段首地址
MOV????DS , SEG OPER_ONE??等价于
MOV????AX , DATA_SEG??????MOV????DS , AX
二。属性操作符:PTR、THIS、HIGH、LOW、HIGHWORD、LOWWORD
1.?type????PTR????expression????????用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型.
表示按expression表达式寻址,按指定的类型type看待.
即PTR是给后面的expression操作数赋予新的数据类型或地址类型.
MOV????BYTE PTR[BX] , 5????????//存入字节(Byte)单元
MOV????WORD PTR[BX] , 5???????//存入字(Word)单元
2.?THIS????type????指定与当前地址计数器相等的一个地址单元的类型.type是NEAR、FAR、PROC,也可以是BYPE、WORD...
first_type????EQU????THIS??BYTE
word_table????DW????100 DUP(?)????此时,first_type的偏移地址与word_table完全相同,但它是字节类型
3.?HIGH (LOW)????express???字节分离操作符, HIGH取高位字节, LOW取低位字节.
HIGHWORD (LOWWORD)????express????字分离操作符, HIGHWORD取高位字, LOWWORD取低位字.
CONST????EQU????0ABCDH??,??????MOV????AH, HIGH CONST 等价于
MOV????AH,0ABH
三。数据定义语句:variable_name????Mnemonic?????oper1, oper2.....
常用的助记符Mnemonic有:
?DB 定义字节,表示其后每个操作数占有一个字节(1Byte)单元
?DW 定义字,表示表示其后每个操作数占有一个字(2Byte)单元
?DD 定义双字,表示表示其后每个操作数占有两个字(4Byte)单元
?DQ 定义四个字,表示表示其后每个操作数占有四个字(8Byte)单元
?DT 定义十个字节,表示表示其后每个操作数占有十个字(10Byte)单元,形成压缩BCD码.
data_byte?????DB??????10 , 4 , 10H , ?????????//共定义了4个字节,其中 ‘?‘ 是保留单元
data_word????DW????100,?,100H????????????//共定义了3个字(6Byte)
str_aa????????????DB?????‘ABCDEFG‘????????????//定义和初始化多于两个能上能下字符的字符串时,只能使用DB伪指令.
四。符号定义语句(即常量)
name????EQU????expression????????????????//定义
PURGE????name1,name2...???????????????//解除
CONSTANT?????EQU????256???????//表示CONSTANT的值为256
五。段定义语句:SEGMENT ... ENDS、ASSUME、ORG
segmnet_name????SEGMENT????[align_type] [combine_type] [use_type] [class]
...
segment_name????ENDS????//SEGMENT和ENDS成对使用,把汇编语句分成段
对于数据段、附加段和堆栈段,一般是存储单元定义、初始化数据、分配单元等伪指令.
对于代码段,主要是指令序列和伪指令.
可选项说明:详细信息?
定位类型align_type:说明段的起始地址就有怎有怎样的边界值.
????????PARA????缺省项.??指定段的起始地址须从小段边界开始,即以16进表示地址时最低位必须为0.
????????BYTE?????可从任何地址开始.
????????WORD????必须从字的边界开始,即段地址必须是偶数..
????????DWORD??必须从双字的边界开始,即以16进制表示地址时最低位必须是4的倍数.
????????PAGE?????必须从页的边界开始,即以16时制表示地址时最低两位必须为00.(能被256整除)
组合类型combine_type:说明程序连接的段合并方法.
????????PRIVATE????缺省项.为私有段,连接时不与其他模块中的同名分段合并.
????????PUBLIC???????将与相同名字的其它分段合并.
????????COMMON??将与相同名字的其它分段合并且会产生覆盖.
????????MEMORY???同PUBLIC.
????????STACK????????指定该段在运行时为堆栈的一部分.
使用类型use_type:只适用386及其后继机型,用来说明是USE16(16位寻址)还是USE32(32位寻址).
类别class:用引号中给出连接时组成段组的类型名.
ASSUME使汇编程序在汇编指令时,能知道各段寄存器的值.
ASSUEM????segment_registername : segment_name , segment_registername : segment_name...
任何对存存储器或堆栈的访问的指令,都将使用CS、DS、ES和SS段寄存器的值才能形成真正的物理地址.
ASSUME只指定某个段分配给某个寄存器,并不能把段地址装入段寄存器.
所以,DS、ES、SS段寄存器的值必须通过MOV指令来赋予,CS段寄存器在程序初始化时自动完成.
为了给存储单元设置起始偏移地址,可以用ORG伪指令.
ORG????表达式????//表达式的值范围必须在0 ~ +65535
伪指令ORG可设置于代码段、数据段的任何地方.
mydata????SEGMENT????????????//段定义,段名为mydata
ORG?????100H?????????????????????//置mydata段的起始偏移地址为100H
?X????DB????12H , ? , 30H?????//数据定义,X 的偏移地址为0100H, X+1=0101H, X+2=0102H
????Z????DD????9C56H???????????????//Z的偏移地址为0103H
mydata????ENDS
mycode????SEGMENT
????ASSUME????CS : mycode ,??DS : mydata????//用ASSUME伪指令分配段寄存器
????start:?????MOV AX , mydata??//等价于MOV AX , SEG X语句, 将mydata段的起始地址装入到DS
??????????????????MOV DS , AX
????...
mycode????ENDS
????END?????start??????//源程序结束指令END, 其中start为lable
六。过程定义语句:PROC ... ENDP
procedure_name????PROC????[ NEAR | FAR ]??//要说明是NEAR过程或FAR过程.
...
RET????????//RET 返回指令必须与[ NEAR??|??FAR ] 对应
procedure_name????ENDP????????//PROC 和ENDP必须有名字,两者成对出现.
七。宏指令语句:MACRO...ENDM
macro_name????MACRO????[ parameter_list ]????//形参 parameter_list 可选,有多个参数时,中间用逗号隔开.
...
ENDM
MULTIPLY????MACRO????OPR1 , OPR2 , RESULT????//宏定义,宏名MULTIPLY,形参为OPR1,OPR2和RESULT
????????PUSH????DX
????????PUSH????AX
????????MOV????AX , OPR1
????????IMUL????OPR2
????????MOV????RESULT , AX
????????POP????AX
????????POP????DX
ENDM
MULTIPLY????240 , BX , SAVE????//宏调用,实参为240 , BX , SAVE
宏指令与子程序的区别:
子程序产生目标代码少,占用内存少,但执行时间长,速度慢.
宏指令产生目标代码长,占用内存多,但执行时间短,速度快.
八。程序开始和结束语句:NAME | TITLE、END
模块名:NAME????moudle_name
标题名:TITLE????text
源程序结束指令:END????[ lable ]
?
?
来自 <http://blog.sina.com.cn/s/blog_4a92ce12010006m2.html>