第 4章 汇编语言程序设计
2
微机原理及应用本章主要内容:
汇编语言源程序的结构
汇编语言语句格式
伪指令
功能调用
汇编语言程序设计
3
微机原理及应用一、计算机设计语言机器语言汇编语言高级语言面向机器的语言机器语言 汇编语言 高级语言
4
微机原理及应用汇编程序
汇编语言源程序用助记符编写源程序的编译程序汇编程序汇编语言源程序 机器语言目标程序
5
微机原理及应用二、汇编语言源程序结构数据段名 SEGMENT

数据段名 ENDS
附加段名 SEGMENT

附加段名 ENDS
堆栈段名 SEGMENT

堆栈段名 ENDS
代码段名 SEGMENT

代码段名 ENDS
6
微机原理及应用三、汇编语言语句类型指令性语句指示性语句
CPU执行的语句,
能够生成目标代码
CPU不执行,而由汇编程序执行的语句,
不生成目标代码
7
微机原理及应用四、汇编语言语句格式指令性语句:
[标号,] [前缀 ] 助记符 [操作数 ],[操作数 ] [ ;注释 ]
指令的符号地址,
标号后要有冒号操作码 注释前加分号指示性语句格式:
[名字 ] 伪指令助记符 操作数 [,操作数,… ] [ ;注释 ]
变量的符号地址,其后不加冒号 指示性语句中至少有一个操作数
8
微机原理及应用区分标号和名字
标号后有冒号,在指令性语句前;名字后不加冒号,在指示性语句前。
英文字母、数字及专用字符组成,最大长度不能超过 31个,且不能由数字打头,不能用保留字 (如寄存器名,指令助记符,伪指令 )。
9
微机原理及应用数据项及表达式寄存器存储器单元常量变量或标号表达式操作数
10
微机原理及应用常量
数字常量,没有任何属性的纯数值。在汇编期间,
它的值已能完全确定,且在程序运行中,它也不会发生变化。
字符串常量,用引号引起的字符或字符串例:‘ A’,’ ABCD’
汇编时被译成对应的 ASCII
码 41H,42H,43H,44H
11
微机原理及应用常数的应用在程序中,常数主要出现在:
1)指令语句源操作数中做立即数,它应与目的操作数的位数相一致,可以是 8位或 16位的。
2)在指令语句中的基址加变址的寻址方式中作位移量。
3)在数据定义伪指令中。
例如:
MOV AX,1234H
MOV BX,[SI+32H]
DB 12H ; 定义一个字节数据
12
微机原理及应用变 量变量是代表存放在某些存储单元的数据,
这些数据在程序运行期间随时可以修改。
为了便于对变量的访问,它常常以变量名的形式出现程序中,它可以认为是存放在数据存储单元的符号地址。
( 1) 变量的定义与预置
( 2) 数据定义伪指令
13
微机原理及应用变量的定义与预置定义变量就是给变量分配存储单元,且对这个存储单元赋予一个符号名,即变量名,同时将这些存储单元预置初值 。
VAR-DATA SEGMENT
DATA1 DB 12H
DATA2 DB 34H
DATA3 DW 9876H
VAR-DATA ENDS
14
微机原理及应用变量的属性定义变量是用数据定义伪指令 DB,DW,
DD等。经过定义的变量,每个变量均有三个属性:
( 1) 段属性 (SEG)
( 2) 偏移量属性 (OFFSET)
( 3) 类属性( TYPE)
15
微机原理及应用段属性
段属性 ( SEG),表示变量存放在哪一个逻辑中,
即变量所在段的段基值 。
例如,VAR-DATA SEGMENT
DATA1 DB 12H
DATA2 DB 34H
DATA3 DW 9876H
VAR-DATA ENDS
三个变量都存放在 VAR_DATA逻辑段中 。 当在指令中要对这些变量进行存取操作时,事先要把它们所在段的段基值存放在某一个段寄存器中 。
16
微机原理及应用偏移量属性
偏移量属性( OFFSET),表示变量在逻辑段中离段起始点的字节 数。
例如变量 DATA1的偏移量为 0,而 DATA2的偏移量为 1,DATA3的偏移量为 2。
段属性和偏移量属性构成了变量的逻辑地址。
类属性
类属性( TYPE),表示变量占用存储单元的字节数。
类属性是由数据定义伪指令 DB,DW,DD来规定的。
变量 DATA1,DATA2的类属性为字节;而 DATA3的类属性为字;如果用 DD定义,类属性为双字。
17
微机原理及应用标号
标号是 一条指令目标代码的符号地址,它常作为转移指令(含子程序调用指令)的操作数。
与变量相似,每个标号亦具有三个属性:
( 1)段属性,表示这条指令目标代码在哪个逻辑段中。
( 2)偏移量属性,表示这条指令目标代码的首字节在段内离段起始点的字节数。
( 3)距离属性,表示本标号可作为段内或段间的转移特性。距离属性又分为 NEAR(近 )属性和
FAR(远 )属性。
18
微机原理及应用五,表达式与运算符
表达式由操作数和运算符组成,而运算符主要由以下几种类型组成:
一、算术运算符 (自学 )
二、逻辑运算符 (自学 )
三、关系运算符 (自学 )
四、取值运算和属性运算符五、其它运算符
19
微机原理及应用算术运算符 (自学 )
+,-,*,/:加减乘除运算符
MOD:除法取余运算符例如,MOV AL,32 MOD 5 ; ( AL) = 2
逻辑运算符 (自学 )
AND:逻辑,与,操作符
OR:逻辑,或,操作符
XOR:,异或,操作符
NOT:逻辑,非,操作符例如,MOV AL,24H AND 0FH;( AL) =04H
24H XOR 0FH = 2BH
20
微机原理及应用关系运算符 (自学 )
参与关系运算的必须是两个数值,关系运算是数值型的。
关系运算是逻辑判定式,当为“真”时结果取
0FFFFH,当为“假”时结果取 0。
EQ 等于 LE 小于等于
NE 不等于 GT 大于
LT 小于 GE 大于等于例如:
5 LT 6 = 0FFFFH
21
微机原理及应用取值运算符
OFFSET 取得其后变量或标号的偏移地址
SEG 取得其后变量或标号的段地址
TYPE 取 变量的类型
LENGTH 取所定义存储区的长度
SIZE 取所定义存储区的字节数用于分析存储器操作数的属性
22
微机原理及应用取值运算符例
MOV AX,SEG DATA
MOV DS,AX
MOV BX,OFFSET DATA
LEA BX,DATA
等价于
23
微机原理及应用属性运算符属性 运算符 PTR
用于指定其后存储器操作数的类型格式,(类型) PTR(符号名)
例 1,MOV BYTE PTR[BX],12H
例 2:已知内存变量 D1是字节属性,要把它的两个字节内容送到 AX中。
MOV AX,WORD PTR D1
24
微机原理及应用其它运算符
方括号:
[ ] 方括号中内容为操作数的偏移地址
段重设符段寄存器名,[ ] 用于修改默认的段基地址
例:
MOV AX,[BX]
MOV AX,ES,[BX]
25
微机原理及应用
4.2 伪指令掌握:
伪指令的格式及实现的操作
伪指令的应用
26
微机原理及应用伪指令
由汇编程序执行的“指令系统”。 伪指令没有对应的机器指令,它 不是由 8086/8088CPU
来执行,而是 由 MASM-86识别,并完成相应的功能 。
用于定义变量、分配存储区、定义逻辑段、
指示程序开始和结束等
27
微机原理及应用标号名 伪指令 操作数 注释

