任课教师:赖晓风
第一章:绪论
1.1 汇编语言程序设计的一般概念
从程序设计的观点可认为计算机是执行各种语言
的机器,但其最终执行的是 CPU提供的机器指令。汇
编语言将机器语言符号化(与机器语言一一对应)。
不同的计算机系统( CPU),有相应的机器语言
和汇编语言,本书以 8086,8088为例。
1.1.1 为什么要学习和使用汇编语言
1、从本质上认识计算机的工作过程
2、现在的计算机系统中,某些功能仍用汇编语言
程序实现。
3、汇编程序效率高。
一般高级语言都设有汇编程序接口。
1.2 计算机中数据信息的表示
1.2.1 进位计数制及其相互转换
一、进位计数制
概念:权:个、十、百、千位 …
基数:每个数位上有限数码个数
对任一数 KNRNKN- 1RN- 1…K - MR- M都可以表示为:
-m
S= ∑KiRi (其中 R表示基数)
i=n
二、数制间转换
两个原则,1、四位二进制对应一位十六进制
2、三位二进制对应一位八进制
所以二、八、十六进制的相互转换转化为二、十进
制的相互转换。
两种方法:
1、十进制转换为二进制
整数部分:除基取余
小数部分:乘基取整
2、任何进制转换为十进制
按权相加法
1.2.2 带符号数的表示
真值:日常用+或-表示的数
机器数:把二进制的最高位符号化所表示的数 P8
机器数最高位为 0:表示正数
机器数最高位为 1:表示负数
在计算机中为把减法转换为加法,引入了原码、补
码的概念。
一、原码:
正数、负数的符号位分别用 0,1表示的方法。
例,X= 105 [X]原 = 01101001
X=- 105 [X]原 = 11101001
8位带符号数表示的范围:
01111111~ 1111111 即- 127~ + 127
0的两种表示,0000000表+ 0,10000000表- 0
原码表示要判断符号:加或减运算、结果的符号。
为把减法转变为加法,引入补码的概念。
二、补码
1、定义:带符号数 X的补码表示法:
[X]补 = M+ X ( MOD M)
M为模,根据机器数的位数而定,对 8位二进制其模为 28
2、范围:对 8位机器数 - 128~+ 127
没有+ 0、- 0的区别
[+0]补 = [- 0]补 = 00000000
3、正数的补码与原码相同
在此只讨论负数的补码
负数的补码为其真值数(包括符号位)按位取反后
加 1。如变换前已是原码,则符号位不变。 P10
注,(1)、由真值数或原码变换为补码可使用简便方法:
自低位向高位遇到的第 1个 1不变,以后各位按位变反
(如变换前已是原码,则符号位不变)
(2),[X]补<==求补运算== > [- X]补
求补运算为:按位变反后加 1
(3)、当负数用补数表示时,减法转换为加法。
4、补码的加、减运算
加,[X]补 + [Y]补 = [X+ Y]补
减,[X]补 - [Y]补 = [X]补 + [- X]补 = [X- Y]补
1.2.3 字符编码
ASCⅡ 码用 1个字节的低 7位表示,共 128个,第 8位用
于奇偶校验。这 128个编码分为两类:
非打印 ASC Ⅱ 码(控制码),33个
可打印 ASC Ⅱ 码,95个:
数字 0- 9,30H- 39H
大写字母,41H- 5AH
小写字母,61H- 7AH
空 格,20H
1.3 基本逻辑运算 P14
计算机采用二进制,物理上易实现,可靠性高,可用逻
辑上的“真”与“假”表示。
1、“与”运算( AND)
同时为真时才为真
2、“或”运算( OR)
两者之一为真时为真
3、“非”运算( NOT)
真时为假,假时为真
4、“异或”运算( XOR)
相同时为假,不同时为真
第二章,IBM PC微型计算机
2.1 IBM PC微型计算机基本结构
2.1.1 微型计算机硬件系统组成
1,CPU 由运算器和控制器组成。
2、存储器
3、输入、输出( I/O)设备和 I/O接口
4、系统总线
三总线结构:地址总线、数据总线、控制总线
2.1.2 Intel 8086/8088微处理器功能结构
计算机执行一个程序,实质是 CPU执行组成程序的指
令序列,分为三步,1、取指令 2、分析指令 3、执行指令
取指令必须访问存储器,而执行指令可不访问存储器
访问存储器要占用 CPU外部地址总线和数据总线
早期的 8位微机存在 CPU与外部总线忙、闲不均的情况。
从而降低了机器的运行速度。这是由于串行工作方式导
致。 8086/8088微机采用指令流水线结构:将访问存储器
与执行指令分成两个独立部件,使取指与执行同步。
EU-执行单元:从 BIU指令队列中取指并执行 P18
BIU-总线接口单元:为 EU发出的访问命令提供数据和地址。
2.2Intel 8086/8088CPU寄存器结构 P20 图 2- 5
2.1.1、段寄存器 (指向段基址)
Intel8086/8088CPU将存储器划分为若干段,把欲运
行的程序的各部分分别放在不同的段中,每个段用一个
段寄存器指示其首地址(段基址)。
定义:一个存储单元与它所在段的段基址之间的距
离(以字节计),叫该单元的偏移量。
CS-代码段寄存器 指向存放指令的代码段
DS-数据段寄存器 指向数据段
ES-附加段寄存器 指向数据段
SS-堆栈段寄存器 指向堆栈段
注:用 CS,DS,ES,SS指向的段叫当前段
程序运行时,最多只有四个当前段。 P20 图 2- 6
一个程序可任意划分为多个段。
四个寄存器的功能不同,不能互换使用。
2.2.2、通用寄存器 8个
1、数据寄存器:每一个可作为 16位或 8位寄存器使用
AX ( AH,AL)-累加器
BX ( BH,BL)-基址寄存器
CX ( CH,CL)-计数寄存器
DX ( DH,DL)-数据寄存器
通常用于存放操作数和操作结果。通用性好。
以上寄存器一般在指令中须指明。例外情况如下:
( 1)、循环指令 LOOP中,CX隐含作循环计数器。
( 2)、两个字节数相乘指令中隐含使用 AX
( 3)、两个字相乘指令中隐含使用 AX,DX
( 4)、移位指令中,移位次数必须送入 CL
2、地址指针寄存器 常用作 16位地址指针(偏移量)
SP-堆栈指针
BP-基址指针
当进行堆栈操作时 SP隐含。
变址寄存器( SI,DI),常用作 16位地址指针(偏
移量),但在变址寻址中,SI,DI的内容作为段内偏移
量的一部分。
SI-源变址寄存器 DI-目的变址寄存器
SI,DI在串操作指令中隐含,且不能互换。
SI,DI也可作为数据寄存器用。
2.2.3、用于控制的寄存器
1、指令指针 IP
IP是指令的地址指针,在程序运行期间,CPU自动
修改 IP的值,使它始终保持下一条指令的地址(偏移量)
注:不能用指令取出 IP值或给 IP设置值。
可通过一些指令的执行使 IP值自动得到修改。
如转移指令 JMP,JNE
子程序调用指令 CALL
2、标志寄存器 FR
9个标志位:其中 6个状态标志,3个控制标志。 P23
OF DF IF TF SF ZF AF CFPF
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
























位 进位























