文章目录
- 1. 伪指令
- 1.1 段定义伪指令
- 1.2 段寄存器说明伪指令
- 1.3 过程定义伪指令
- 1.4 源程序结束伪指令
- 2. 变量/标号定义伪指令
- 2.1 变量定义
- 2. 2 标号定义
- 2.3 表达式
- 3.地址计数器与对准伪指令
- 3.1 地址计数器$
- 3.2 对准伪指令
- 4. DOS功能调用
- 4.1 DOS功能调用的一般方法
- 4.2 常用的DOS功能调用
- 4.3 汇编语言源程序格式
- 4.4 汇编语言程序的上机过程
- 4.4.1 汇编语言程序的工作环境
- 4.4.2 建立ASM文件
- 4.4.3 用MASM程序生成OBJ文件
- 4.4.4 用LINK程序产生EXE文件
- 4.4.5 调试程序DEBUG
- 总结
1. 伪指令
1.1 段定义伪指令
格式:段名字 SEGMENT [类型]
……
段名字 ENDS
例4.1 data SEGMENT
……
data ENDS
1.2 段寄存器说明伪指令
格式:ASSUME 段寄存器:段名 [,段寄存器:段名]
说明:利用SEGMENT/ENDS定义完一个段之后,必须通过ASSUME伪指令来明确所定义的段与段寄存器之间的关系。
例4.2 ASSUME CS:code,DS:data
该语句告诉汇编程序,从现在开始CS寄存器对应名字为code的段,DS寄存器对应名字为data的段。
1.3 过程定义伪指令
格式:过程名 PROC FAR/NEAR
……
过程名 ENDP
例4.4
main PROC FAR
……
main ENDP
1.4 源程序结束伪指令
格式:END [<标号>]
说明:对于END后面所带的标号,必须事先在程序中加以定义,表示程序要从标号所对应的指令开始执行,也就是说标号给定了程序的启始地址。
2. 变量/标号定义伪指令
2.1 变量定义
格式:[<变量名>] 变量定义伪指令 <表达式>
功能:声明一个变量的数据类型、代表的值、地址。
说明:
(1) 变量名是可有可无的,如果有,则会被汇编成该变量所对应的最开始字节的偏移地址。
(2) 变量定义伪指令(共5个)
① DB:定义字节类型变量,指示每个操作数占1个字节。
② DW:定义字类型变量,指示每个操作数占1个字(16位)。
③ DD:定义双字类型变量。
④ DQ:定义四字类型变量。
⑤ DT:定义十字节类型变量。
(3) 表达式可以是常数、字符串、变量、“?”、DUP子句等,各表达式间用逗号进行分隔。
① 表达式是常数的情况:
例4.5 X DW 1234H,4567H
② 表达式是字符串的情况:
例4.6 STR DB ‘HELLO’
X DB ‘AB’
Y DW ‘AB’
③ 表达式是变量的情况:
例4.7 X DB 10H
Y1 DW X
Y2 DD X
说明:用DW或DD可以把变量的地址存入存储器。使用DW时,将存储变量的偏移地址;使用DD时,将存储变量的偏移地址和段地址,并且先存放偏移地址,后存放段地址。
④“?”:表示不定义初值,只预留存储器空间。
例4.8 X DB 1CH,30H
Y DB ‘ASM’
Z DW 10H,?,20H
⑤ DUP:复制操作符,用来复制某个(或某些)操作数,DUP可以嵌套使用。
格式:
<重复次数> DUP(<操作数1>,<操作数2>,…)
(4) 变量的三个属性
① 变量的段属性:是指变量被定义时所在段的段地址;
② 变量的偏移属性:是指从段的起始地址到定义变量的位置之间的字节数,也称为变量的偏移地址;
③ 变量的类型属性,定义该变量时所保留的字节数目。
2. 2 标号定义
标号在代码段中定义,后跟冒号,是指令在存储器中存放地址的符号表示。
标号也具有三个属性:
段属性、偏移属性、类型属性。
标号的段属性和偏移属性与变量的这两个属性类似,标号的类型属性有两种:
NEAR:标号只能在段内引用;
FAR:标号可以在段间引用。
2.3 表达式
- 常量:在源程序中已有确定数值的量。
主要用于给变量赋初值等方面,其表现形式有两种:
① 数值常量:各种进制的数值或字符型。
例4.11 MOV AX,15
MOV AX,0FH
例4.12 MOV AL,‘B’
② 符号常量:为常用量定义一个名字。
<符号名> EQU <表达式>
<符号名> = <表达式>
其中表达式可以是常数、变量、标号、寄存器名等。
例4.13 X1 EQU 50
Y2= BX
则:MOV AX,X1 等价于:
MOV AX,50
EQU和“=”区别:EQU不能重复定义,而“=”则可以。
例4.14 X EQU 100
X EQU 200 ;出错 - 数值表达式(分为三类)
算术表达式、逻辑表达式、关系表达式
① 算术表达式
可用运算符:+、-、、/、MOD
例4.15 MOV AX,36 等价于:MOV AX,18
MOV AX,29 MOD 5 等价于:MOV AX,4
② 逻辑表达式
可以使用的运算符:
逻辑运算符(4个)和逻辑移位操作符(2个):
AND(与)、OR(或)、
NOT(非)、XOR(异或)。
SHL(左移)、SHR(右移)。
具体用法:
<表达式1> AND <表达式2>
<表达式1> OR <表达式2>
<表达式1> XOR <表达式2>
NOT <表达式>
<表达式> SHL <移位次数>
<表达式> SHR <移位次数>
例4.16
MOV AX,11110000B OR 00000001B
等价于:
MOV AX,11110001B
MOV AX,11011001B SHL 2
等价于:
MOV AX,01100100B
③ 关系表达式
关系运算符有:
EQ(相等)、NE(不相等)、LT(小于)、LE(小于或等于)、GT(大于)、GE(大于或等于)。
结果为布尔量:全1表示真,全0表示假。
例4.17
MOV AX,30 GT 100 等价于: MOV AX,0
MOV AX,20 NE 10 等价于:MOV AX,0FFFFH - 地址表达式
地址表达式是由变量、标号、常量、寄存器等与各种运算符组成的有意义的式子,其结果是一个存储单元的地址或是一个数值。
汇编语言中规定:如果变量或标号出现在表达式中,均是取它们的偏移地址参加运算,而不是取其所对应的存储单元的内容参加运算。
① 析值操作符
析值操作符也称为数值回送操作符,这些操作符能把存储单元地址的一部分作为数值返回。
析值操作符有5个:
SEG、OFFSET、TYPE、LENGTH、SIZE。
1… SEG
格式:SEG <变量/标号>
功能:回送变量或标号的段地址。
例4.18 段定义如下:
data SEGMENT
……
num DW ?
data ENDS
假设该段的段地址是1000H
MOV BX,SEG num 等价于: MOV BX,1000H
- OFFSET
格式:OFFSET <变量/标号>
功能:回送变量或标号的偏移地址。
假设例4.18中变量num所在位置距段首20H个字节,则其偏移属性值为20H。
MOV BX,OFFSET num 等价于: MOV BX,20H - TYPE
格式:TYPE <变量/标号>
功能:返回变量或标号的类型值。
例4.19
X1 DW 100 DUP(?) ; X1是字类型
Y1 DD 1234H,4567H ; Y1是双字类型
则有:
MOV BX,TYPE X1 等价于: MOV BX,2
MOV BX,TYPE Y1 等价于: MOV BX,4 - LENGTH
格式:LENGTH <变量>
功能:在定义变量时如果使用了DUP,则返回分配给该变量的单元数,对于其他情况则返回1。
例4.19 X1 DW 100 DUP(?)
Y1 DD 1234H,4567H
MOV AX,LENGTH X1 等价于:MOV AX,100
MOV AX,LENGTH Y1 等价于:MOV AX,1 - SIZE
格式:SIZE <变量>
功能:返回分配给该变量的字节数,但此值是该变量的LENGTH值和TYPE值的乘积。
例4.19 X1 DW 100 DUP(?)
Y1 DD 1234H,4567H
MOV AX,SIZE X1 等价于:MOV AX,200
MOV AX,SIZE Y1 等价于:MOV AX,4
② 属性操作符
属性操作用来指明某个变量、标号或地址表达式的属性,使它临时具有与原来不同的属性。属性操作符有4个:
PTR、LABEL、THIS、段跨越前缀。
(1)PTR
格式:<类型> PTR <地址表达式>
功能:临时改变标号或变量的类型属性。
类型:BYTE、WORD、DWORD、NEAR、FAR
例4.20 有数据段和变量的定义如下:
data SEGMENT
num DW 1234H
data ENDS
(2) LABEL
格式:<变量/标号> LABEL <类型>
功能:为紧跟在本伪指令后的变量或标号建立新名字,并为该新名字指定类型。
说明:操作符LABEL提供了另一种定义变量或标号的方法,但并不为其分配存储空间。
(3)THIS
格式:THIS <类型>
功能:为紧跟在本伪指令后的变量或标号赋予一个新的类型。
说明:操作符THIS通常与伪指令EQU或=连用,为当前存储单元定义一个具有新类型的名字。
(4)段跨越前缀
格式:段寄存器:<操作数>
功能:为变量或地址表达式指定段属性。
例4.23 MOV AX,ES:[BX]
在该指令中,源操作数的段属性值不再使用DS的内容,而是使用ES的内容。
3.地址计数器与对准伪指令
3.1 地址计数器$
利用汇编程序对源程序进行汇编的过程中,使用地址计数器(用$ 表示)来保存当前正在汇编的指令的偏移地址。在对每一个段进行汇编时,地址计数器$ 被初始化为0,在后继的汇编过程中,每处理一条指令,地址计数器$ 就增加一个值,此值为该指令所占的字节数。
3.2 对准伪指令
(1) ORG
格式:ORG <常数表达式>
功能:指示下一个字节的偏移地址为常数表达式的值。
(2) EVEN
格式:EVEN
功能:使下一个变量或指令开始于偶数字节地址。
例4.26-1 数据段data1的定义如下所示:
data1 SEGMENT
X DB 10H
EVEN
array DW 1234H
data1 ENDS
4. DOS功能调用
4.1 DOS功能调用的一般方法
(1) 功能号送入AH寄存器;
(2) 根据需要设置入口参数;
(3) 使用INT 21H指令转入相应子程序;
(4) 调用结束后,按规定取得出口参数。
4.2 常用的DOS功能调用
- 字符输入(1号功能调用)
格式: MOV AH,01H
INT 21H
功能:从键盘输入一个字符,并将输入字符的ASCII码值送寄存器AL。 - 字符显示(2号功能调用)
格式: MOV AH,02H
MOV DL,待显示字符的ASCII码
INT 21H
功能:将DL中的字符显示在屏幕上。
例4.27 在屏幕上显示字符“6” - 字符串显示(9号功能调用)
格式: MOV AH,09H
LEA DX,字符串首偏移地址
INT 21H
功能:将数据段中DS:DX所指向的以‘ ’结尾的字符串显示在屏幕上。例 4.28 数据段中有如下字符串定义: S t r D B ‘ H e l l o ’结尾的字符串显示在屏幕上。 例4.28 数据段中有如下字符串定义: Str DB ‘Hello ’结尾的字符串显示在屏幕上。例4.28数据段中有如下字符串定义:StrDB‘Hello’
如何在屏幕上显示字符串“Hello”? - 字符串输入(0A号功能调用)
格式: MOV AH,0AH
LEA DX,缓冲区首偏移地址
INT 21H
功能:从键盘向数据段中DS:DX所指的输入缓冲区输入字符串并且在屏幕上显示
输入缓冲区的要求:缓冲区的第0个字节规定缓冲区的大小,其值必须大于0,缓冲区的第1个字节用于存储实际输入字符的个数,从键盘输入的字符从缓冲区的第2个字节开始存放,输入的字符串以回车(0DH)结束,且回车字符也会被存入缓冲区中,但回车字符不计入实际输入的字符个数之中,当输入的字符个数超过了缓冲区大小时,多余字符将被忽略且扬声器发出警告。
- 带返回码终止(4C号功能调用)
格式: MOV AH,4CH
MOV AL,00H
INT 21H
功能:结束用户程序,返回DOS系统,并带回返回码0。
说明:作为主程序的最后三条指令,用于确保用户程序能正常返回DOS系统而不致于死机。
4.3 汇编语言源程序格式
根据将来生成的可执行文件的种类,汇编语言源程序格式可以分为两种:
EXE文件格式和COM文件格式。
本节只介绍EXE文件格式,COM文件格式将在第7章介绍。
EXE文件格式汇编语言源程序结构如下:
DATA SEGMENT
……;数据段
DATA ENDS
EXTRA SEGMENT
…… ;附加段
EXTRA ENDS
STACK SEGMENT STACK
…… ;堆栈段
STACK ENDS
4.4 汇编语言程序的上机过程
4.4.1 汇编语言程序的工作环境
运行汇编语言程序,需要有以下文件:
(1) 编辑程序:EDIT.EXE
(2) 汇编程序:MASM.EXE
(3) 连接程序:LINK.EXE、TLINK.EXE
(4) 调试程序:DEBUG.COM
4.4.2 建立ASM文件
打开编辑程序EDIT,建立文本文件。
注意的事项:
(1) 每条汇编语言指令和伪指令都单独占一行,不允许两条或两条以上指令放在一行,也不允许一条指令分成几行;
(2) 源程序中使用的字符均为半角;
(3) 源文件的扩展名必须为ASM。
4.4.3 用MASM程序生成OBJ文件
MASM是DOS环境下所运行的一种功能很强的宏汇编程序,主要功能是进行语法检查并生成OBJ文件
4.4.4 用LINK程序产生EXE文件
OBJ文件并不是可执行文件,还必须使用连接程序(LINK)把OBJ文件转换为可执行的EXE文件。
4.4.5 调试程序DEBUG
DEBUG提供了一个控制测试的环境,监视和控制被测试程序的执行,可以直接发现和确定程序中的问题。