伪指令语句格式
这是一个任选字段。标号名后面不能用冒号“:”,这是它与指令语句的突出区别。不同的伪指令,标号名可以是常量名、变量名、过程名、结构名、记录名等。它们可以作为伪指令语句和指令语句的操作数,这时,标号名就表示一个常量或存储器地址。
这是伪指令语句不可省略的主要成分。伪指令种类很多,如定义数据伪指令 DB,DW,DD;段定义伪指令 SEGMENT;定义过程伪指令 PROC等。它们是伪指令语句要求汇编程序完成的具体操作命令。
本字段是否需要,需要几个,需要什么样的操作数等都由伪指令字段中伪指令来确定。操作数可以是一个常数、字符串、常量名、变量名、标号、一些专用的符号等。
这是一个任选字段,
它必须以分号为开始,它的作用与指令语句的注释字段相同。
伪指令语句格式
28
微机原理及应用伪指令
MASM-86识别的 伪指令可分成以下几类:
( 1) 符号定义伪指令 ( 8) 定位伪指令
( 2) 内存数据定义伪指令 ( 9) 列表伪指令
( 3) 段定义伪指令 ( 10) 系统隐含进位制伪指令
( 4) 段寄存器说明伪指令 ( 11) 连接伪指令
( 5) 子程序定义伪指令 ( 12) 记录伪指令
( 6) 模块开始伪指令 ( 13) 结构伪指令
( 7) 模块结束伪指令 ( 14) 块注释伪指令
( 15) 宏命令伪指令
29
微机原理及应用符号定义伪指令
格式:
( 1) 〈 名字 〉 EQU〈 表达式 〉
( 2) 〈 名字 〉 =〈 表达式 〉
作用,把表达式的值赋给符号名。
区别,在同一程序中,用 EQU语句赋值的符号名不能被重新赋值,但用,=” 号赋值的符号名可以被重新赋值。
30
微机原理及应用符号定义伪指令
例:
CONSTANT EQU 100
VAR EQU 30H+99H
EQU说明的表达式不占用内存空间
31
微机原理及应用内存数据定义伪指令
用于定义数据区中变量的类型
此指令主要有以下五大类:
字节定义伪指令 DB 定义的变量为字节型
字定义伪指令 DW 定义的变量为字类型
四字节定义伪指令 DD 定义的变量为双字型
八字节定义伪指令 DQ 定义的变量为 4字型
十字节定义伪指令 DT 定义的变量为 10字节型
32
微机原理及应用字节定义伪指令
格式:
[名字 ] DB〈 表达式或数据项表 〉
表达式值或项表中的每一项是一个字节数,它们从符号名地址开始按 字节 连续 存放,直到表中数据项结束
(地址递增方向)。方括号 [ ]表示该项可以缺省。
字定义伪指令
格式:
[名字 ] DW 〈 表达式或数据项 〉
除表达式值或项表中的每一项是两个字节数之外,其它与 DB伪指令相同。
33
微机原理及应用四字节定义伪指令? 格式:
[名字 ] DD〈 表达式或数据项 〉
表达式值或项表的每一项是四个字节数。
八字节定义伪指令
格式:
[名字 ] DQ 〈 表达式或数据项表 〉
表达式值或数据项表的每一项是八字节数,各项从小地址一端连续存放,允许浮点数形式,与 DD伪指令相同。
高四个字节填 0。
34
微机原理及应用十字节定义伪指令
格式:
[名字 ] DT〈 表达式或数据项表 〉
表达式值或数据项表的每一项是 10个字节数,允许浮点数形式,与 DQ伪指令相同,若项表中的数据项是十进制整数书写的,汇编程序按组合的 BCD码格式存放,最低字节在高地址一端存放,数据的最高字节的最高位是符号位,,0” 表示正,,1” 表示负 。
35
微机原理及应用数据定义伪指令
该伪指令主要为数据项分配存储单元并预初值 。
该伪指令构成的 语句格式 是:
DB
变量名 + DW +表达式 1,表达式 2,?
DD
其中表达式 1,表达式 2,? 是给变量赋予的初值。
表达式可以有如下几种情况:
( 1)数值表达式
( 2)?表达式
( 3)字符串表达式
( 4)带 DUP表达式
36
微机原理及应用数值表达式
例如,DA_BYTE DB 50H,50
DA_WORD DW 0A3F1H,4981H
变量 DA_BYTE的内容为 50H,它的下一个字节为 32H。
DA_WORD字单元 内容为 0A3F1H,它的下一字单元为 4981H。
?表达式
不带引号的?表示可预置任何内容。
例如,DA_B DB?,?
DA_W DW?,?
第一条语句是要求汇编程序分配两个字节单位,第二条语句是要求分配两个字单元。这些单元里现在可以是任意值。
37
微机原理及应用字符串表达式
DB伪指令,为字符串中每一个字符分配 一个字节 单元 。 字符串必须是用引号括起来且不超过 255个字符 。
字符串自左至右以字符的 ASCII码按地址递增的排列顺序依次存放 。
DW伪指令,可以给两个字符组成的字符串分配 两个字节 存储器单元,且这两个字符 ASCII码的存储顺序是前一字符在高字节,后一字符在低字节,每一个数据项不能多于两个字符 。
DD伪指令,仅可给两个字符组成的字符串分配 四个字节 单元,且这两个字符 ASCII码是存储在两个低字节中,两个高字节均存放 00H。
38
微机原理及应用字符串表达式动画
STRING1 DB ‘ABCDEF’
STRING2 DW ‘AB’,’CD’,
’EF’
STRING3 DD ‘AB’,CD’
39
微机原理及应用带 DUP表达式
DUP是定义重复数据操作符。
使用 DUP操作符格式是:
DB
变量名 + DW +表达式 1 DUP (表达式 2)
DD
其中表达式 1是重复的次数,表达式 2是重复的内容例如:
BB1 DB 12H DUP(’ ABCD’)
BB2 DW 10H DUP( 4)
40
微机原理及应用
ARRAY1 DB 2 DUP(0,1,2,?)
ARRAY2 DB 100 DUP(0,2 DUP(1,2),0,3)
700bytes
ARRAY2
例 题 动画
41
微机原理及应用内存数据定义伪指令例题