控制标志位
1、进位位 CF
算术运算时,如最高位产生进位或借位,CF置 1,否
则置 0。在移位指令中,CF也可用于保存左移、右移产
生的 0或 1。
2、奇偶位 PF
操作结果低八位中含 1的个数为偶数时,PF置 1,否则
置 0。 PF与操作数长度无关。
3、辅助进位位 AF
算术运算时,低字节中低四位产生进位或借位,CF置
1,否则置 0。与操作数长度无关。
4、零值位 ZF
运算结果为 0时,ZF置 1,否则置 0。
5、符号位 SF
运算结果为负数时,SF置 1,为正数时置 0。(与最高
位结果一致)
6、溢出位 OF
运算结果超过机器用补码所能表示的数的范围时
(对字节数据,-128~ +127,对字数据,-32768 ~ +32767),
OF置 1,否则置 0。
产生溢出的原因:同号数相加或异号数相减。
7、单步标志位 TF
当 TF= 1时,在执行完一条指令后,产生中断,然后
由单步中断程序把 TF置 0。
8、中断允许位 IF
当 IF= 1时,允许响应可屏蔽中断
当 IF= 0时,不允许响应可屏蔽中断
注,8086/8088有两条外部中断请求线
NMI-非屏蔽中断 (不受 IF影响)
INTR-屏蔽中断 (受 IF影响)
IF的状态控制,可通过指令完成
STI-开中断 使 IF置 1
CLI-关中断 使 IF置 0
8086/8088在内存的前 1K字节建立了一个中断向量表,
可容纳 256个中断向量(中断类型),每个中断向量占 4
个字节,存放相应服务程序的入口地址。
9、方向位 DF
DF为串操作指令规定增减方向。
当 DF= 0时,串操作指令由低地址到高地址。
当 DF= 1时,串操作指令由高地址到低地址。
2.3 主存储器
2.3.1、存储器的组成
存储器由存储单元组成,各存储单元大小一致(字
单元、字节单元)。
8086/8088有 20条地址线,所以其 CPU的寻址能力为
1M。每一个存储单元(字节单元)有一个唯一的编号叫
地址,在机器内部用二进制无符号数表示,在源程序中
用符号或 5位十六进制数表示。
在由字节单元组成的字单元中,用地址值较小的字
节单元地址作为字单元地址,对字单元的十六位数,低 8
位放低字节,高 8位放高字节。
CPU访问内存的指令分为字节访问和字访问,须在
指令中说明,DB=字节 DW=字
2.3.2、存储器的段结构
8086/8088CPU把 1MB的存储空间划分为若干段,每
个段至多由 64K个连续的字节单元组成。
在汇编程序中,需设立的段的个数、大小、用途由
用户自定。
一个存储器可划分为多个段,但每个段的起始单元
有限制。从存储器的 0地址开始,在 1M范围内,每 16个
字节单元为 1个小节,共可分为 65536( 64K)个小结。
每个小结有 1个小结首地址,
规定:段基址只能是上述 64K个首地址之一。
在程序中设置的段叫逻辑段,多个逻辑段在物理存
储器中存在四种情况。 P25
1、邻接 2、间隔 3、部分重叠 4、完全重叠
即一个物理存储单元可映象( MAP)到一个或多个逻
辑段中。
注 1、任何时刻,一个程序只能访问 4个段中的内容
(即当前段,CS,DS,SS,ES)
2、当前段保存段基址。
3、当前段至多可容纳 64KB代码,64KB堆栈 128KB
数据。
2.3.3、逻辑地址与物理地址
每个存储单元都有上两种地址,在 1MB的存储空间
中,每一个存储单元的物理地址唯一(编码地址)。
CPU与存储器间交换信息使用物理地址。
程序设计使用逻辑地址,以便于存储器的动态管理。
逻辑地址构成:段基址+偏移量
段基址:一个段起始单元地址的高 16位
偏移量:存储单元与段基址的距离
CPU访问存储器的过程是把逻辑地址转换成物理地
址的过程。(通过 BIU完成)
将段寄存器中的段基址左移四位形成 20位的段基址,
再加上 16位的偏移量,形成 20位的物理地址。
有效地址 EA:根据寻址方式计算出来的偏移量。
2.4,8086/8088堆栈的组织
堆栈是由 SS指定的一段存储区。
栈顶由 SP指向( SP始终包含栈顶与段基址的距离)
SP初始化时,其值为堆栈长度(栈底+ 2单元)
堆栈最大深度为 64KB(一个段的长度),至多可存
放 32K字数据。
堆栈按字组织(存取数据)
存放数据格式:低放低,高放高
堆栈操作,
1、设置堆栈:对 SS,SP赋值
2、进栈,PUSH
过程,1,SP?SP- 2
2,SP ?数据
3、出栈,POP
过程,1、寄存器 /存储单元 ?SP
2,SP ? SP+ 2
第三章:寻址方式与指令系统
3.1 寻址方式
指令:操作码+操作数
操作码:表指令应完成的操作
操作数:表指令的操作对象 (操作数地址或操作数本身)
定义:寻找指令中操作数的方法叫寻址方式
CPU有 8种寻址方式
3.1.1、寄存器寻址
操作数在某寄存器中(通用寄存器或段寄存器)
特点:执行速度快
格式,MOV CL,AL MOV DX,CL
MOV DH,BL MOV DS,AX
3.1.2、立即数寻址
操作数包含在指令代码中(立即数为指令的一部分)
特点:执行速度快
注( 1)立即数不能出现在目的操作数位置
( 2)如源操作数是立即数,则目的操作数必须是 R/M
( 3)主要用于给寄存器赋值
( 4)立即数若以 A~F开头,前面必须加 0(区别于符号 )
3.1.3、存储器寻址
以下 6种寻址方式,讨论如何确定存储器的操作数地址
某单元逻辑地址表示:段基值( 16位):偏移量
段基址在 DS,CD,ES,SS中
偏移量为某单元与段基值的距离( 16位)
某单元物理地址:段基值(左移四位)+ EA
EA:有效地址,是如下三个分量的某种组合。
( 1)位移量
指令中的 8/16位数
通常在源程序中以操作数名字(变量名或标号)形
式出现,汇编后会自动把操作数名字的偏移量转换为指
令代码中的位移量。
修改位移量:加减一个常数或用一个常数指定
( 2)基地址:由 BX,BP提供
( 3)变地址:由 SI,DI提供
对上面 3个分量的不同组合,形成了以下 6种不同的
存储器操作数的寻址方式。
1、直接寻址
EA直接由位移量给出,只涉及段寄存器
在指令中,直接寻址方式可以用符号或常数来表示
( 1)符号表示 (隐含使用 DS,但如操作数不在数据段,则必须指明 )
MOV BX,VAR ;把 VAR所指字单元内容送 BX
上指令行等价于 MOV BX,DS,VAR
MOV AH,ES:DATE_ BYTE ;把 ES段 DATE_ BYTE
所指字节单元内容送 AH
MOV CL,DA+3 ;把 DA地址偏移 3个字节的那个字节
单元内容送 CL
( 2)用常数表示
MOV AX,DS,[100H] ;把当前数据段偏移 100H字节
的字单元内容送 AX
注:用常数表示时,段寄存器必须指明
MOV AX,[100H]等价于 MOV AX,100H
2、寄存器间接寻址
EA由基址寄存器( BX,BP)或变址寄存器( SI,
DI)之一给出。此种寻址方式,操作数在存储器中,但
操作数的地址在 SI,DI,BX,BP之一。
两种情况:
( 1)若以 SI,DI,BX间接寻址,则操作数在数据段中。
即 DS加上 SI,DI,BX之一作为操作数的地址。
( 2)若以 BP间接寻址,则操作数在堆栈段中,即 SS加
上 BP作为操作数的地址。
3、基址寻址和变址寻址
EA由 BX,BP或 SI,DI之一与指令中给出的位移量
之和构成。
注 ( 1)当使用 BX,SI,DI时,隐含 DS
( 2)当使用 BP时,隐含 SS。
4、基址加变址寻址
EA由位移量、基址、变址之和给出。
注 ( 1)基址选 BX,BP之一
( 2)变址选 SI,DI之一
( 3)选 BP时,隐含 SS
( 4)选 BX时,隐含 DS
存储器操作数地址计算小结 P37 图 3.9
5、串操作寻址
SI,DI隐含,且自动修改,修改方向由 DF定。
寻找源串- SI
寻找目的串- DI
6,I/ O端口寻址 (10.1节介绍 )
3.2 指令系统
CPU指令分为六大类
1、传送类指令 2、算术运算类指令
3、位操作类指令 4、串操作类指令
5、程序转移类指令 6、处理器控制类指令
指令格式有三种:
1、双操作数指令,OPR DEST,SRC
2、单操作数指令,OPR DEST
3、无操作数指令,OPR
其中,OPR-指令操作码(指令助记符)
SRC-源操作数
DEST-目的操作数
3.2.1、传送类指令
1、数据传送指令 MOV
格式,MOV DEST,SRC
作用:将源操作数内容传送给目的操作数
注 ( 1)对标志寄存器无影响
( 2)可进行字节或字传送,但两操作数长度必须一致。
传送分为三种情况:
( 1)立即数传送到通用寄存器或存储单元
( 2)寄存器之间的传送( CS只能作源操作数)
( 3)寄存器与存储器之间的传送。这种传送要注意三点:
A:存储器间不能直接传送
B:立即数不能传送给段寄存器
C:段寄存器之间不能直接传送
以上三种情况可通过寄存器作桥梁
MOV指令的源与目的操作数不能同时为存储器操作数。
2、交换指令
格式,XCHG DEST,SRC
作用:源与目的操作内容互换,对标志寄存器无影响
注 ( 1)交换数据可为字或字节
( 2)数据交换可在通用寄存器之间或通用寄存器与
存储器之间进行,不能使用段寄存器和立即数。
( 3)不能进行两个存储单元之间的直接数据交换。
3、标志位传送指令(无操作数指令)
( 1)取标志寄存器指令
格式,LAHF
作用:把标志寄存器的低 8位传送给 AH。对标志寄
存器无影响。
( 2)存储标志寄存器
格式,SAHF
作用:把 AH中 7,6,4,2,0位内容送寄存器相应位。
标志寄存器的高 8位不受影响。
( 3)标志进栈
格式,PUSHF
作用,SP- 2,将 16位标志寄存器的全部内容送 SP指向
的栈顶单元之中。标志寄存器各位不受影响。
( 4)标志出栈
格式,POPF
作用,将栈顶的一个字的内容送入标志寄存器中,SP+ 2
标志寄存器各位的设置、修改方法如下:
( 1) CF,DF,IF可通过指令设置 P51
( 2) SF,ZF,AF,PF位无法进行指令设置,但可修改:
用 LAHF指令把标志寄存器低 8位送 AH,修改相应位
后再用 SAHF送回标志寄存器。
( 3)修改 TF与 OF(高 8位)用 PUSHF和 POPF指令。
4、地址传送指令
( 1)装入有效地址
格式,LEA DEST,SRC
作用:把源操作数的偏移量( EA)送目的操作数,对
标志寄存器无影响。
注,1,SRC为 8/16位的存储器操作数
2,DEST为某通用寄存器
( 2)装入地址指针
一个存储单元的逻辑地址需四个字节存放。其中,段
基址放高 16位,偏移量放低 16位。
格式,LDS DEST,SRC
LES DEST,SRC
作用:取 SRC所指向的 32位地址。对标志寄存器无影

