1
第 4章汇编语言程序设计
2
主要内容:
汇编语言源程序的结构
汇编语言语句格式
伪指令
功能调用
汇编语言程序设计
3
§ 4.1 汇编语言源程序了解:
计算机的三种语言
源程序的结构
汇编语言语句格式
4
一、计算机设计语言机器语言汇编语言高级语言面向机器的语言机器语言 汇编语言 高级语言
5
汇编程序
汇编语言源程序用助记符编写源程序的编译程序汇编程序汇编语言源程序 机器语言目标程序
6
汇编语言程序设计与执行过程
输入汇编语言源程序 源文件,ASM
汇编(编译) 目标文件,OBJ
链接 可执行文件,EXE
调试 最终程序
7
二、汇编语言源程序结构数据段名 SEGMENT
…
数据段名 ENDS
附加段名 SEGMENT
…
附加段名 ENDS
堆栈段名 SEGMENT
…
堆栈段名 ENDS
代码段名 SEGMENT
…
代码段名 ENDS
8
三、汇编语言语句类型指令性语句指示性语句
CPU执行的语句,
能够生成目标代码
CPU不执行,而由汇编程序执行的语句,
不生成目标代码
9
四、汇编语言语句格式指令性语句:
[标号,] [前缀 ] 助记符 [操作数 ],[操作数 ] [ ;注释 ]
指令的符号地址,
标号后要有冒号 操作码 注释前加分号
10
指示性语句格式
[名字 ] 伪指令助记符 操作数 [,操作数,… ] [ ;注释 ]
变量的符号地址,
其后不加冒号 指示性语句中至少有一个操作数
11
标号、名字
标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。
英文字母、数字及专用字符组成,最大长度不能超过 31个,且不能由数字打头,不能用保留字
(如寄存器名,指令助记符,伪指令 )。
12
操作码指令码 命令 CPU要完成的操作伪指令助记符指示汇编程序要完成的操作。
用来定义变量,分配存储单元,
指示程序开始和结束等
13
注释
用分号作为注释的开始;
用于说明程序或语句的功能,以便于阅读和理解
14
操作数寄存器存储器单元常量变量或标号表达式
15
常量
数字常量
字符串常量:用引号引起的字符或字符串
例:‘ A’,’ABCD’
汇编时被译成对应的 ASCII
码 41H,42H,43H,44H
16
变量
代表内存中的数据区,程序中视为存储器操作数
变量的属性:
段 值 变量所在段的段地址偏移量 变量单元地址与段首地址之间的位移量 。
类 型 字节型,字型和双字型
17
五、表达式算术运算逻辑运算关系运算取值运算和属性运算其它运算
18
算术运算和逻辑运算符
算术运算符 +,-,*,/,MOD
逻辑运算符 AND,OR,NOT,XOR
例,MOV AL,8 AND 4
MOV AL,8+4-1
19
关系运算符
参与关系运算的必须是两个数值
关系不成立,结果为 0;
关系成立,结果为 FFFFH。
EQ
NE
LT
GT
LE
GE
20
取值运算符取值 运算符用于分析存储器操作数的属性
21
取值运算符
OFFSET 取得其后变量或标号的偏移地址
SEG 取得其后变量或标号的段地址
TYPE 取 变量的类型
LENGTH 取所定义存储区的长度
SIZE 取所定义存储区的字节数
22
取值运算符例
MOV AX,SEG DATA
MOV DS,AX
MOV BX,OFFSET DATA
LEA BX,DATA
等价于
23
取值运算符例
若 BUFFER存储区是用如下伪指令定义:
BUFFER DW 200 DUP(0)
则:
TYPE BUFFER 等于 2
LENGTH BUFFER 等于 200
SIZE BUFFER 等于 400
24
属性运算符属性 运算符 PTR
用于指定其后存储器操作数的类型例:
MOV BYTR PTR[BX],12H
25
其它运算符
方括号:
[ ] 方括号中内容为操作数的偏移地址
段重设符段寄存器名,[ ] 用于修改默认的段基地址
26
§ 4.2 伪指令掌握:
伪指令的格式及实现的操作
伪指令的应用
27
伪指令
由汇编程序执行的“指令系统”
用于定义变量、分配存储区、定义逻辑段、指示程序开始和结束等
28
常用伪指令数据定义伪指令符号定义伪指令段定义伪指令过程定义伪指令结束伪指令
29
一、数据定义伪指令
用于定义数据区中变量的类型
格式:
变量名 伪指令助记符 操作数,… ;注释某些情况下可省略可选
30
数据定义伪指令伪指令助记符
DB 定义的变量为 字节型
DW 定义的变量为 字类型(双字节)
DD 定义的变量为 双字型( 4字节)
DQ 定义的变量为 4字型( 8字节)
DT 定义的变量为 10字节型
31
数据定义伪指令例
DATA1 DB 11H,22H,33H,44H
DATA2 DW 11H,22H,3344H
DATA3 DD 11H*2,22H,33445566H
以上变量在内存中的存放形式
32
数据定义伪指令
伪指令的性质决定所定义变量的属性;
定义字符串必须用 DB伪指令
例:
DATA1 DB ‘ABCD’,66H
‘
A’‘
B’‘
C’‘
D’
41H
42H
43H
44H
66H
33
重复操作符
为一个数据区的各单元设置相同的初值
格式:
[变量名 ] 伪指令助记符 n DUP( 初值,… )
例:
BW 20 DUP( 0)
DB 3 DUP( 22H,11H,?)
随机数
34
用?预留存储空间
MEM1 DB 34H,’A’,?,?,?
DW 20 DUP(?)
预留 40个字节单元
35
二、符号定义伪指令
格式:
符号名 EQU 表达式
操作:
用符号名取代后边的表达式,不可重新定义
例:
CONSTANT EQU 100
VAR EQU 30H+99H
EQU说明的表达式不占用内存空间
36
三、段定义伪指令
说明逻辑段的起始和结束;
说明不同程序模块中同类逻辑段之间的联系形态
37
段定义伪指令段名 SEGMENT [定位类型 ] [组合类型 ] [’类别 ’]
┇
段名 ENDS
说明逻辑段的起点说明不同模块中同名段的组和连接方式
38
定位类型
PARA,段的起点从节边界开始( 16个字节为
1节)
BYTE,段的起点从存储器任何地址开始
WORD,段的起点从偶地址开始
PAGE,段的起点从页边界开始( 256个字节为 1页)
39
组合类型与其它模块中的同名段在满足定位类型的前提下具有的组合方式:
NONE,不组合
PUBLIC,依次连接(顺序由 LINK程序确定)
COMMON,覆盖连接
STACK,堆栈段的依次连接
AT 表达式:段定义在表达式值为段基的节边界
MEMORY,相应段在同名段的最高地址处。
40
类别
不同模块连接时将相同类别的段放在连续的内存区域中
41
段定义伪指令例
DATA SEGMENT PUBLIC ‘CODE’
MEM1 DB 11H,22H
DATA ENDS
42
四、设定段寄存器伪指令
说明所定义逻辑段的性质
格式
ASSUME 段寄存器名:段名
[,段寄存器名:段名,…]
43
五、结束伪指令
表示源程序结束
格式:
END [标号 ]
44
一个完整源程序结构例
DSEG SEGMENT
DATA1 DB 1,2,
DATA2 DW 1234H
DSEG ENDS
ESEG SEGMENT
DB 20 DUP(?)
ESEG ENDS
SSEG SEGMENT STACK ‘STACK’
DB 200 DUP(?)
SSEG ENDS
45
一个完整源程序结构例
CSEG SEGMENT
ASSUME CS,CSEG,DS,DSEG,
ES,ESEG,SS,SSEG
START,MOV AX,DSEG
MOV DS,AX
MOV AX,ESEG
MOV ES,AX
MOV AX,SSEG
MOV SS,AX
┇
CSEG ENDS
END START
源程序代码
46
六、过程定义伪指令
用于定义一个过程体
格式:
过程名 PROC [ NEAR / FAR ]
┇
RET
过程名 ENDP
过程入口的符号地址 P166例
47
七、宏命令伪指令
宏命令 --------源程序中由汇编程序识别的具有独立功能的一段程序代码
格式:
宏命令名 MACRO <形式参数 >
┇
┇
ENDM 宏体
P167例
48
八、其它伪指令
ORG ------- 段内程序代码或变量的起始偏移地址
格式:
ORG 表达式
例:
ORG 2000H
计算值为非负常数
49
其它伪指令
NAME-------为目标程序设定一个名字
格式:
NAME 模块名
TITLE-------为程序清单指定打印标题
格式:
TITLE 标题名 可以缺省
P169例
50
§ 4.3 功能调用
DOS 功能调用 高级调用,操作系统提供
BIOS功能调用 低 级调用
51
DOS 功能调用
包含多个子功能的功能包,用软中断指令调用,中断类型码固定为 21H;
各子功能采用功能号来区分。
附录 C
52
DOS 功能调用设备 管理目录 管理文件管理其它
53
DOS 功能调用
调用格式:
MOV AH,功能号
<置相应参数 >
INT 21H
54
1.从键盘输入单字符并显示
调用方法:
MOV AH,01
INT 21H
输入的字符在 AL中
55
单字符输入例
GET_KEY,MOV AH,1
INT 21H
CMP AL,’Y’
JZ YES
CMP AL,’N’
JZ NO
JNZ GET_KEY
YES,┇
NO,┇
交互式应答程序
56
2,从键盘输入字符串
AH 功能号 OAH
DS,DX 字符串在内存中的存放地址
INT 21H
57
定义字符缓冲区
用户自定义缓冲区格式:
0DHN1 N2
整个缓冲区最大键入字符数实际键入字符数
58
输入字符串程序段
DAT1 DB 20,?,20 DUP(?)
LEA DX,DAT1
MOV AH,0AH
INT 21H
在数据段中定义
59
输入缓冲区
14H
?
20个字节定义后的输入缓冲区初始状态:
60
3,单字符显示输出
AH 功能号 O2H
DL 待输出字符
INT 21H
61
单字符显示输出例
MOV AH,02
MOV DL,41H
INT 21H
执行结果:
屏幕显示 A
62
4,字符串输出显示
AH 功能号 O9H
DS,DX 待输出字符串的偏移地址
INT 21H
63
字符串输出显示
被显示的字符串必须以 ‘ $’ 结束,且所显示的内容不应出现非可见的 ASCII码
64
字符串输出显示例
DATA SEGMENT
MESS1 DB ‘Input String:’ 0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
┇
MOV AH,09
MOV DX,OFFSET MESS1
INT 21H
┇
65
§ 4.4 汇编语言程序设计设计步骤:
根据实际问题抽象出数学模型
确定算法
画程序流程图
分配内存工作单元和寄存器
程序编码
调试
66
程序流程图符号起始:
功能:
判断:
子过程:
67
在计算机上进行程序设计过程
D:\masm>EDIT 输入源程序
D:\masm>MASM 汇编
D:\masm>LINK 链接
D:\masm>TD 调试
68
作业:
4.1
4.2
4.6
4.15
4.16
第 4章汇编语言程序设计
2
主要内容:
汇编语言源程序的结构
汇编语言语句格式
伪指令
功能调用
汇编语言程序设计
3
§ 4.1 汇编语言源程序了解:
计算机的三种语言
源程序的结构
汇编语言语句格式
4
一、计算机设计语言机器语言汇编语言高级语言面向机器的语言机器语言 汇编语言 高级语言
5
汇编程序
汇编语言源程序用助记符编写源程序的编译程序汇编程序汇编语言源程序 机器语言目标程序
6
汇编语言程序设计与执行过程
输入汇编语言源程序 源文件,ASM
汇编(编译) 目标文件,OBJ
链接 可执行文件,EXE
调试 最终程序
7
二、汇编语言源程序结构数据段名 SEGMENT
…
数据段名 ENDS
附加段名 SEGMENT
…
附加段名 ENDS
堆栈段名 SEGMENT
…
堆栈段名 ENDS
代码段名 SEGMENT
…
代码段名 ENDS
8
三、汇编语言语句类型指令性语句指示性语句
CPU执行的语句,
能够生成目标代码
CPU不执行,而由汇编程序执行的语句,
不生成目标代码
9
四、汇编语言语句格式指令性语句:
[标号,] [前缀 ] 助记符 [操作数 ],[操作数 ] [ ;注释 ]
指令的符号地址,
标号后要有冒号 操作码 注释前加分号
10
指示性语句格式
[名字 ] 伪指令助记符 操作数 [,操作数,… ] [ ;注释 ]
变量的符号地址,
其后不加冒号 指示性语句中至少有一个操作数
11
标号、名字
标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。
英文字母、数字及专用字符组成,最大长度不能超过 31个,且不能由数字打头,不能用保留字
(如寄存器名,指令助记符,伪指令 )。
12
操作码指令码 命令 CPU要完成的操作伪指令助记符指示汇编程序要完成的操作。
用来定义变量,分配存储单元,
指示程序开始和结束等
13
注释
用分号作为注释的开始;
用于说明程序或语句的功能,以便于阅读和理解
14
操作数寄存器存储器单元常量变量或标号表达式
15
常量
数字常量
字符串常量:用引号引起的字符或字符串
例:‘ A’,’ABCD’
汇编时被译成对应的 ASCII
码 41H,42H,43H,44H
16
变量
代表内存中的数据区,程序中视为存储器操作数
变量的属性:
段 值 变量所在段的段地址偏移量 变量单元地址与段首地址之间的位移量 。
类 型 字节型,字型和双字型
17
五、表达式算术运算逻辑运算关系运算取值运算和属性运算其它运算
18
算术运算和逻辑运算符
算术运算符 +,-,*,/,MOD
逻辑运算符 AND,OR,NOT,XOR
例,MOV AL,8 AND 4
MOV AL,8+4-1
19
关系运算符
参与关系运算的必须是两个数值
关系不成立,结果为 0;
关系成立,结果为 FFFFH。
EQ
NE
LT
GT
LE
GE
20
取值运算符取值 运算符用于分析存储器操作数的属性
21
取值运算符
OFFSET 取得其后变量或标号的偏移地址
SEG 取得其后变量或标号的段地址
TYPE 取 变量的类型
LENGTH 取所定义存储区的长度
SIZE 取所定义存储区的字节数
22
取值运算符例
MOV AX,SEG DATA
MOV DS,AX
MOV BX,OFFSET DATA
LEA BX,DATA
等价于
23
取值运算符例
若 BUFFER存储区是用如下伪指令定义:
BUFFER DW 200 DUP(0)
则:
TYPE BUFFER 等于 2
LENGTH BUFFER 等于 200
SIZE BUFFER 等于 400
24
属性运算符属性 运算符 PTR
用于指定其后存储器操作数的类型例:
MOV BYTR PTR[BX],12H
25
其它运算符
方括号:
[ ] 方括号中内容为操作数的偏移地址
段重设符段寄存器名,[ ] 用于修改默认的段基地址
26
§ 4.2 伪指令掌握:
伪指令的格式及实现的操作
伪指令的应用
27
伪指令
由汇编程序执行的“指令系统”
用于定义变量、分配存储区、定义逻辑段、指示程序开始和结束等
28
常用伪指令数据定义伪指令符号定义伪指令段定义伪指令过程定义伪指令结束伪指令
29
一、数据定义伪指令
用于定义数据区中变量的类型
格式:
变量名 伪指令助记符 操作数,… ;注释某些情况下可省略可选
30
数据定义伪指令伪指令助记符
DB 定义的变量为 字节型
DW 定义的变量为 字类型(双字节)
DD 定义的变量为 双字型( 4字节)
DQ 定义的变量为 4字型( 8字节)
DT 定义的变量为 10字节型
31
数据定义伪指令例
DATA1 DB 11H,22H,33H,44H
DATA2 DW 11H,22H,3344H
DATA3 DD 11H*2,22H,33445566H
以上变量在内存中的存放形式
32
数据定义伪指令
伪指令的性质决定所定义变量的属性;
定义字符串必须用 DB伪指令
例:
DATA1 DB ‘ABCD’,66H
‘
A’‘
B’‘
C’‘
D’
41H
42H
43H
44H
66H
33
重复操作符
为一个数据区的各单元设置相同的初值
格式:
[变量名 ] 伪指令助记符 n DUP( 初值,… )
例:
BW 20 DUP( 0)
DB 3 DUP( 22H,11H,?)
随机数
34
用?预留存储空间
MEM1 DB 34H,’A’,?,?,?
DW 20 DUP(?)
预留 40个字节单元
35
二、符号定义伪指令
格式:
符号名 EQU 表达式
操作:
用符号名取代后边的表达式,不可重新定义
例:
CONSTANT EQU 100
VAR EQU 30H+99H
EQU说明的表达式不占用内存空间
36
三、段定义伪指令
说明逻辑段的起始和结束;
说明不同程序模块中同类逻辑段之间的联系形态
37
段定义伪指令段名 SEGMENT [定位类型 ] [组合类型 ] [’类别 ’]
┇
段名 ENDS
说明逻辑段的起点说明不同模块中同名段的组和连接方式
38
定位类型
PARA,段的起点从节边界开始( 16个字节为
1节)
BYTE,段的起点从存储器任何地址开始
WORD,段的起点从偶地址开始
PAGE,段的起点从页边界开始( 256个字节为 1页)
39
组合类型与其它模块中的同名段在满足定位类型的前提下具有的组合方式:
NONE,不组合
PUBLIC,依次连接(顺序由 LINK程序确定)
COMMON,覆盖连接
STACK,堆栈段的依次连接
AT 表达式:段定义在表达式值为段基的节边界
MEMORY,相应段在同名段的最高地址处。
40
类别
不同模块连接时将相同类别的段放在连续的内存区域中
41
段定义伪指令例
DATA SEGMENT PUBLIC ‘CODE’
MEM1 DB 11H,22H
DATA ENDS
42
四、设定段寄存器伪指令
说明所定义逻辑段的性质
格式
ASSUME 段寄存器名:段名
[,段寄存器名:段名,…]
43
五、结束伪指令
表示源程序结束
格式:
END [标号 ]
44
一个完整源程序结构例
DSEG SEGMENT
DATA1 DB 1,2,
DATA2 DW 1234H
DSEG ENDS
ESEG SEGMENT
DB 20 DUP(?)
ESEG ENDS
SSEG SEGMENT STACK ‘STACK’
DB 200 DUP(?)
SSEG ENDS
45
一个完整源程序结构例
CSEG SEGMENT
ASSUME CS,CSEG,DS,DSEG,
ES,ESEG,SS,SSEG
START,MOV AX,DSEG
MOV DS,AX
MOV AX,ESEG
MOV ES,AX
MOV AX,SSEG
MOV SS,AX
┇
CSEG ENDS
END START
源程序代码
46
六、过程定义伪指令
用于定义一个过程体
格式:
过程名 PROC [ NEAR / FAR ]
┇
RET
过程名 ENDP
过程入口的符号地址 P166例
47
七、宏命令伪指令
宏命令 --------源程序中由汇编程序识别的具有独立功能的一段程序代码
格式:
宏命令名 MACRO <形式参数 >
┇
┇
ENDM 宏体
P167例
48
八、其它伪指令
ORG ------- 段内程序代码或变量的起始偏移地址
格式:
ORG 表达式
例:
ORG 2000H
计算值为非负常数
49
其它伪指令
NAME-------为目标程序设定一个名字
格式:
NAME 模块名
TITLE-------为程序清单指定打印标题
格式:
TITLE 标题名 可以缺省
P169例
50
§ 4.3 功能调用
DOS 功能调用 高级调用,操作系统提供
BIOS功能调用 低 级调用
51
DOS 功能调用
包含多个子功能的功能包,用软中断指令调用,中断类型码固定为 21H;
各子功能采用功能号来区分。
附录 C
52
DOS 功能调用设备 管理目录 管理文件管理其它
53
DOS 功能调用
调用格式:
MOV AH,功能号
<置相应参数 >
INT 21H
54
1.从键盘输入单字符并显示
调用方法:
MOV AH,01
INT 21H
输入的字符在 AL中
55
单字符输入例
GET_KEY,MOV AH,1
INT 21H
CMP AL,’Y’
JZ YES
CMP AL,’N’
JZ NO
JNZ GET_KEY
YES,┇
NO,┇
交互式应答程序
56
2,从键盘输入字符串
AH 功能号 OAH
DS,DX 字符串在内存中的存放地址
INT 21H
57
定义字符缓冲区
用户自定义缓冲区格式:
0DHN1 N2
整个缓冲区最大键入字符数实际键入字符数
58
输入字符串程序段
DAT1 DB 20,?,20 DUP(?)
LEA DX,DAT1
MOV AH,0AH
INT 21H
在数据段中定义
59
输入缓冲区
14H
?
20个字节定义后的输入缓冲区初始状态:
60
3,单字符显示输出
AH 功能号 O2H
DL 待输出字符
INT 21H
61
单字符显示输出例
MOV AH,02
MOV DL,41H
INT 21H
执行结果:
屏幕显示 A
62
4,字符串输出显示
AH 功能号 O9H
DS,DX 待输出字符串的偏移地址
INT 21H
63
字符串输出显示
被显示的字符串必须以 ‘ $’ 结束,且所显示的内容不应出现非可见的 ASCII码
64
字符串输出显示例
DATA SEGMENT
MESS1 DB ‘Input String:’ 0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
┇
MOV AH,09
MOV DX,OFFSET MESS1
INT 21H
┇
65
§ 4.4 汇编语言程序设计设计步骤:
根据实际问题抽象出数学模型
确定算法
画程序流程图
分配内存工作单元和寄存器
程序编码
调试
66
程序流程图符号起始:
功能:
判断:
子过程:
67
在计算机上进行程序设计过程
D:\masm>EDIT 输入源程序
D:\masm>MASM 汇编
D:\masm>LINK 链接
D:\masm>TD 调试
68
作业:
4.1
4.2
4.6
4.15
4.16