VAR1 DB 32H,‘ ABC’
VAR2 DW 1234H,40H,‘ AB’
DD 12345678H
DB?,11000011B
ARRY1 DB 2 DUP( 0,1)
ARRY2 DW 2 DUP(?,1)

--
C3 H
00H
01H
00H
- -
01H
00H
- -
- -
01H
00H
第一组字方式的?,1
11000011B
A RRY1
A RRY2
01H
- -
预留的存储单元第一组字节方式的0,1
第二组字节方式的0,1
第二组字方式的?,1
.
.
.
( 上接左下)
32H
41H
42H
43H
34H
40H
42H
41H
78H
56H
34H
12H
1234H
0040H
' A '
12345678H
' A '
' B '
' C '
V A R 1
V A R 2
12H
00H
' B '
.
.
.
(下 接右上)
42
微机原理及应用段定义伪指令
存储器在逻辑上是分段的,各段的定义由伪指令实现
格式:
〈 段名 〉 SEGMENT[ 定位方式 ][ 连接方式 ][ 类 别名 ]
:::
〈 段名 〉 ENDS
段定义伪指令为程序的汇编和连接说明了段名、分段的各种属性以及分段的开始和结束。段名是自定义符,
开始的段名与结束的段名必须相同。段的长度不超过
64KB(字节 )。 SEGMENT后面的参数是可选项。
43
微机原理及应用定位方式
定位方式制定段的起始地址边界,方式有以下四种:
( 1) PAGE,指定起始地址的低 8位是 0,即其值能被 256整除 ( 称为页边界 ) 。
( 2) PARA,指定起始地址的低 4位是 0,即其值能
16整除 ( 称为段边界 ) 。 缺省值是 PARA
( 3) WORD,指定起始地址的最低位是 0,即其值能被 2整除 ( 称为字边界 ) 。
( 4) BYTE,指定起始地址是任意值 。
44
微机原理及应用连接方式
连接方式告诉连接程序本段与其它段可按以下方式连接:
( 1) PUBLIC,告诉连接程序把本段与其它同名类别的段连接起来,公用一个段的起点地址,形成一个物理段 。
( 2) STACK,表示本段是堆栈段 。
( 3) 空缺 ( private),表示本段不与任何段连接 。
( 4) COMMON,表示本段与同名同类别的段共用同一段起始地址,即同名同类的段相重叠,段的长度是最长段的长度 。
( 5) MEMORY,表示本段在连接时定位在所有段之上 。
( 6) AT表达式,本段定位在表达式值指定的段地址处 。
45
微机原理及应用连接方式
private,不组合,默认状态是 private
PUBLIC,依次连接(顺序由 LINK程序确定)
COMMON,覆盖连接
STACK,堆栈段的依次连接
AT 表达式:段定义在表达式值为段基的节边界
MEMORY,相应段在同名段的最高地址处
46
微机原理及应用类别名
类别名 是合法的自定义符,它必须用单引号括起来。如代码段(‘ CODE’ )、堆栈段(’ STACK’ )等。凡是类别名相同的段在连接时均按先后顺序连接起来,即不同模块连接时将相同类别的段放在连续的内存区域中。
47
微机原理及应用
格式:
ASSUME 段寄存器:段定义名 1[,段寄存器:段定义名 2,?]
功能,说明所定义逻辑段的性质该伪指令告诉汇编程序在汇编时,段寄存器 CS:,
DS:,SS,和 ES,应具有的符号段基址,以便汇编指令时确定段和建立错误信息。但是段寄存器实际值
( CS除外)还要由传送指令在执行程序时赋值。
段寄存器说明伪指令
48
微机原理及应用例 题
DATA_SEG1 SEGMENT
..,(伪指令 Directives) ;数据段内定义各类程序执行需要的相关的数据
DATA_SEG1 ENDS
DATA_SEG2 SEGMENT
… (伪指令 Directives)
DATA_SEG2 ENDS; 还可根据具体程序的需要,定义堆栈段供程序执行过程中保持临时数据
49
微机原理及应用例 题
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG,DS:DATA_SEG1,
ES:DATA_SEG2
START,MOV AX,DATA_SEG1
MOV DS,AX
MOV AX,DATA_SEG2
MOV ES,AX
:,,;完成具体操作的指令序列
CODE_SEG ENDS
END START
实际操作 (实现 X+Y→Z)
DATA1 SEGMENT ; 数据段
X DB 05H
Y DB 04H
Z DB?
DATA1 ENDS
CODE1 SEGMENT ;代码段
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA1 ; 数据段基址 → AX
MOV DS,AX ; AX →DS
MOV AL,X ; 内存单元 X的数据 → AL
ADD AL,Y ; 内存单元 Y的数据 +AL→AL,即 X+Y →AL
MOV Z,AL; AL→ 内存单元 Z,即求和结果送回 Z
MOV AH,4CH ;送功能号
INT 21H ;系统功能调用,返回操作系统
CODE1 ENDS
END START
51
微机原理及应用子程序定义伪指令
格式,〈 过程名 〉 PROC [NEAR]( 或 [FAR])
:::
〈 过程名 〉 ENDP
过程名是自定义符 。 定义过程是为实现子程序调用而设的 。
调用格式为:
CALL 〈 过程名 〉
过程由 RET指令返回,它可以不是最后一条指令,
它在过程中可以设多点返回 。 并且过程起始名和终止名必须相同 。
52
微机原理及应用例 题
CODE_SEG SEGMENT
BEGIN PROC FAR