注,LDS命令取出的段基值送 DS,偏移量送某通用寄存器
LES命令取出的段基值送 ES,偏移量送某通用寄存器
上两命令常用于串操作
3.2.2、算术运算类指令
可对字或字节数据进行运算
运算的数可以是无符号数、带符号数(补码表示)
运算的数可以是二进制数、十进制数( BCD码表示)
BCD码:二进制表示的十进制数
组合型 BCD码:一个字节表 2个
非组合型 BCD码:一个字节表 1个
1、加法指令
格式,ADD DEST,SRC
作用,DEST ← DEST + SRC。 CF,DF,AF,ZF,SF、
OF随结果而变。
注,1,SRC可是 R/M或立即数。
2,DEST只能是 R/M
3,DEST与 SRC不能同时为存储器操作数。
2、带进位加法指令
格式,ADC DEST,SRC
作用,DEST←DEST + SRC+ CF。其它与 ADD相同。
主要用于多字节(大于 16位)的运算。
3、加 1指令
格式,INC DEST
作用,DEST ←DEST + 1
注,1,DEST可以是 R/M,但不能是立即数。
2、按结果设置 PF,AF,ZF,SF,OF。 CF不受影响
3、主要用于循环程序中修改循环次数和地址指针。
4,DEST为无符号二进制数。
4、减法指令
格式,SUB DEST,SRC
作用,DEST ← DEST - SRC
注,1、根据结果修改 CF,PF,AF,ZF,SF,OF。
2,DEST可以是带符号数、无符号二进制或无符号十
进制数。
3,DEST与 SRC不能同时为 M,立即数不能作 DEST。
5、带借位减法
格式,SBB DEST,SRC
作用,DEST ← DEST - SRC- CF。其它与 SUB同。
主要用于多字节减法。
6、减 1指令
格式,DEC DEST
作用,DES T← DEST - 1
注:同 INC指令
7、求负数指令
格式,NEG DEST
作用,DEST ← 0 - DEST
注,1,DEST为带符号数
2、计算机中带符号数是用补码表示
3、指令影响 PF,AF,ZF,SF,OF,CF
4、对字节操作数- 128和字操作数- 32768,指令执
行后,OF置 1。
5、如操作数为 0,指令执行后,CF置 0
(8)、比较指令
格式,CMP DEST,SRC
功能:( DEST)-( SRC)。运算结果不存入( DEST)
仅根据结果设置 6个状态标志位。注意 CMP与 SUB的区别。
注,CMP指令是利用标志位来确定两个操作数的大水。
( 1):若 ZF= 1,表示( DEST)=( SRC)
( 2):对无符号数:
若 CF= 0,表示( DEST)>=( SRC)
若 CF= 1,表示( DEST)<( SRC)
( 3)对带符号数:
若 OF= SF,表示( DEST)>( SRC)
若 OF≠SF,表示( DEST)<( SRC)
3.2.3、位操作类指令
1、逻辑运算指令
( 1)与 AND DEST,SRC
( 2)或 OR DEST,SRC
( 3)异或 XOR DEST,SRC
( 4)非 NOT DEST
注,1,NOT对 FLAG无影响
2,AND,OR,XOR对 FLAG有影响
SF,ZF,PF视结果而设置
CF,OF总置 0
AF不确定
3、主要用于逻辑运算和某些位的分离与设置
2、测试指令
格式,TEST DEST,SRC
作用,DEST∧ SRC
注:结果不送回 DEST。其它与 ADD同。
主要用于测试操作数的某些位,但不改变操作数值
例:测试 AX中最高位是否为 1。
TEST AX,8000H
例:测试 AX内容是否为 0。
TEST AX,0FFFFH
3、移位 /循环移位指令
( 1)算术移位 (针对带符号数 )
左移,SAL DEST,COUNT
右移,SAR DEST,COUNT
( 2)逻辑移位 (针对无符号数 )
左移,SHL DEST,COUNT
右移,SHR DEST,COUNT
( 3)循环移位
左移,ROL DEST,COUNT
右移,ROR DEST,COUNT
带进位左移,RCL DEST,COUNT(多字节数据移位 )
带进位右移,RCR DEST,COUNT(多字节数据移位 )
注,1,DEST为 R/M
2,COUNT为移位次数
如 COUNT= 1,则 COUNT可用常数 1代替。
如 COUNT≠1,则必须用 CL代替( 0- 255)
( 3)、标志寄存器值:
A、对算术 /逻辑移位
根据结果修改 CF,PF,ZF,SF,OF。 AF不确定。
在移位次数为 1的情况下,移位完成后,如最高位与
标志位 CF不相等,则 OF= 1,否则 OF= 0
在移位次数> 1的情况下,OF不确定。
B、对循环移位
结果只修改 CF,OF。 OF的判定同上。
( 4),SAL与 SHL指令相同:乘 2N( N为移位次数)
SAL与 SHR:除 2N ( SHR可能变号)
8086/8088可以实现 16位的移位,但当多字节或多字
数据进行移位时,常用大循环(带进位循环)。
例:有一四字节数,放在 AX,DX中。左移 1位如何操作?
SAL AX,1
RCL DX,1
四、处理器控制类指令
1、标志位操作指令
( 1)清除进位标志 CLC 置 CF= 0
( 2)进位标志置位 STC 置 CF= 1
( 3)进位标志取反 CMC CF取反
( 4)清除方向标志 CLD 置 DF= 0
( 5)方向标志置位 STD 置 DF= 1
( 6)清除中断标志 CLI 置 IF= 0
( 7)中断标志置位 STI 置 IF= 1
2、处理器 CPU与外部事件的联系
HLT 停机指令
WAIT 等待指令
ESC 交权指令
LOCK 总线封锁指令
3、空操作指令
格式,NOP
作用:使 CPU执行一次空操作,用于延时。
3.3 指令编码
每一条汇编源程序对应一条机器目标代码。
指令编码说明机器目标代码的构成。
四种格式:
格式一:双操作数指令编码格式。
其目标代码长度为 2- 6个字节。由四部分构成。 P52
格式二:单操作数指令编码格式
其目标代码长度为 2- 4个字节。 P56
格式三:与 AX,AL有关的指令编码格式 P57
格式四:单字节机器指令格式 P57
第四章:基本汇编语言
masm link
源程序 (.asm)—— >目标程序 (.obj) —— >可执行程序 (.exe)
4.1.1 指令语句格式
汇编程序,ASM MASM TASM OPTASM
汇编程序的三种基本语句:
指令语句 伪指令语句 宏指令语句
一、指令语句(可执行语句)
格式,注释操作数指令助记符标号,
,;
1、标号字段:
标号:指令的符号地址(代表该指令第一个字节地址)
常用于转移指令或子程序调用指令中。
2、指令助记符字段
不可省略,表明应完成的操作。
3、操作数字段
两个,1个或无。
4、注释字段
任选,必须以;开头,用于提高程序可读性,汇编
时不加入目标代码。
4.1.2、伪指令语句格式
不产生目标代码,是对操作数的说明。
格式:
注释操作数伪指令符号名
,;
1、符号名
符号名后无:(与指令的区别),可以是常量名、
变量名、过程名、结构名、记录名等。
当它作为指令或伪指令的操作数时,符号名表示一
个常量或存储器地址。
2、伪指令
不可省,表示应完成的操作。
3、操作数
可是常数、字符串、常量名、变量名、表达式等。
操作数之间用,隔开。
4、注释
同上。
4.1.3、标识符
指令语句中的标号和伪指令语句中的符号名的统称。
标识符组成规则
以字母和 5个特殊字符(@? _.$)开头,其后可包含它
们与数字组成的字符串。
长度不超过 31个字符。
不能使用系统保留字。
4.2,汇编语言数据
汇编语言能识别的数据:常数、变量、标号
4.2.1、常数 (纯数值,无属性)
定义:在程序运行中其值固定不变的数。
1、数值常量
类型, (1)二进制数 ( B)
(2)八进制数 ( Q,O)
(3)十进制数 ( D)
(4)十六进制数( H,对以 A~F开始的数前加 0)
(5)实数(一般用十进制形式给出)
格式,± 整数部分 ﹒ 小数部分 E ± 指数部分
2、字符串常数
用引号(‘或“)括起来的一个或多个字符。以 ASC码存储。 P65
常数在指令中的 3种作用(立即数、位移量、初值) P65
4.2.2、变量
定义:存放在存储单元中,程序运行期间可以变化的
数据(用伪指令定义,用变量名或存储器寻址方式访问)。可认为变量名为符号地址。
1、数据定义伪指令 (DB,DW,DD,DQ,DT)
作用:给变量分配存储单元,赋一个名。
DB
格式,[变量名 ] DW 表达式 1,表达式 2,…
DD
变量的三种属性
( 1)段属性 (segment)
( 2)偏移量属性 (offset)
( 3)类型属性(由 DB,DW,DD定)
数据定义伪指令中表达式的四种类型,
( 1)数值表达式,用于对存储单元置初值
( 2)?表达式:表预先分配存储单元,以后可置任何内容
( 3)字符串表达式
对 DB伪指令:为字符串每字符分配一个字节单元
从左向右以 ASC码按地址递增的顺序存放。
对 DW伪指令:按字分配存储单元 (表达式只能 1~2字符 )
对 DD伪指令:按双字分配存储单元 (表达式只能 1~2字符 )
( 4) DUP表达式(定义重复数据表达式)
DB
格式, [变量名 ] DW 表达式 1,DUP(表达式 2)
DD
注, 表达式 1为重复次数,表达式 2为重复内容
2、变量的使用
(1) 在指令语句中的应用
可通过变量名直接引用变量(符号地址或位移量)。
(2) 在伪指令语句中的应用
在伪指令语句中引用一个变量名就是预置变量名的地址 (如使用 DW,则预置变量名的偏移量,如使用 DD,则预
置变量名的偏移量和段基址 ) P69
4.2.3、标号
标号是一条指令目标代码的符号地址,常作为转移指令,子程序调用指令的操作数。
标号的三属性
1、标号 的属性
( 1)段属性 ( 2)偏移量属性
( 3)类型属性(距离属性):
NEAR:本标号只能被本段的转移或调用指令访问。
FAR,本标号可被其它段的转移或调用指令访问。
设置距离属性的两方法:
① 隐含方式:在指令语句中使用标号,隐含 NEAR属性。
如 SUB1,MOV AX,30H
② 用 LABEL伪指令定义
2,LABEL伪指令
格式:标号或变量名 LABEL 类型
标号或变量名作为标识符,因而具有段、偏移量、
类型三种属性。
若与指令连用,其类型属性为 NEAR,FAR。 若与变量
连用,其类型属性为 BYTE,WORD,DWORD
使用 LABEL的两种情况:
( 1)与指令连用 如:
SUB1 LABEL FAR
SUB2,MOV AX,30H
SUB1与 SUB2有相同的逻辑地址,但有不同的类型
属性。段内转移用 SUB2作入口,段间转移用 SUB1作入
口。
( 2)与数据定义语句连用 如:
DA1 LABEL BYTE
DA2 DW 20H DUP( 0)
DA1与 DA2有相同的逻辑地址,但有不同的类型
属性。如按字访问存储单元用 DA2,如按字节访问存储
单元用 DA1。
4.3 符号定义语句(为编程的方便而定义)
一、等值语句
格式:符号 EQU 表达式
作用:把表达式的值赋给符号。
表达式的几种情况:
( 1)常数或数值表达式
( 2)地址表达式
( 3)变量名、标号、寄存器或指令助记符
作为替代符号用,不产生目标代码。不占用存储单
元,因此没有段、偏移量、类型三种属性。且不能重新
定义同一符号。
4.3.2、等号语句
格式:符号=表达式
与上一语句的区别:可重新定义符号。
4.4 表达式与运算符
表达式:由常数、变量、标号、通过操作运算符连接
起来的式子。其值是汇编过程中计算确定的。
运算符类型:算术运算符
逻辑运算符
关系运算符
数值返回运算符
属性修改运算符
一、算术运算符 p73
二、逻辑运算符 p74
三、关系运算符 p74
关系运算结果为真(全为 1)为假(全为 0)
4.4.4、数值返回运算符
其操作对象为存储器地址 (即变量名或标号 )。结果为
一数值。格式:<运算符> <变量名或标号>
1,SEG运算符
格式,SEG <变量名或标号>
其值为变量名或标号所在段的段基值。
2,OFFSET运算符
格式,OFFSET <变量名或标号>
结果为偏移量
3,TYPE运算符
将类型属性数字化。
格式,TYPE <变量名或标号>
BYTE 1 NEAR - 1
变量 WORD 2 标号
DWORD 4 FAR - 2
4,LENGTH运算符
格式,LENGTH 变量
返回数组变量元素个数。分为两种情况:
( 1)无 DUP说明,则为 1。
( 2)有 DUP说明,返回外层 DUP给定的值。
5,SIZE运算符
格式,SIZE 变量
返回数组变量所占总字节数( LENGTH* TYPE)。
4.4.5、属性修改与分离字节运算符
1、属性修改运算符
(1)PTR运算符
格式,类型 PTR 地址表达式
用于修改变量 (BYTE,WORD,DWORD)与标号(NEAR,FAR)的属性。可用在指令与伪指令语句中 p77
(2)THIS运算符
格式,THIS 类型 P78
2、分离字节运算符
格式,HIGH/LOW 表达式
作用:用于分离运算对象的高 /低字节。
表达式必须具有常量值,(常数或地址表达式)。
不能用于分离 R/M的内容,主要用于分离地址 P79
4.4.6、运算符的优先级
规则,( 1)先执行优先级别高的运算。
( 2)同级别从左至右运算
( 3)可用()改变运算顺序 P79 表 4-3
4.5程序的段结构
4.5.1、段定义伪指令
格式:段名 SEGMENT [定位类型 ][组合类型 ][类别名 ]
段名 ENDS
[定位类型 ][组合类型 ][类别名 ]为任选项。用空格分隔。
不能交换顺序。
1、段名
用户自定,通常用与用途相关的名字。数据- DATA
堆栈- STACK 代码- CODE
2、定位类型
表示对段的起始地址的要求。
( 1) PAGE(页):表示本段从一个页的边界开始。
(一页为 256个字节)。段起始地址的后 8位二进制为 0。
1M存储空间可划分为 4096个页。
( 2) PARA(节)( 隐含):表示本段从一个小节的边界
开始。( 1小节为 16个字节)。段起始地址的后 4位二进制
为 0。
( 3) WORD(字):表示本段从一个偶数字节地址开始,
起始地址的最后一位二进制数为 0。(即以 0,2,4,6,8,
A,C,E结尾)
( 4) BYTE(字节),表本段起始单元可从任一地址开始。
3、组合类型
用于指定段与段之间的连接和定位
( 1) NONE(隐含):表本段与其它段无连接关系。
(本段装入内存时已有自己的物理段,因而有自己的段基
址)。
( 2) PUBLIC:在满足定位类型的前提下,将本段与同名
的段邻接在一起,形成一个新的逻辑段,公用一个段基址,
所有偏移量调整为相对于新逻辑段的起始地址。
( 3) COMMON:当连接多个模块时,产生一个复盖段。把
本段与其它也用 COMMON说明的同名段置成相同的起始
地址,共享相同的存储区,存储区长度由同名段中最大段
确定。
( 4) STACK:把所有同名段连接成一个连续段。系统自
动初始化 SS和 SP(用户程序中至少有一个段用 STACK说明 )
( 5) AT表达式:表示本段可定位在表达式所指示的小节
边界上。如 AT 0930H,表示本段从物理地址 09300H开始。
( 6) MEMORY:表示本段在存储器中应定位在所有段的
最高地址。
4、类别名
必须用单引号括起来。不能再作程序中的标号、变量
名或其它定义符号。连接处理时,LINK程序把类别名相同
的所有段存放在连续的存储区中。
4.5.2、段寻址伪指令( ASSUME)
CPU访问存储器时,需把逻辑地址转换成物理地址。
ASSUME指示汇编程序已定义的段与段寄存器的对应关
系。
格式 ASSUME 段寄存器名:段名,段寄存器名:段名,…
段寄存器名为 CS,ES,DS,SS之一
段名为用 SEGMENT/ENDS已定义的段。
ASSUME一经设置,一直有效。但可修改。
( 1)删除
格式,ASSUME 段寄存器名,NOTHING
( 2)全部删除
格式,ASSUME NOTHING
ASSUME不产生目标代码。
4.5.3、段寄存器的装入
ASSUME伪指令只建立了当前段与段寄存器之间的联
系,但不能把各段的段基址装入相应寄存器中。
段寄存器的装入用程序的方法。
1,DS,ES的装入
以立即数的形式经通用寄存器传送给 DS,ES。且在
段寻址伪指令( ASSUME)中说明 P84
2,SS的装入
( 1)在段定义伪指令( SEGMENT)的组合类型项选择
STACK参数。且在段寻址伪指令( ASSUME)中说明
( 2)在段定义伪指令( SEGMENT)的组合类型中如未
选择 STACK参数。可用类似于 DS,ES的装入办法。此
法可用于调换堆栈段。 P84
3,CS的装入
( 1)按照结束伪指令指定地址自动装入 CS,IP。
格式,END 起始地址
起始地址常为标号。为程序的起始点。
( 2)在程序运行期间,当执行某些指令或操作时,CPU
会自动修改 CS,IP,以指向新的代码段。
如,过程调用指令 CALL 段间返回指令 RET
段间无条件转移指令 JMP
中断返回指令 IRET
硬件复位操作 RESET
4.6 过程定义伪指令
过程:子程序
格式:过程名 PROC ( NEAR/FAR)
RET
过程名 ENDP
调用过程格式,CALL 过程名
注( 1)隐含为 NEAR属性,为段内调用。 CPU将断点
的 IP入栈,并由子程序返回指令 RET将断点偏移量送 IP。
( 2)如为 far属性,则为断间调用。 CPU将 IP,SP入
栈。 并由子程序返回指令 RET将断点偏移量和段基址送
IP和 SP。
( 3)每一过程中必须有 RET指令。
( 4)具有 FAR属性的过程可段内调用,CPU按照段
间调用处理。
4.7 定位伪指令 ORG和当前位置计数器 $
$:汇编时的当前偏移量(当前程序或数据的下一字节
单元的偏移量)。
ORG格式,ORG 表达式
作用:把表达式的值赋给 $,即以表达式值作为起始
偏移量。
注 ( 1)表达式以 65536 ( 216)为模进行计算。
( 2)表达式值为正数。
( 3)表达式中可包含 $。
4.8 标题伪指令
格式,TITLE 文本
作用:给程序指定一个标题,列表文件中每一页的
第一行都显示。文本字符个数不超过 60。
4.9 程序模块的连接
对复杂的汇编程序,可先编制多个汇编源程序(模
块),再通过连接程序 LINK连接成可执行文件。
多个模块之间的联系是通过对符号的访问实现的。
当一个符号(变量名、标号等)能被所有模块访问时,
它为全局符号。
当一个符号(变量名、标号等)仅能被自己模块访
问时,它为局部符号。
未经说明的符号为局部符号。
全局符号必须唯一,局部符号可以相同。
1、全局符号伪指令
格式,PUBLIC 符号 1,符号 2,…
格式,PUBLIC 符号 1,符号 2,…
说明:符号必须是本模块中定义的变量名、标号、常数、
等值符号(用 EQU或 =定义)、过程名。 PUBLIC可在任
何一行出现。
2、外部符号说明伪指令
格式,EXTRN 符号 1:类型,符号 2:类型,…
作用:此指令告诉汇编程序,符号 1、符号 2不是本模块
定义的,但一定在其它模块中用 PUBLIC已说明。
符号类型不能省:分为以下情况:
( 1)如符号为变量名,类型应为 BYTE,WORD、
DWORD
( 2)如符号为标号或过程名,类型应为 NEAR,FAR
( 3)如符号为常量或等值符号,类型应为 ABC
补充:有关 I/O的 DOS功能调用
以前的例子,程序运行的结果是保留在 R/M中,为了
在 CRT上显示出来,可调用 DOS的 I/O子程序。
DOS的核心是由许多 I/O驱动、磁盘读写以及文件管
理等子程序构成,这些子程序编了号(可查表),可由
汇编源程序调用。分为两步:
( 1)把子程序规定的入口地址送至指定寄存器。
( 2)把子程序的号(系统功能调用号)送至 AH。
然后由中断调用指令 INT 21H实现调用。
所以,结束用户程序返回操作系统可用两条指令实现:
MOV AH,4CH
INT 21H
第五章 顺序、分支与循环程序设计
5.1 概述
CPU将存储器划分为若干段,段是可独立寻址的逻辑
单位。汇编语言源程序是建立在段结构基础上,因此,
编程的过程即是构造段的过程。
5.1.1 汇编语言程序的设计步骤:
1、分析问题,建立数学模型
2、确定算法
3、编制程序流程图
流程图的符号组成:
处理框 判断框 起止框 连接框 流向线
4、合理分配存储空间和寄存器
汇编程序可直接处理存储器的存储单元。
存储单元的三种用途:
( 1)常数单元:存放常量
( 2)数据单元:存放程序处理对象(可通过程序改变,
但一般不变,以便程序可多次运行)。
( 3)工作单元:存放中间结果和最后结果(经常变化)
CPU寄存器数量有限,应合理使用,并注意隐含使用
和特定使用的情况。
5、编程:用文本编辑软件编辑。扩展名为,asm
6、汇编源程序:格式,MASM 文件名(,ASM)
7、连接:格式,LINK 文件名(,OBJ)
8、调试:修改源程序或用 DEBUG
9、执行:文件名(,EXE)
应注意源程序中的字符必须是 ASCⅡ 字符(半角字符)
5.1.2 程序的基本结构式
顺序结构 分支结构 循环结构 P94 图 5-1
5.2 顺序结构程序设计 P94
特点,自顶向下顺序执行。
设计查表程序时,可使用换码指令 XLAT
格式, XLAT 表首址
功能,AL (( BX)+( AL)) P96
5.3 分支程序设计
即在程序运行期间改变它的执行顺序,由 CS和 IP定。
5.3.1 转移指令
一、无条件转移指令
格式,JMP 目标地址
转移分段内和段间两种,每种都有直接寻址和间接寻址两种格
式。
1、段内转移(修改 IP)
( A)段内转移直接寻址
格式,JMP 标号
JMP指令的操作数部分直接给出目标单元。
IP<=(IP)+DISP
DISP为带符号数,它表示 JMP指令的下一条指令地址与标号代表的指
令地址之间的字节距离。
( B)段内转移间接寻址
JMP指令的目标地址在某通用寄存器或字存储单元中。
格式,JMP CX 操作为,IP <=(通用寄存器 )
或 JMP WORD PTR [BX] 操作为,IP<=(EA)
2、段间转移(修改 IP和 CS)
( A)段间转移直接寻址
格式,JMP FAR PTR 目标
操作为,IP<=目标地址的偏移量
CS <=目标地址的段基值
( B)段间转移间接寻址
转移目标地址在一个地址指针的双字单元中。
如,JMP DWORD PTR ADDR
或 JMP DWORD PTR [BX][SI]等存储器操作数寻址方式。
操作为,IP<=(EA)
CS<=(EA+2)
5.3.2、条件转移指令( 18条)
基本格式,JXX 目标
XX指条件,条件成立,则转移到目标,否则顺序执行。
18条转移指令都以 FLAGS的某一个或几个标志位的状态作为判断
条件,但不影响 FLAGS。
条件转移指令分为三类:
1、单条件转移指令
(1)根据某个标志位的状态判断条件。 P100
(2) JCXZ 指令
格式,JCXZ 目标地址
若( CX) =0,转到目标地址;否则,顺序执行。
2、无符号数条件转移指令
使用无符号数条件转移指令前,用 CMP指令比较 A,B两个无符
号数得到 CF及 ZF。 P101
3 带符号数条件转移指令
使用带符号数条件转移指令前,用 CMP指令比较 A,B两个带符
号数得到 SF,OF,ZF。 P102
5.3.3、分支程序设计
分支程序常用的两种结构,P102 图 5-5
1,用条件转移指令实现程序分支
常用于分支不多的情况。在标志寄存器中设置相应标志位,再
选用条件转移指令实现分支。
一条转移指令只产生两路分支
N条转移指令可产生 N+ 1路分支
2、用跳转表形成多路分支的程序设计
跳转表:某程序需 N路分支,设每路程序的入口地址分别为SUB1,SUB2,SUB…SUBn,把这些入口地址组成一个表,叫跳转
表。分为两种情况。
….
Sub1-L
Sub1-H
Sub2-L
Sub2-H
Sub3-L
Sub3-H
Sub4-L
Sub4-H
Sub5-L
Sub5-H
….