CALL NEAR A

CALL FAR B

BEGIN ENDP
A PROC NEAR

RET
A ENDP
CODE_SEG ENDS
CODE_SEG1 SEGMENT
B PROCFAR

RET
B ENDP
CODE_SEG1 ENDS
53
微机原理及应用定位伪指令
格式:
ORG 〈 表达式 〉
该伪指令把以下语句定义的内存数据或程序,从表达式指定的起点 ( 偏移地址 ) 开始连续存放,直至遇到新的 ORG指令 。 表达式的值是一个无符号数 。
DATA SEGMENT
ORG 0100H
D1 DB 11H,22H,33H
DATA ENDS
11
22
33
DS:0100
计算值为非负常数
54
微机原理及应用
4.3 系统功能调用一、系统功能调用概述
为给编写汇编语言源程序提供方便,MS-DOS系统中设置了几十个内部子程序,它们可完成 I/O设备管理,存储管理,文件管理和作业管理等功能 。 其入口地址已由系统置入中断入口地址表中,在汇编语言源程序中可用 软件中断指令 调用它们 。
DOS 功能调用 高级调用,操作系统提供
BIOS功能调用 低 级调用
55
微机原理及应用
DOS 功能调用
包含多个子功能的功能包,用软中断指令调用,中断类型码固定为 21H
各子功能采用功能号来区分
56
微机原理及应用二、系统功能调用方法
系统功能调用中的几十个子程序成为汇编语言程序员的重要工具,调用它们时采用统一的格式,只需要使用三个语句,如下所示:
( 1) 传送入口参数到指定寄存器中;
( 2) 功能号送入 AH寄存器中;
( 3) INT 21H。
有的子程序无入口参数,则只需安排后两个语句,
调用结束后,系统将出口参数送到指定寄存器中或从屏幕显示出来 。
57
微机原理及应用常用的系统功能调用 P159
常用的系统功能调用有以下 14个,
( 1)键盘输入单字符 ( 7)从串口输入单字符
( 2)键盘输入字符串 ( 8)向串口输出单字符
( 3)输出单字符 ( 9)返回操作系统
( 4)输出字符串 ( 10)设置日期
( 5)设置时间 ( 11)取得日期
( 6)取得时间 ( 12)无回显键盘输入单字符
( 13)直接控制台输入 /输出单字符
( 14)无回显直接控制台输入单字符
58
微机原理及应用键盘输入单字符
键盘输入单字符 —— 1号系统功能调用
格式:
MOV AH,1
INT 21H
说明,该调用没有入口参数,执行 1号系统功能调用时,系统等待键盘输入,待程序员按下任何一键,系统先检查是否 Ctrl-Break键,如果是则退出,否则将键入字符的 ASCII码 置入 AL寄存器 中,并在屏幕上显示该字符 。
注意,区分 1,7和 8号功能
59
微机原理及应用单字符输入例
GET_KEY,MOV AH,1
INT 21H
CMP AL,’Y’
JZ YES
CMP AL,’N’
JZ NO
JNZ GET_KEY
YES,┇
NO,┇
交互式应答程序;输入的字符在 AL中当第一、二条指令执行完时,
系统等待键盘按键。按下任一字符时,AL中的内容即为该字符的 ASCII码,同时显示器上显示出所按下的字符。
60
微机原理及应用键盘输入字符串
键盘输入字符串 —— 0AH号系统功能调用
格式:
BUF DB 20
DB?
DB 20 DUP(?)
:,,
MOV DX,OFFSET BUF
MOV AH,0AH
INT 21H;代码段中 0A功能调用;字符串在内存中的存放地址在数据段中定义 缓冲区
61
微机原理及应用定义字符缓冲区
用户自定义缓冲区格式:
0DHN1 N2
整个缓冲区最大键入字符数实际键入字符数从第三个字节开始用来存放键入的字符串
62
微机原理及应用输出单字符
输出单字符 — 2号系统功能调用
格式:
MOV DL,‘A’
MOV AH,2
INT 21H
说明,执行 2号系统功能调用时,将置入 DL寄存器中的字符从屏幕上显示输出 (或打印 )。;待输出字符’ A‘送到 DL中
63
微机原理及应用输出字符串
输出字符串 —— 9号系统功能调用
格式:
BUF DB ‘good bye $’
MOV DX,OFFSET BUF
MOV AH,9
INT 21H
说明,执行 9号系统功能调用时,将内存缓冲区 BUF
中存放的字符串送屏幕显示输出(或打印),缓冲区中的字符串 必须 以,$” 字符作为结束标志。
待输出字符串的偏移地址
64
微机原理及应用例
...
BUFF2 DB ‘How do you do! $’
...
MOV DX,OFFSET BUFF2 ;送字符串的首地址至 DX
MOV AH,09H ;送功能号
INT 21H ;系统功能调用显示字符串执行以上几条指令后,屏幕上将显示:
How do you do!
65
微机原理及应用字符串输出显示例
DATA SEGMENT
MESS1 DB ‘Input String:’ 0DH,0AH,’$’
DATA ENDS
CODE SEGMENT

MOVAH,09
MOVDX,OFFSET MESS1
INT 21H

66
微机原理及应用返回操作系统
返回操作系统 —— 4CH号系统功能调用
格式,MOV AH,4CH
INT 21H
说明,该调用没有入口参数,执行结果是结束当前正在执行的程序,并返回操作系统。屏幕显示操作系统提示符( N>),N为当前使用驱动器名。
67
微机原理及应用设置时间
设置时间 —— 2DH系统功能调用
格式:
MOV AH,2DH
INT 21H
说明,如果设置成功,则将 AL寄存器内容清,0”,否则将 AL寄存器置全置,1” 。如当前有效时间是 8点 15分 20.5秒,应将小时数8
置入 CH寄存器,分钟数 15置入 CL寄存器中,秒数 20置入 DH寄存器中,百分之一秒数 50置入 DL寄存器中。
MOV CX,0815H
MOV DX,2050H
MOV AH,2DH
INT 21H
68
微机原理及应用取得时间
取得时间 —— 2CH号系统功能调用
格式,MOV AH,2CH
INT 21H
说明,该调用没有入口差数,执行结果是将当前时间送入 CX和
DX寄存器中供使用。
从串口输入单字符 —— 3号系统功能调用
格式,MOV AH,3
INT 21H
说明,该调用没有入口参数,系统将从异步通信口串行输入的字符置入 AL寄存器中。
从串口输入单字符
69
微机原理及应用向串口输出单字符
向串口输出单字符 —— 4号系统功能调用
格式,MOV DL,‘$’
MOV AH,4
INT 21H
说明,执行结果将 DL寄存器中的字符通过异步通信口串行输出。
无回显键盘输入单字符
无回显键盘输入单字符 —— 8号系统功能调用
格式,MOV AH,8
INT 21H
说明,它没有入口参数,与 1号系统功能调用的区别仅在于键入的字符不送屏幕显示。
70
微机原理及应用设置日期
设置时间 —— 2BH号系统功能调用
格式,MOV AH,2BH
INT 21H
说明,将年号以装配型 BCD码形式置入 CX寄存器中,将月号置入 DH
寄存器中,将日期置入 DL寄存器中,然后调用如果设置成功,则 AL
寄存器为全 0,否则 AL寄存器将为全 1,从此以后日期会自动修改 。
取得日期
取得日期 —— 2AH号系统功能调用
格式,MOV AH,2AH
INT 21H
说明,该调用没有入口参数,执行结果是将年号置入 CX寄存器中,
月份和日期置入 DX寄存器中。
71
微机原理及应用一个完整源程序结构例
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
72
微机原理及应用一个完整源程序结构例
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
源程序代码
73
微机原理及应用程序的编辑、汇编及连接过程
汇编语言的程序一般要经过编辑,汇编 ( MASM或
ASM),连接 ( LINK) 和调试 ( DEBUG) 这些步骤 。
1,建立源程序文件
2,汇编 ( MASM或 ASM) 源程序
3,程序连接
4,执行程序
5,调试程序
74
微机原理及应用汇编语言程序设计与执行过程
输入汇编语言源程序 源文件,ASM
汇编(编译) 目标文件,OBJ
链接 可执行文件,EXE
调试 最终程序
75
微机原理及应用
76
微机原理及应用实验操作步骤
在 MS-DOS下,用 Edit命令进入编辑状态,完成所编写程序的输入。
程序编写完成后,将文件保存为 xx.asm,并退出编辑状态。
用 masm命令对所编写的程序进行编译,格式如下:
masm xx; 回车
用 link命令对所编写的程序进行连接,格式如下:
link xx; 回车
运行程序命令格式如下:
xx; 回车
77
微机原理及应用实验操作步骤
用 debug 命令对所编写的程序进行调试,格式如下:
debug xx.exe 回车
常用的 debug命令:
,T”回车,单步运行程序并显示寄存器状态。
,R”回车,显示各寄存器内容。
,DDS:XX”回车,察看数据段中偏移量为 XXH的内存单元中的内容。
,U”回车,反汇编当前机器码,也就是显示待执行的汇编语句。
,G XX”回车,执行内存中的可执行代码,直到偏移量为 XXH的代码为止。
,Q”回车,退出 DEBUG调试状态。
在提示符状态下输入,Exit”命令,退出 DOS模式。
78
微机原理及应用
4.4 汇编语言程序设计设计步骤:
根据实际问题抽象出数学模型
确定算法
画程序流程图
分配内存工作单元和寄存器
程序编码
调试
79
微机原理及应用在计算机上进行程序设计过程
D:\masm>EDIT 输入源程序
D:\masm>MASM 汇编
D:\masm>LINK 链接
D:\masm>TD 调试
80
微机原理及应用简单程序
简单程序是最简单的形式,计算机执行程序的方式是
,从头到尾,,逐条执行指令语句,直到程序结束 。
例:将内存 ( 10050H) 单元的内容拆成两段,每段 4
位,并将它们分别存入内存 ( 10051H) 和 ( 10052H)
单元 。 即 ( 10050H) 单元中的低 4位放入 ( 10051H)
低 4位,( 10050H) 单元中的高 4位放入 ( 10052H) 的低 4位,而 ( 10051H) 和 ( 10052H) 的高 4位均为零 。
81
微机原理及应用简单程序例题设 ( 10050H) = 7 AH,程序如下:
MOV AX,1000H
MOV DS,AX ;DS=1000H
MOV SI,50H ;需拆字节 7AH的地址赋给 (SI)=50H
MOV AL,[SI] ;取 10050H中内容到 AL中,;( AL) =7AH
AND AL,0F H ;把 AL中的前 4位清 0,;( AL) =0AH
01111010
AND 00001111
00001010
82
微机原理及应用简单程序例题
MOV [SI+1],AL ;把 OAH→( 10051H)单元
MOV AL,[SI] ;把 10050H内容到 AL中,;( AL) =7AH
MOV CL,4
SHR AL,CL ;逻辑右移四次,前 4位补 0,; AL=(07H)
MOV [SI+2],AL ; 放入 ( 10052H) 单元
83
微机原理及应用例题:内存自 TABLE开始的连续 16个单元中存放着
0- 15的平方值,查表求 DATA中任意数 X(0≤X
≤15) 的平方值,并将结果放在 RESULT中。
DATA1 SEGMENT
TABLE DB 0,1,4,9,16,25,36,49,64,81,
100,121,144,169,196,225
DATA DB 10
RESULT DB?
DATA1 ENDS
STAC SEGMENT
DB 100 DUP (?)
STAC ENDS
CODE SEGMENT
ASSUME DS:DATA1,SS:STAC,CS:CODE
84
微机原理及应用
SR:MOV AX,DATA1
MOV DS,AX
MOV AX,STAC
MOV SS,AX
LEA BX,TABLE
MOV AH,0
MOV AL,DATA
XLAT
MOV RESULT,AL
MOV AH,4CH
INT 21H
CODE ENDS
END SR; ADD BX,AX; MOV AL,[BX]
85
微机原理及应用分支程序分支程序是利用 条件指令,使程序执行到某一指令后,
根据条件是否满足,来改变程序执行的次序 。这类程序使计算机有了判断作用。
86
微机原理及应用分支程序例题 1
例 1:求 AX累加器和 BX寄存器中两个无符号数之差的绝对值,结果放在内存 ( 2800) 单元中 。
否是分支程序例题 1
CLC ;清除 CF
CMP AX,BX ;AX-BX≥0?
JC AA ;CF=1,转 AA执行
SUB AX,BX ;AX←AX -BX
MOV DI,2800H ;结果指针 DI=2800H
MOV [DI],AX ;结果送至 2800,2801H单元
HLT
AA,SUB BX,AX ;BX←BX -AX
MOV DI,2800H
MOV [DI],BX
HLT
88
微机原理及应用分支程序例题 2
例 2,编写一个程序,从外设 71号中取一个数 M,判断其值是否在 10H和 20H之间 。 如果 M≥20 H,则送 OFFH给外设 73 H;如果 M<10H,则送 00H;如果 10H≤M<20H,则送 88 H给外设 73 H。
89
微机原理及应用判断 M的分支流程图
START,IN AL,71H ;将71 H端口的字节读入 AL
CLC ;清除 CF
CMP AL,10H ;AL与 10H比较
JC LP1 ;小于 10H转至 LP1
CMP AL,20H ;AL与 20H比较
JC LP2 ;10H≤AL<20H转到 LP2
MOV BL,OFFH ;AL≥20H则 OFFH→BL
LP3,MOV AL,BL
OUT 73H,AL ;将 BL内容输出到 73H端口
HLT ;暂停
LP1,MOV BL,00
JMP LP3
LP2,MOV BL,88H
JMP LP3
91
微机原理及应用例题:编写程序,完成符号函数,
假设 x的值存放在 DATA1中,y的值存放 DATA2中。
1,,,,,0 1 2 8 1 2 7
0,,,,,0
1,,,0
xx
yx
x