….
表首址 表首址
JMP sub1
JMP sub3
JMP sub2
(a) 表内是跳转的入口地址 (b) 表内是跳转指令
5.4 循环程序设计
5.4.1、循环控制指令( 4条)
隐含使用 CX寄存器作计数器。
一,LOOP指令
格式,LOOP 目标地址
功能,CX每循环一次自动减一,直至为 0时退出循环。
二,LOOPE/LOOPZ指令
格式,LOOPE/LOOPZ 目标地址
功能:在进行循环计数后,若( CX) ≠ 0且 ZF= 1,则
循环,否则退出循环。
三,LOOPNE/LOOPNZ指令
格式,LOOPNE/LOOPNZ 目标地址
功能:在进行循环计数后,若( CX) ≠ 0且 ZF= 0,则
循环,否则退出循环。
四,JCXZ指令
格式,JCXZ 目标
功能:仅测试寄存器 CX的内容,如( CX)= 0,则转
移至目标单元(跳过循环),否则顺序执行下面的循环部
分。常用于循环前(如循环次数是由前面的运算结果得到
的情况),检测是否进行循环。
5.4.2、循环程序的结构
1、初始化部分
建立循环初始值(地址指针,计数器等)
2、工作部分
循环主体。可以是顺序程序、分支程序、另一个循环
(多重循环)
3、修改部分
修改参数(地址指针、循环参数等)
4、控制部分
判断循环条件
( 1)、用计数控制循环,用于已知循环次数。
( 2)、用条件控制循环,用于循环次数末知。
5、结束部分
存储处理结果
循环程序常用两种结构:
先工作后判断 先判断后工作
5.4.3、单重循环程序设计
一、用计数控制循环
二、用条件控制循环
5.4.4多重循环程序设计
第六章 子程序设计
6.1、子程序的定义
6.1.1 子程序的定义
子程序用过程定义伪指令 PROC和 ENDP来定义的,
PROC_NAME PROC [NEAR/FAR]