DAT SEGMENT
DATA1 DB X
DATA2 DB Y
DAT ENDS
COD SEGMENT
ASSUME CS:COD,DS:DAT
ST,MOV AX,DAT
MOV DS,AX
92
微机原理及应用
MOV AL,DATA1
CMP AL,0
JGE BIG ;大于等于转 BIG
MOV AL,0FFH ;DATA2中置- 1
MOV DATA2,AL
JMP AA
BIG,JE EQUAL ;ZF=1,转 EQUAL
MOV AL,1 ;DATA2中置+ 1
MOV DATA2,AL
JMP AA
EQUAL,MOV AL,0 ; DATA2中置 0
MOV DATA2,AL
AA,MOV AH,4CH
INT 21H
COD ENDS
END ST
93
微机原理及应用循环程序
循环程序是 强制 CPU重复执行某一指令系列 的一种程序结构形式,凡是要重复执行的程序段都可以按循环结构设计 。 循环结构程序 简化了程序执行过程 。 相反,
增加了一些循环控制等环节,总的程序执行语句和时间会有所增加 。
循环程序的组成:
循环程序的组成可分为 初始化,循环化,循环控制 和循环结束处理 。
94
微机原理及应用循环程序
( 1 ) 初始化,完成建立 循环次数计数器,设定变量和存放数据的内存地址指针的 初值,装入暂存单元的初值等 。
( 2 ) 循环体,是程序的处理部分
( 3 ) 循环控制,包括 修改指针,
修改变量 为下一次循环作准备,
以及修改循环计数器,判断循环次数完成否 。
( 4 ) 结束处理,主要用来分析和存放程序的结果 。 循环程序基本结构框图
95
微机原理及应用循环程序例题 1
例 1:要求将 DATA1,0000地址开始的 100H个数据送到 DATA2,0000开始的单元中去
MOV AX,DATA1
MOV DS,AX ;设置源操作数段首地址
MOV AX,DATA2
MOV ES,AX ;设置目的操作数段首的地址
MOV SI,0 ;源操作数偏移地址送至 SI
MOV DI,0 ;目的操作数偏移地址送至 DI
MOV CX,0100 ;传送的字节数送 CX寄存器
96
微机原理及应用循环程序例题 1
CLD ;使 DF=0指针按增量方向修改
NEXT:MOVSB ;将源地址的 1个字节送到目的地址 单元
DEC CX ;字节数减 1
JNZ NEXT ;100H字节如未传送完,则继续传送