RET

PROC_NAME ENDP
对 NEAR和 FAR属性的子程序还可以用以下方法定义,
NPROC,FPROC LABEL FAR
┇ ┇
RETN RETF
6.1.2 子程序的调用与返回
1、子程序调用
( 1)段内调用与返回
调用指令与子程序在同一段,仅修改 IP。
( 2)段间调用与返回
调用指令与子程序在不同段,修改 CS和 IP。
无论段内调用还是段间调用,寻找目标地址均有直
接寻址(直接调用)和间接寻址(间接调用)两种方式。
CALL指令与 JMP指令的区别:
相同点:均是无条件转移到目标单元。
不同点,CALL指令要保留“断点”,JMP指令不保留断
点。
断点,CALL指令的下一条指令首字节地址。
2、调用指令
格式,CALL 过程名
功能:首先保留断点于堆栈中,再转到目标单元。
对 FLAGS无影响。
( 1)段内调用
( A)段内直接调用
格式,CALL 过程名
指令编码格式为 3字节。
( B)段间调用
被调用的子程序的起始地址(偏移量)在一个通用
寄存器或一个字存储单元中。
格式,CALL BX
CALL WORD PTR 20H[BX][SI]
指令编码格式为 2~4字节。
( 2)段间调用
( A)段间直接调用
在定义过程时已说明为 FAR属性:
CALL PROC_ NAME
在定义过程时末说明为 FAR属性:
CALL FAR PTR PROC_ NAME
指令编码格式为 5字节。
( B)段间间接调用
被调用子程序的起始地址(段基值、偏移量)在一个 4
字节组成的地址中。
格式,CALL DWORD PTR DISP[BX][SI]
指令编码格式为 2~4个字节。
3、返回指令
一个子程序执行的最后一条指令必定是返回指令 RET)。
其功能为返回到调用此子程序的断点处。
当过程定义为 NEAR时,RET为段内返回。
当过程定义为 FAR时,RET为段间返回。
RET指令不影响 FLAGS。
( 1)段内返回
指令编码为 C3。从堆栈顶部弹出一个字送 IP。
( 2)段间返回
指令编码为 CB。从堆栈顶部弹出二个字送 IP,CS。
( 3)带弹出值的返回指令
格式,RET N ( N为偶数)
段内、段间返回指令均可使用。
它表示从堆栈中弹出返回地址后,再次修改 SP的值:
SP← ( SP)+ N
6.2、编制子程序的基本要求
1、子程序必须有一定的通用性
2、选用适当的方法在主程序与之间进行参数传递
3、注意信息的保存
4、正确使用堆栈
5、编制子程序文件
6.3、子程序和主程序间的参数传递举例
6.3.1、用寄存器传递参量
6.3.2、用堆栈传递参量
6.3.3、用地址表传递参量
6.4、子程序的嵌套与递归调用
6.4.1 子程序的嵌套调用
一个程序调用另一个子程序叫子程序嵌套。
子程序嵌套层次受堆栈空间大小的限制( 32K字)
6.4.2 子程序的递归调用
一个子程序调用自身叫递归调用。
递归调用是子程序嵌套的特例。
6.5 多模块程序设计
对复杂的汇编程序,可先编制多个汇编源程序(模
块),再通过连接程序 LINK连接成可执行文件。
多个模块之间的联系是通过对符号的访问实现的。
当一个符号(变量名、标号等)能被所有模块访问时,
它为全局符号。
当一个符号(变量名、标号等)仅能被自己模块访
问时,它为局部符号。
未经说明的符号为局部符号。
全局符号必须唯一,局部符号可以相同。
1、全局符号伪指令
格式,PUBLIC 符号 1,符号 2,…
说明:符号必须是本模块中定义的变量名、标号、常数、
等值符号(用 EQU或 =定义)、过程名。 PUBLIC可在任
何一行出现。
2、外部符号说明伪指令
格式,EXTRN 符号 1:类型,符号 2:类型,…
作用:此指令告诉汇编程序,符号 1、符号 2不是本模块
定义的,但一定在其它模块中用 PUBLIC已说明。
符号类型不能省:分为以下情况:
( 1)如符号为变量名,类型应为 BYTE,WORD、
DWORD
( 2)如符号为标号或过程名,类型应为 NEAR,FAR
( 3)如符号为常量或等值符号,类型应为 ABS
补充,DOS功能子程序调用
DOS有许多功能子程序( 84个),分为磁盘读写控
制、文件管理、目录管理、内存管理、基本输入 /输出管
理等几类。
调用方法:
( 1)送入口参数给指定寄存器
( 2) AH← 功能号
( 3) INT 21H
1、带显示的键盘输入( 1号功能)
功能:等待键盘输入一个字符,将其 ASC码送 AL,并
屏显。按 CTRL+ BREAK( CTRL+ C)终止。
2、不带显示的键盘输入( 8号功能)
功能:与 1号功能相似。但不屏显。
3、不带显示的键盘字符输入( 7号功能)
功能:与 1号功能相似。但不屏显,且不响应 CTRL+
C和 TAB。
4、字符串输入( 0AH号功能)
功能:可接受一串字符,用 CTRL+ C中断。
使用前,须在内存中建立一缓冲区,第一个字节存
放它保存的最大字符数( 1~255,不能为 0),该值由用
户程序事先设置;第 2个字节存放实际调用的字符数(回
车除外),此数由 DOS自动填入。用户输入的字符串从
第 3个字节开始存放,直至回车结束(自动将回车符的
ASC码 0DH加在末尾),如输入的字符超过缓冲区容量,
则多余字符不能存入。调用时须将 DS,DX寄存器指向
缓冲区的段基址和偏移量。
5、字符显示( 2号功能)
功能:屏显单个字符,其 ASC码存放在 DL中,可显示
任一 ASC码字符。
6、字符打印( 5号功能)
功能:把 DL中的字符( ASC码)送打印机打印。
7、字符串显示( 9号功能)
功能:显示内存数据区存放的字符串(字符串以 $结束,
且须将字符串的段基址及首址的偏移量存入 DS,DX,
且不能显示 $符号)。
8、直接输入和输出( 6号功能)
功能:键盘输入或屏显(由 DL内容定)
( 1)( DL)= 00~ 0FEH 屏显
功能:显示字符的 ASC码在 DL中,同 2号功能。
( 2)( DL)= 0FFH 键盘输入
其功能与 1,7,8号不同,它不等待键盘的字符输入,
在执行本功能时,若键盘已输入字符,则字符的 ASC码
在 AL中,且标志位 ZF= 0;若未按键,则标志位 ZF= 1。
9、读出系统日期( 2AH号功能)
功能:将系统日期数据读出,存入指定寄存器中。
CX:年 DH:月 DL:日 AL:星期
10、设置系统日期( 2BH号功能)
功能:将指定寄存器中日期信息(同 2AH号功能)写
入系统。如写入成功,则( AL)= 0,否则,( AL)=
0FFH;故可在写入完成后用 AL的值来确定写入是否成
功。
11、读出系统时间( 2CH号功能)
功能:取出系统时间信息放入指定寄存器中。
CH:时 CL:分 DH:秒 DL:百分秒
12、设置系统时间( 2DH号功能)
功能:将 CX,DX中的时间数据(与 2CH功能同)写入
系统。如设置有效,( AL)= 0,否则( AL)= 0FFH。
第七章 数值运算程序设计
7.1 加减法运算
7.1.1 二进制数加减运算
二进制数加减运算会影响标志寄存器的状态位,
7.1.2 十进制数加减运算
以前讨论的主要是二进制运算,而人们日常生活中使
用最普遍的是十进制,为了解决计算机处理十进制的问题,
常使用两种方法:
( 1)输入的十进制数经计算机转换为二进制数,输出时再
转换为十进制数。
( 2)计算机提供十进制运算指令
BCD码:二进制表示的十进制数
计算机提供有 BCD码指令,以便进行直接的十进制运
算,通过两种方法实现。
( A)系统提供 BCD码的加、减、乘、除指令
( B)先用二进制的加、减、乘、除运算,然后对运算
结果进行 BCD码校正(转换为相应的 BCD码)。
一,BCD码校正指令
组合型:一个字节表示两个 BCD码
BCD码:
非组合型:一个字节的低 4位表示一个 BCD码,
高 4位( 0000或 0011)对表示的十进制数无影响。
1、非组合型加法校正指令 AAA
功能:在执行 AAA前,已用过 ADD或 ADC指令,且加
法运算结果已在 AL中,执行 AAA即对 AL中的数据进行校
正,校正结果仍在 AL中,向高位的进位在 AH和 CF中。
若 AL中低 4位的数> 9或 AF= 1,则执行校正:
实际情况有三种:
(1),AL中低 4位的数> 9,须校正 (例如 8+6)
述 +6
(2),AL中低 4位的数< 9,但 AF= 1,须校正 (例如 8+9)
(3),AL中低 4位的数< 9,但 AF= 0,不须校正 (例如 3+5)
校正方法,
AL=( AL)+ 6,AH=( AH)+ 1,且 AL中高 4位清 0,
AF,CF置 1。
2、组合型加法校正指令 DAA
功能:在执行 DAA前,已用过 ADD或 ADC指令,且加法
运算结果已在 AL中,执行 DAA即对 AL中的数据进行校
正,校正结果仍在 AL中,向高位的进位仅在 CF中。
(1)若 AL中低 4位的数 >9或 AF=1,则 AL= (AL)+ 6,AF←1
(2)若 AL中高 4位的数 >9或 CF=1,则 AL= (AL)+60H,CF←1
3、非组合型减法校正指令 AAS
功能:在执行 AAS前,已用过 SUB或 SBB指令,且减法运算结果已在 AL中,执行 AAS即对 AL中的数据进行校正,
校正结果仍在 AL中,向高位的借位放在 AH和 CF中。
若 AL中低 4位> 9或 AF= 1,则 AL=( AL)- 6,AH=( AH)- 1,且把 AL中高 4位清 0,CF,AF置 1。
4、组合型减法校正指令 DAS
功能:在执行 DAS前,已用过 SUB或 SBB指令,且减法运算结果已在 AL中,执行 DAS即对 AL中的数据进行校正,
校正结果仍在 AL中,向高位的借位仅在 CF中。
(1)若 AL中低 4位的数 >9或 AF=1,则 AL= (AL)- 6,AF←1
(2)若 AL中高 4位的数 >9或 CF=1,则 AL= (AL)-60H,CF←1
7.2 乘除法运算
包括无符号数和带称号数乘除法
7.2.1 二进制数乘除法运算
1、无符号数乘法指令 MUL
格式,MUL OPRD ( OPRD只能为 R/M)
OPRD为一个操作数,另一个操作数隐含使用 AL( AX)
字节无符号数相乘,AX=( AL)*( OPRD)
字无符号数相乘,DX,AX=( AX)*( OPRD)
MUL指令只影响标志寄存器的 CF,OF:
对乘积:如 AH(字节乘法)或 DX(字乘法)为全 0,
则 CF= 0,OF= 0。否则,CF= 1,OF= 1(表 AH,DX
中有乘积的有效数字),主要用于检查字节相乘的结果
是字节还是字,或字相乘的结果是字还是双字)
2、带符号数乘法指令 IMUL
格式,IMUL OPRD ( OPRD只能为 R/M)
OPRD为一个操作数,另一个操作数隐含使用 AL( AX)
字节带符号数相乘,AX=( AL)*( OPRD)
字带符号数相乘,DX,AX=( AX)*( OPRD)
MUL指令只影响标志寄存器的 CF,OF:
如 AH(字节乘法)或 DX(字乘法)不是低半部的符号
扩展(全 0或全 1),则 CF= 1,OF= 1(表 AH,DX中有
乘积的符号和有效数字),否则,CF= 0,OF= 0。
MUL与 IMUL的区别:仅是操作数不同
3、无符号数除法指令 DIV
格式,DIV OPRD ( OPRD只能为 R/M)
OPRD为除数,被除数、商、余数隐含使用:
字节除法,AL=( AX) /( OPRD)的商
AH= ( AX) /( OPRD)的余数
字除法,AX=( DX,AX) /( OPRD)的商
DX= ( DX,AX) /( OPRD)的余数
除法指令要求的字节操作要求被除数为 16位,字操作
要求被除数为 32位,因此,常需要用符号扩展的方法取
得除法指令所需的被除数格式。
DIV不影响标志寄存器,但可能产生溢出错误,并直接
转入相应出错中断处理:
( 1)( OPRD)= 0
( 2)商,( AL)> 0FFH或( AX)> 0FFFFH
4、带符号数除法指令 IDIV
格式,IDIV OPRD ( OPRD只能为 R/M)
OPRD为除数,被除数隐含使用:
字节除法,AL=( AX) /( OPRD)的商
AH= ( AX) /( OPRD)的余数
字除法,AX=( DX,AX) /( OPRD)的商
DX= ( DX,AX) /( OPRD)的余数
DIV不影响标志寄存器,但可能产生溢出出错,并直
接转入相应出错中断处理:
( 1)( OPRD)= 0
( 2)商:
对字节:( AL)>+ 127( 7FH)或( AL) <- 127(81H)
对字 (AX)>+ 32767( 7FFFH)或 (AX)<- 32767(8001H)
5、字节 /字扩展指令 CBW/CWD
两指令为无操作数指令,隐含使用 AX,DX
CBW:扩展 AL中符号位至 AH中(字节转换为字)即:
如 (AL)的最高有效位为 0,则执行 CBW后( AH) =00H
如 (AL)的最高有效位为 1,则执行 CBW后( AH) =0FFH
CWD:扩展 AX中符号位至 DX中(字转换为双字)即:
如 (AX)的最高有效位为 0,则执行 CWD后( DX) =0000H
如 (AX)的最高有效位为 1,则执行 CWD后 (DX)=0FFFFH
两指令用于除法指令前,形成双倍长度的被除数。对标志寄存器无影响。
7.2.2、十进制数乘除运算
1,非组合型 BCD码乘法调整指令 AAM
在执行此指令前,必须先执行 MUL等指令将两个非组合
型 BCD码相乘,并将结果放在 AL寄存器中,再进行调整。
调整过程:
( 1)( AH) <— AL寄存器的值除以 0AH所得的商。
( 2)( AL) <— AL寄存器的值除以 0AH所得的余数。
此指令修改 SF,ZF,PF位,OF,CF,AF位无定义。
2、非组合型 BCD码除法调整指令 AAD
注:先执行非组合型 BCD码除法调整指令 AAD,再执行
二进制除法。
被除数是存放在 AX中的两位非组合型 BCD码,AH与
AL的高 4位都为 0。除数是 1位非组合型 BCD码,高 4位也
为 0。调整操作为:
( 1) ( AL) <— 10*( AH) +( AL)
( 2) ( AH ) <— 0
此指令修改 SF,ZF,PF位,OF,CF,AF位无定义
7.3 多精度数运算
8086/8088CPU的每一条指令只能处理 8位或 16位二
进制数,表达数值范围有限。所以常用多字节或多字来
表达一个数据。需要编制子程序或程序段来完成对多精度数据的处理。