其中 NEXT,MOVSB
DEC CX
JNZ NEXT
可用一条语句 REP MOVSB 代替
97
微机原理及应用循环程序例题 2
例 2:在一串数中找出最大值和最小值,并将最大值和最小值放在指定的存储单元中。
程序流程图
98
微机原理及应用循环程序例 2程序体
DATA SEGMENT
BUFFER DW X1,X2,… Xn
CUONT EQU $-BUFFER
MAX DW?
MIN DW?
DATA ENDS
PROG SEGMENT
ASSUME CS:PROG,DS,DATA
SEHRCH PROG FAR
START,MOV AX,DATA
MOV DS,AX
99
微机原理及应用循环程序例 2程序体
MOV CX,COUNT
SHR CX,1
LEA BX,BUFFER
MOV AX,[BX]
MOV DX,[BX]
DEC CX
LP,INC BX
INC BX
CMP AX,[BX]
JGE NET1
MOV AX,[BX]
100
微机原理及应用循环程序例 2程序体
NEXT1,CMP DX,[BX]
JL NEXT2
MOV DX,[BX]
NEXT2,LOOP LP
MOV MAX,AX
MOV MIN,DX
MOV AH,4CH
INT 21H
SEARCH ENDP
PROG ENDS
END START
101
微机原理及应用子程序子程序相对主程序而定,是一个子的程序段,确切地说,它是被父程序调用的程序 。 一般子程序具有 公用性,重复性 或 有相对独立性的特点 。
〈 一 〉 子程序的调用与返回子程序的调用与返回由 CALL和 RET指令实现 。
子程序的调用实际上是程序的转移,但它与转移指令有所不同,转子指令 CALL执行时 要保护返回地址,
而转移指令不考虑返回问题 。 每个子程序都有 RET指令负责把压入栈后的返回地址弹出送 IP或 CS和 IP
( 段间返回 ) 实现程序返回 。
102
微机原理及应用子程序
〈 二 〉 子程序设计与应用应该注意的问题
( 1 ) 现场保护与恢复子程序使用时,要注意寄存器内容的保护 。 由于
CPU的寄存器的数量有限,子程序使用的寄存器往往会和调用的寄存器发生冲突,破坏了调用程序中寄存器的内容,影响了子程序返回后的继续处理 。 为了避免这种现象,在子程序入口处把所用寄存器的内容投入堆栈,保护起来,而在退出子程序前恢复寄存器的内容是必要的 。 恢复现场是保护现场的逆操作 。 当用栈区保护现场时,应注意恢复现场的顺序 。
103
微机原理及应用子程序
( 2 ) 参数传递指主程序与子程序之间相关信息或数据的传递 。
参数传递方式有寄存器传递,用内存单元传递或用栈区传递 ( 寄存器,变量,地址表,堆栈等 ) 。
( 3 ) 子程序说明由于子程序有 共享性,可被其它程序调用,因此,每个子程序应有必要的使用注释 。 主要包括:
〈 1 〉 子程序名; 〈 2 〉 功能,技术指标; 〈 3 〉 占用 寄存器和存储单元 ; 〈 4 〉 入口,出口参数; 〈 5 〉
嵌套哪些子程序
104
微机原理及应用子程序
〈 三 〉 子程序调用技巧常用技巧
( 1 ) 子程序嵌套 子程序调用子程序的过程 。
( 2 ) 子程序递归 子程序调用自身的过程 。
( 3 ) 可重入子程序 子程序被调用后没有执行完又被另一程序重复调用 。
( 4 ) 协同子程序 两个以上子程序协同完成一项任务,且又相互调用,直到任务完成 。
105
微机原理及应用子程序例题例:数组求和子程序 。 假设有一数组求和子程序 SUM,
试用这个子程序分别求出 ARY1和 ARY2 两个数组和,
结果分别存入 SUM1 和 SUM2 字单元中 。
DATA SEGMENT
ARY1 DB 03H,07H,50H,06H,23H,45H,0F6H,0DFH
LEN1 EQU $ - ARY1
SUM1 DW?
ARY2 DB 33H,44H,55H,12H,78H,89H,0FFH,0CDH
LEN2 EQU $ - ARY2
SUM2 DW?
DATA ENDS
106
微机原理及应用子程序例题
STACK SEGMENT STACK ’ STACK ’
DB 100 DUP ( ‘? ‘ )
STACK ENDS
CODE SEGMENT PARA ‘ CODE ’
ASSUME CS,CODE,DS,DATA,SS,
STACK
STA PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
转移地址是什么?
107
微机原理及应用这个转移地址是什么?
当我们用编辑程序把原程序输入至机器中,用汇编把它转变为目标程序,用连接程序对其进行连接和定位后,连接程序为每一个用户程序建立了一个程序段前辍,共占用 256个字节,在程序段前辍的开始处
(0000H)安排了一条程序运行返回 DOS的指令 。 而且给 DS所赋的值 (在未执行用户程序中的指令 MOV DS,
AX之前 )就是程序段前辍的段地址 。 所以上面所提的 4
条指令就能在用户程序结束以后,利用 RET指令返回到程序段前缀开始处,通过执行在程序段前辍中安放的这一指令,而把控制返到 DOS。
DATA SEGMENT
ARY1 DB 03H,07H,50H,06H,23H,45H
LEN1 EQU $ - ARY1
SUM1 DW?
ARY2 DB 33H,44H,55H,12H,78H,89H
LEN2 EQU $ - ARY2
SUM2 DW?
DATA ENDS
STACK SEGMENT STACK ’ STACK ’
DB 100 DUP ( ‘? ‘ )
STACK ENDS
CODE SEGMENT PARA ‘ CODE ’
ASSUME CS,CODE,DS,DATA,SS,STACK
STA PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
:,,;定义数据段;定义堆栈段;返回 DOS;获取数据段段首地址Flash
……….
……….
MOV AX,LEN1
PUSH AX
LEA AX,ARY1
PUSH AX
存放参数
PUSH BP
MOV BP,SP
PUSH AX
PUSH BX
PUSH CX
PUSHF
保护现场主程序
Flash
子程序取得参数MOV CX,[ BP+6]MOV BX,[ BP+4]
ADD1,求和并且保存结果
XOR AX,AX
ADD AL,[BX]
ADC AH,0
INC BX
LOOP ADD1
MOV [ BX],AX
恢复现场
POPF
POP CX
POP BX
POP AX
POP BP
返回主程序RET 4
调用子程序 CALL SUM
存放参数
MOV AX,LEN2
PUSH AX
LEA AX,ARY2
PUSH AX
调用子程序 CALL SUM
用堆栈段传递参数
DATA SEGMENT
ARY1 DB 03H,07H,50H,06H,23H,
45H,0F6H,0DFH
LEN1 EQU $ - ARY1
SUM1 DW?
ARY2 DB 33H,44H,55H,12H,78H,
89H,0FFH,0CDH
LEN2 EQU $ - ARY2
SUM2 DW?
DATA ENDS
STACK SEGMENT STACK ’ STACK ’
DB 100 DUP ( ‘ S ‘ )
STACK ENDS
CODE SEGMENT PARA ‘ CODE ’
ASSUME CS,CODE,DS,DATA,
SS,STACK
STA PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,LEN1
PUSH AX
LEA AX,ARY1
PUSH AX
CALL SUM
MOV AX,LEN2
PUSH AX
LEA AX,ARY2
PUSH AX
CALL SUM
RET
STA ENDP
Flash
111
微机原理及应用
SUM PROC
PUSH BP
MOV BP,SP
PUSH AX
PUSH BX
PUSH CX
PUSHF
MOV CX,[ BP+6]
MOV BX,[ BP+4]
XOR AX,AX
ADD1,ADD AL,[BX]
ADC AH,0
INC BX
LOOP ADD1
MOV [ BX],AX
POPF
POP CX
POP BX
POP AX
POP BP
RET 4
SUM ENDP
CODE ENDS
END STA
Flash
112
微机原理及应用实验二试编写一程序:比较两个字符串
STRING1和 STRING2所含的字符是否相同。
若相同则显示 ‘ MATCH’,否则显示 ‘ NO
MATCH’。
113
微机原理及应用程序:
DATA1 SEGMENT
STRING1 DB 10,?,10 DUP (?)
STRING2 DB 10,?,10 DUP (?)
MESS1 DB 'MATCH$'
MESS2 DB 'NO MATCH$'
DATA1 ENDS
CODE1 SEGMENT
ASSUME CS:CODE1,DS:DATA1
STT,MOV AX,DATA1
MOV DS,AX
MOV ES,AX;定义数据段注意:缓冲区的定义方法
114
微机原理及应用程序(续) LEA DX,STRING1
MOV AH,0AH
INT 21H
MOV DL,0DH
MOV AH,6
INT 21H
MOV DL,0AH
MOV AH,6
INT 21H
LEA DX,STRING2
MOV AH,0AH
INT 21H;手动输入字符串 1;手动输入字符串 2;换行回车
115
微机原理及应用
LEA SI,STRING1
LEA DI,STRING2
MOV CL,[SI+1]
MOV BL,[DI+1]
CMP CL,BL
JNE NOM
CLD
MOV CH,0
REPZ CMPSB
JZ MAT
NOM,LEA DX,MESS2
JMP SHORT DISP1
程序(续)
MAT,LEA DX,MESS1
DISP1,MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE1 ENDS
END STT
思路:先比较两字串长度是否相等,等长则逐一比对各字符是否相同
116
微机原理及应用注意:
指令 REPZ CMPSB的操作
REPZ,ZF= 1,且 ( CX) ≠ 0时重复
CMPSB,( SI)-( DI)
( SI+1),( DI+1)
CX的自动修改
在键盘输入字符串( 0AH功能调用)时,其默认的字串写入区域是 DS:DX
P135
117
微机原理及应用例题分析编写程序实现从一个字符串中删去一个字符,
提示,
( 1)参数的传递的方式的选择。
常用的传递方式:寄存器、变量、地址表,堆栈 等。
( 2)现场保护。
一定注意相应寄存器内容的保护。
118
微机原理及应用例题解答
DATA SEGMENT
STRING DB 'Exxperience...'
LENGTH1 DW $-STRING
KEY DB 'x'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN PROC FAR
START,MOV AX,DATA
MOV DS,AX
MOV ES,AX
119
微机原理及应用例题解答 (续 )
LEA BX,STRING
LEA CX,LENGTH1
PUSH BX
PUSH CX
MOV AL,KEY
CALL DELCHAR
MOV AH,4CH
INT 21H
MAIN ENDP
DELCHAR PROC
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
PUSH CX
CLD
MOV SI,[BP+4]
MOV CX,[SI]
MOV DI,[BP+6]
REPNE SCASB
JNE DONE
MOV SI,[BP+4]
DEC WORD PTR[SI]
120
微机原理及应用
MOV SI,DI
DEC DI
REP MOVSB
DONE,POP CX
POP DI
POP SI
POP BP
RET 4
DELCHAR ENDP
CODE ENDS
END START
例题解答 (续 )
121
微机原理及应用