2009-7-31 1
微机原理及应用第 3章 指令系统微机原理及应用 —— 第 3章 指令系统 2
第 3 章 指令系统主要内容学习目的知识点重点难点微机原理及应用 —— 第 3章 指令系统 3
8086/8088指令系统基本数据类型;
主要内容计算机指令格式;2
1
3
4
8086寻址方式;
微机原理及应用 —— 第 3章 指令系统 4
1.掌握指令的寻址方式 ;
2.了解指令的机器语言格式;
3.掌握 8086/8088的指令系统;
学习目的微机原理及应用 —— 第 3章 指令系统 5
3.1 8086数据类型和指令码格式
3.2 8086操作数寻址方式
3.3 程序转移地址的寻址方式
3.4 8086指令系统
3.5 数据传送指令
3.6 算术运算指令
3.7 逻辑运算和移位指令
3.8 串处理指令
3.9 程序转移指令
3.10 处理器控制指令知识点微机原理及应用 —— 第 3章 指令系统 6
1.指令的寻址方式;
2.指令系统;
重点微机原理及应用 —— 第 3章 指令系统 7
十进制调整指令;
串操作指令;
难点微机原理及应用 —— 第 3章 指令系统 8
3.1 数据类型
IA- 32结构的基本数据类型
字节,8位
字,16位,2个字节
双字,32位,4个字节
四字,64位,8个字节 ( 80486CPU引入)
双四字,128位,16个字节 ( Pentium III)
数据在内存中的字节顺序
80X86多字节数据的存放原则是低位字节在低端地址,高位字节在高端地址。
微机原理及应用 —— 第 3章 指令系统 9
3.1 数据类型
字、双字、四字和双四字的对齐
字、双字、四字和双四字不需要对齐至自然边界
自然边界:偶数编号的地址
对其的理由:处理器只需一次存储器访问,否则需要访问两次。
例,1234H存在 1000H单元:数据在内存中的顺序为:
34H
12H
1000H单元
1001H单元微机原理及应用 —— 第 3章 指令系统 10
3.1 数据类型
数字数据类型
整数
无符号整数
带符号整数
浮点数据类型
单精度浮点数
双精度浮点数
指针数据类型:指针是内存单元地址
近指针,32位
远指针,64位微机原理及应用 —— 第 3章 指令系统 11
3.1 数据类型
位字段数据类型
一个位字段(见图 3-5)是连续的位序列。它能在内存中任何字节的任一位位臵开始并能包含最多至 32位。
串数据类型
串是位、字节、字或双字的连续序列。位串能从任一字节的任一位开始并能包含多至 232-1位。
字节串能包含字节、字或双字。
微机原理及应用 —— 第 3章 指令系统 12
3.2 8086指令系统
指令及指令系统
指令 —— 控制计算机完成指定操作的命令
机器指令 —— 指令的二进制代码形式。例如:
CD21H
汇编指令 —— 助记符形式的指令。例如,INT
21H
指令系统 —— CPU所有指令及其使用规则的集合微机原理及应用 —— 第 3章 指令系统 13
3.2 8086指令系统
8088/8086指令系统,
指令向后兼容( x86系列)
应用广泛,资料易于寻找微机原理及应用 —— 第 3章 指令系统 14
3.2 8086指令系统
( 1)数据传送类;
( 2)算术运算类;
( 3)逻辑运算和移位;
( 4)串操作;
( 5)控制转移类;
( 6)处理器控制。
微机原理及应用 —— 第 3章 指令系统 15
部分 8088常用指令指令类型 助记符数据传送数据传送 MOV,PUSH/POP,XCHG等地址传送 LEA,LDS,LES
输入输出 IN,OUT
算术运算加法 ADD,ADC,INC
减法 SUB,SBB,DEC,NEG,CMP
乘 /除法 MUL,IMUL,DIV,IDIV
逻辑 AND,OR,NOT,XOR,TEST
移位 SHL/SHR/SAR,ROL/ROR,RCL/RCR
串操作 MOVS,CMPS,SCAS,LODS,STOS
控制转移 JMP,JXX,LOOP,CALL/RET,INT/IRET
微机原理及应用 —— 第 3章 指令系统 16
3.2.1 指令的基本构成说明 要执行的是什么操作操作对象,可以有 0个,1个或 2个目的 源
Label:
标号微机原理及应用 —— 第 3章 指令系统 17
举例
ADD AX,[SI+6]
MOV AX,BX
操作码 操作数
INC [BX]
HLT
Loading:
微机原理及应用 —— 第 3章 指令系统 18
3.2.2 8086 CPU指令格式汇编指令,用助记符表示机器指令的操作码和操作数,例如上面指令的汇编指令是
MOV AL,62H
机器指令,计算机能识别和执行的指令的二进制代码。如,1011000001100010
微机原理及应用 —— 第 3章 指令系统 19
3.2.2 8086 CPU指令格式
8086 CPU指令格式立即数位移量寄存器方式操作码
1-2字节低字节
1-2字节
1字节 (寻址方式)1字节高字节高字节低字节
r/m
3位
reg
3位
mod
2位
opcode
微机原理及应用 —— 第 3章 指令系统 20
3.2.3 8086的操作数
1、立即数
8位 16位无符号数 00H-FFH(0-255) 0000H-FFFFH(0-65535)
带符号数 80H-7FH(-128~127) 8000H-7FFFH(-32768~32767)
MOV AX,0FA00H ;正确
MOV 8000H,DX ;错误微机原理及应用 —— 第 3章 指令系统 21
3.2.3 8086的操作数
2、寄存器操作数 16 位
AX
AH AL
16 位
BX
BH BL
16 位
CX
CH CL
16 位
DX
DH DL
微机原理及应用 —— 第 3章 指令系统 22
3.2.3 8086的操作数只能存放字操作数段寄存器存放当前操作数的段基地址不允许将立即数传送到段寄存器
SI
DI
BP
SP
CS
DS
ES
SS
微机原理及应用 —— 第 3章 指令系统 23
3.2.3 8086的操作数
3、存储器操作数存储器操作数字节字双字
1
2
4
类型 存储单元个数一般 不允许 两个 操作数同时为存储器操作数
MOV [AX],[BX]
微机原理及应用 —— 第 3章 指令系统 24
3.3 8086操作数的寻址方式
寻址方式 —— 寻找操作数的方法
寻找操作数的地址(一般指源操作数)
寻找要执行的下一条指令的地址微机原理及应用 —— 第 3章 指令系统 25
3.3 8086操作数的寻址方式
计算机中操作数数按存放的方法分为:
立即数(指令中)
寄存器数
存储器数
I/O端口操作数 寻址方式立即数 立即数寻址寄存器数 寄存器寻址相对基址变址寻址存储器数直接寻址寄存器间接寻址基址变址寻址变址寻址端口寻址 直接寻址寄存器间接寻址微机原理及应用 —— 第 3章 指令系统 26
3.3.1 立即数寻址操作数 (为一常数 )直接 由指令给出,
例,MOV AL,80 H
MOV AX,1090 H
MOV CX,100
错误例:
MOV 2A00H,AX ;
1090HAH AL
微机原理及应用 —— 第 3章 指令系统 27
3.3.2 寄存器寻址操作数在寄存器中。
MOV AH,BL
MOV AX,BX
MOV CX,AX
错误例:
MOV AX,BL ; 字长不同
MOV ES,AX,DX ; 寄存器与段无关微机原理及应用 —— 第 3章 指令系统 28
3.3.3 存储器操作数寻址方式
1、规定段寄存器
y 3£ à′?′ à′?′ ò? μ×?2
è· á? CS?T IP
2? 3÷ SS?T SP
′? 2? 3÷?′ μ×?2 DS CS?¢ SS?¢ ES SI
′? 2? 3÷ μ? μ×?2 ES?T DI
ó? B Pó?°?2 SS CS?¢ SS?¢ ES óD D§μ×?2 EA
ò? °? êy?Y ′? è? DS CS?¢ SS?¢ ES óD D§μ×?2 EA
2? 3÷ à′ Dí
ù?2
微机原理及应用 —— 第 3章 指令系统 29
3.3.3 存储器操作数寻址方式任何内存 实际地址 都由两部分组成:
实际地址 =段基址+段内偏移地址(此单元与段基址的距离)
段内的 偏移地址 又称为 有效地址( EA),
8086,EA=基地址寄存器内容+索引+位移量
2、规定偏移量微机原理及应用 —— 第 3章 指令系统 30
3.3.3 存储器操作数寻址方式
[BX] [SI]
[BP] [DI]EA=
8 或 16
位移量+ +
EA= 8 或 16 位移量
[BX]
[BP]
[SI]
[DI]
+
8086CPU,有效地址 EA计算,
微机原理及应用 —— 第 3章 指令系统 31
3.3.3 存储器操作数寻址方式操作数在存储器中,其地址由指令提供 。
例,MOV AX,[ 1070 H ]
DS = 2000 H,物理地址为:
PA=20000H+1070H=21070 H
A1H
70H
10H
....
....
代码段
20 H
30 H
数据段
2000:1070
2000:1071
2000:1072
AH ALAX
直接寻址1
微机原理及应用 —— 第 3章 指令系统 32
3.3.3 存储器操作数寻址方式操作数的偏移地址 (有效地址 EA)放在寄存器中只有 SI,DI,BX和 BP可作间址寄存器例,MOV AX,[BX]
MOV CL,CS:[DI]
错误例,
MOV AX,[DX]
MOV CL,[AX]
寄存器间接寻址2
微机原理及应用 —— 第 3章 指令系统 33
3.3.3 存储器操作数寻址方式例,MOV AL,[BX+5];
若 DS=6000H,BX=2000H,
6 0 0 0 H
9 A HAX
D S
操作码操作码
05H
2
2
2
2
9AH
2 0 0 0 H
B X
数据段代码段
2
E A =2 0 0 0 H + 0 5 H = 2 0 0 5 H
6 2 0 0 5
6 0 0 0 0
寄存器相对寻址3
微机原理及应用 —— 第 3章 指令系统 34
3.3.3 存储器操作数寻址方式
EA=间址寄存器的内容加上一个 8/16位的位移量
EA =
(BX)
(BP)
(SI)
(DI)
+ 8位16位 位移量微机原理及应用 —— 第 3章 指令系统 35
3.3.3 存储器操作数寻址方式例,MOV AX,[BX+SI]
BX=2000H,SI=0006H
5 0 0 0 H
A B H 7 8 H
AX
D S
操作码操作码
2
78H
2
2
2
2
ABH
2 0 0 0 H B X
数据段代码段
2
E A =2 0 0 0 H + 0 6 H = 2 0 0 6 H
5 2 0 0 6 H
5 0 0 0 0 H
E A
0 0 0 6 H S I

基址变址寻址方式4
微机原理及应用 —— 第 3章 指令系统 36
3.3.3 存储器操作数寻址方式
EA=一个基址寄存器的内容 +一个变址寄存器
EA = (BX)(BP) + (SI)(DI)
同一组内的寄存器不能同时出现微机原理及应用 —— 第 3章 指令系统 37
3.3.3 存储器操作数寻址方式例,MOV AH,
[BX+DI+1234H]
4 0 0 0 H
5 0 H A L
A X
D S
3 4 H
1 2 H
·
5 0 H
·
·
·
·
0 2 0 0 H
B X
数据段代码段
·
E A = 0 2 0 0 H + 0 0 1 0 +
1 2 3 4 H = 1 4 4 4 H
4 1 4 4 4 H
4 0 0 0 0 H
E A
0 0 1 0 H
D I

操 作 码操 作 码相对基址变址寻址5
微机原理及应用 —— 第 3章 指令系统 38
3.3.3 存储器操作数寻址方式
EA=一个基址寄存器的内容 +一个变址寄存器 +
一个相对位移量
EA = (BX)(BP) + (SI)(DI) + 8位16位 位移量微机原理及应用 —— 第 3章 指令系统 39
3.3.4 I/O端口寻址
I/O端口寻址(当 I/O端口按独立的 I/O空间编址时)
1、直接端口寻址:
指令直接提供 8位端口地址。
例,IN AL,63H;(AL) ←(63H) { 从 I/O地址号为 63H的端口中读取数据送到 AL中 }
微机原理及应用 —— 第 3章 指令系统 40
3.3.4 I/O端口寻址例,IN AL,DX;(AL) ←((DX))
OUT DX,AL;
{将 AL中的内容输出到地址由 DX寄存器内容所指定的端口中 }
2,间接端口寻址方式:
由 DX寄存器给出 16位端口地址。
微机原理及应用 —— 第 3章 指令系统 41
3.4 IA-32通用指令
8086汇编指令系统,分为 6类:
数据传送指令
算术运算指令
逻辑运算、移位
串操作指令
控制转移指令
处理器控制指令微机原理及应用 —— 第 3章 指令系统 42
3.4.1 数据传送指令
8086指令系统 操作数符号表示
DST:目的操作数
SRC:源操作数
TARGET:循环、转移和调用指令操作数
reg:寄存器操作数,字节或字
reg8:寄存器操作数,字节
reg16:寄存器操作数,字
mem:存储器操作数,字节或字
mem8:字节型 存储器操作数
mem16:字型 存储器操作数
mem32:双字型 存储器操作数
acc:累加器 AL或 AX
微机原理及应用 —— 第 3章 指令系统 43
3.4.1 数据传送指令
1,MOV dest,src; dest←src
传送的是字节还是字取决于指令中涉及的寄存器是 8位还是 16位 。
具体来说可实现:
① MOV mem/reg1,mem/reg2
指令中两操作数中至少有一个为寄存器例,MOV CL,DL
MOV AX,BX
MOV [SI],CX
MOV CL,[BX+5]
微机原理及应用 —— 第 3章 指令系统 44
3.4.1 数据传送指令
② MOV reg,data ;立即数送寄存器
③ MOV mem,data ;立即数送存储单元
④ MOV acc,mem ;存储单元送累加器
⑤ MOV mem,acc ;累加器送存储单元
⑥ MOV segreg,mem/reg ;存储单元 /寄存器送段寄存器
⑦ MOV mem/reg,segreg ;段寄存器送存储单元 /寄存器微机原理及应用 —— 第 3章 指令系统 45
3.4.1 数据传送指令
MOV指令使用规则:
IP不能作目的寄存器
不允许 mem←mem
不允许 segreg←segreg
立即数不允许作为目的操作数
不允许 segreg← 立即数
源操作数与目的操作数类型要一致微机原理及应用 —— 第 3章 指令系统 46
3.4.1 数据传送指令
几个不能传送的解决办法:用 AX作桥梁
存储器 ← 存储器:
MOV AX,MEM1
MOV MEM2,AX
段寄存器 ← 段寄存器:
MOV AX,DS
MOV ES,AX
段寄存器 ← 立即数:
MOV AX,DATA
MOV DS,AX
微机原理及应用 —— 第 3章 指令系统 47
3.4.1 数据传送指令
2,堆栈操作指令什么是堆栈?
按,后进先出 (LIFO)”方式工作的存储区域 。 堆栈 以字为单位 进行压入弹出操作 。
为什么要设置堆栈?
为什么要按,后进先出,方式工作?
参见下图微机原理及应用 —— 第 3章 指令系统 48
主程序
IP
继续执行主程序执行子程序主程序
IP
IP(下 )
继续执行主程序
IP’
执行子程序
2
IP’(下 )
执行子程序 1
继续执行子程序
1
(a) (b)
子程序调用示意图
(a) 主程序调子程序; (b) 子程序嵌套示意图
IP(下 )
微机原理及应用 —— 第 3章 指令系统 49
3.4.1 数据传送指令
规定由 SS指示堆栈段的段基址,堆栈指针 SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。
SP
SS
堆栈段进栈方向退栈方向 栈底栈顶微机原理及应用 —— 第 3章 指令系统 50
2.1压栈指令
PUSH src ; src为 16位操作数例,PUSH AX ;将 AX内容压栈执行操作:( SP) -1← 高字节 AH
( SP) -2← 低字节 AL
(SP) ← ( SP) - 2
3.4.1 数据传送指令微机原理及应用 —— 第 3章 指令系统 51
设( AX) =1020H,执行示意图如图低地址 存储区
( SS段)
执行前
(AX)=1020
(SP)
存储区
( SS段)
进栈方向执行后
20
10
(AL)
(AH)
2-8
PUSH AX指令执行示意图
(SP)-2
(SP)
高地址低地址高地址
(SP)-1
3.4.1 数据传送指令微机原理及应用 —— 第 3章 指令系统 52
3.4.1 数据传送指令压栈指令的格式为:
PUSH reg
PUSH mem/reg
PUSH segreg
例如:
PUSH AX
PUSH [BX]
PUSH DS
注意进栈方向是 高地址 向 低地址 发展。
微机原理及应用 —— 第 3章 指令系统 53
3.4.1 数据传送指令
2.2 弹出指令
POP dest
例,POP BX ;将栈顶内容弹至 BX
执行操作,( BL) ← ( SP)
( BH) ← ( SP) +1
( SP) ← ( SP) +2
微机原理及应用 —— 第 3章 指令系统 54
3.4.1 数据传送指令低地址存储区
( SS段)
出栈方向执行前
20
10
(SP)
存储区
( SS段)
执行后
(BX)=1020
(SP)
BX
2010
高地址低地址高地址
POP BX指令执行示意图微机原理及应用 —— 第 3章 指令系统 55
3.4.1 数据传送指令堆栈指令使用时应注意几点:
① 堆栈操作总是按 字 进行
② 不能从栈顶弹出一个字给 CS
③ 堆栈指针为 SS:SP,SP永远指向栈顶
④ SP自动进行增减量 ( -2,+2)
微机原理及应用 —— 第 3章 指令系统 56
3.4.1 数据传送指令
3、交换指令 XCHG
格式,XCHG reg,mem/reg
功能:交换两操作数的内容 。
要求:两操作数中必须有一个在寄存器中;
操作数不能为段寄存器和立即数;
源和目地操作数类型要一致 。
举例,XCHG AX,BX
XCHG [2000],CL
微机原理及应用 —— 第 3章 指令系统 57
3.4.1 数据传送指令
4,查表指令 XLAT
执行的操作,AL←[(BX)+(AL)]
又叫 查表转换指令,它可根据表项序号查出表中对应代码的内容 。 执行时先将表的首地址
( 偏移地址 ) 送到 BX中,表项序号存于 AL中 。
例如:内存数据段有一张 16进制数的 ASCII码表,设首地址为 2000H,如欲查出表中第 11个代码 ( 代码序号从 0开始 ) 即十六进制数 B的
ASCII 码 。 ASCII 表在 DS 段中,并假设
(DS)=4000H。 见下页图 。
微机原理及应用 —— 第 3章 指令系统 58
3.4.1 数据传送指令
30
31
32
...
39
41
42
...
45
46
...
42000H+0
42000H+0BH
‘ 0’
‘ 1’
‘ 2’
‘ 9’
‘ A’
‘ B’
‘ E’
‘ F’
十六进制数 ASCII码表存储器微机原理及应用 —— 第 3章 指令系统 59
3.4.1 数据传送指令则可用如下几条指令实现,
MOV BX,2000H ;( BX) ← 表首地址
MOV AL,0BH ;( AL) ← 序号
XALT ; 查表转换执行后得到:( AL) = 42H = ’ B’
注意:转换表长度最大为 256个表项 (字节 )。
微机原理及应用 —— 第 3章 指令系统 60
3.4.1 数据传送指令
5、字节 -字转换指令格式,CBW ;把 AL的符号位复制到 AH
CWD ;把 AX的符号位复制到 DX
用途:用于有符号数的除法。
例,(AL) = A7H,则执行 CBW后,AH的内容为 FFH。
微机原理及应用 —— 第 3章 指令系统 61
3.4.1 数据传送指令
6、输入输出( I/O)指令只限于用 累加器 AL或 AX来传送信息。
功能,(累加器 )←→I/O 端口
6.1 输入指令 IN
格式,
IN acc,PORT ;PORT端口号 0~ 255
IN acc,DX ;DX表示的端口范围达 64K
例,IN AL,80H ;(AL) ← (80H端口 )
IN AL,DX ;(AL) ← ((DX))
微机原理及应用 —— 第 3章 指令系统 62
3.4.1 数据传送指令
6.2 输出指令 OUT
格式,OUT port,acc
OUT DX,acc
例,OUT 68H,AX ;(69H,68H) ← ( AX)
OUT DX,AL ;((DX))←(AL)
在使用间接寻址的 IN/OUT指令时,要事先用传送指令把 I/O端口号设置到 DX寄存器,如:
MOV DX,220H
IN AL,DX ;将 220H端口内容读入 AL
微机原理及应用 —— 第 3章 指令系统 63
3.4.1 数据传送指令
7,地址传送指令共有三条,
格式,LEA reg,mem ; 将指定存储器的 16位偏移地址送指定寄存器
LDS reg,mem32; DS:reg←(mem 开始的四个内存单元 )
LES reg,mem32; 同上,但 DS改为 ES
要求 源操作数 必须是一个 内存操作数,目的操作数必须是一个 16位的通用寄存器 。
微机原理及应用 —— 第 3章 指令系统 64
3.4.1 数据传送指令例,LEA BX,[SI+10H]
设,( SI) =1000H
则执行该指令后,( BX) =1010H
注意以下两条指令差别:
LEA BX,BUFFER
MOV BX,BUFFER
前者表示将符号地址为 BUFFER的存储单元的偏侈地址取到 BX中 ;后者表示将 BUFFER存储单元中的内容取 到 BX中,
微机原理及应用 —— 第 3章 指令系统 65
3.4.1 数据传送指令下面两条指令等效:
LEA BX,BUFFER
MOV BX,OFFSET BUFFER
其中 OFFSET BUFFER表示存储器单元
BUFFER的偏移地址。
二者都可用于取存储器单元的偏移地址,但 LEA
指令可以取动态的地址,OFFSET只能取静态的地址。
微机原理及应用 —— 第 3章 指令系统 66
3.4.1 数据传送指令
8、标志传送指令共有四条:
8.1 读标志指令 LAHF
LAHF把标志寄存器低 8位中的 5个标志位传送到 AH中的指定位,如下图所示,
1D3D5D7D 6D 4D 2D 0D
OF DF IF TF SF ZF AF PF CF
AH
FLAG
微机原理及应用 —— 第 3章 指令系统 67
3.4.1 数据传送指令
8.2 设置标志指令 SAHF
SAHF的功能与 LAHF的功能正好相反,用图来示意,只要将上图中 5个箭头方向反一下即可。
1D3D5D7D 6D 4D 2D 0D
OF DF IF TF SF ZF AF PF CF
AH
FLAG
微机原理及应用 —— 第 3章 指令系统 68
3.4.1 数据传送指令
9、标志寄存器出入栈
9.1 把标志寄存器推入栈顶指令 PUSHF
执行的操作,(SP)-1← 标志寄存器高 8位
(SP)-2← 标志寄存器低 8位
(SP)←(SP) -2
9.2 从栈顶弹出标志寄存器指令 POPF
执行的操作,标志寄存器低 8位 ← (SP)
标志寄存器高 8位 ← (SP)+1
(SP)←(SP)+ 2
PUSHF和 POPF指令用于保护和恢复标志寄存器内容 。
微机原理及应用 —— 第 3章 指令系统 69
3.4.1 数据传送指令例如:
PUSH AX
PUSH CX
PUSHF ;保护标志寄存器内容;这段程序要用到 AX,CX以及标志位
POPF ;恢复标志寄存器内容
POP CX
POP AX
微机原理及应用 —— 第 3章 指令系统 70
3.4.1 数据传送指令数据传送指令中,除 SAHF和 POPF这两条指令外,
其余所有指令均不影响标志位。
微机原理及应用 —— 第 3章 指令系统 71
3.4.2 算术运算指令涉及 两种类型数据,无符号数和有符号数。对加减法指令,无符号和有符号数可采用同一套指令,但应注意:
参加的操作数必须都是无符号数或都是有符号数。
需使用不同的标志位来检查无符号数和有符号数的运算结果是否溢出。
微机原理及应用 —— 第 3章 指令系统 72
3.4.2 算术运算指令两个 8位数相加时有 4种情况:
①无符号数和有符号数均不溢出二进制相加 无符号数加 有符号数加
0000 1000 8 +8
+0001 1110 + 30 + (+30)
0010 0110 38 +38
结果 38 CF=0 OF=0
微机原理及应用 —— 第 3章 指令系统 73
3.4.2 算术运算指令
② 无符号数溢出
0000 1000 8 +8
+1111 1101 +253 +(-3)
10000 0101 261 +5
结果 5 CF=1 OF=0
③ 有符号数溢出
0000 1000 8 +8
+0111 1101 +125 +( +125)
1000 0101 133 +133
结果 -123 CF=0 OF=1
( 补码表示 )
微机原理及应用 —— 第 3章 指令系统 74
3.4.2 算术运算指令
④ 无符号数和有符号数均溢出
1000 1000 136 -120
+1111 0111 +247 +( -9)
10111 1111 383 -129
结果 127 CF=1 OF=1
上面四种情况说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出 。
有符号数的溢出是一种 出错状态,在运算过程中应当避免 。
微机原理及应用 —— 第 3章 指令系统 75
3.4.2 算术运算指令
1.加法指令共有 5条,
1.1 不带进位的加法指令 ADD
格式,ADD acc,data
ADD mem/reg,data
ADD mem/reg1,mem/reg2
例,ADD AL,30H
ADD AX,[BX+20H]
ADD CX,SI
ADD [DI],200H
ADD指令对标志位 ( 指状态标志 ) 都有影响 。
微机原理及应用 —— 第 3章 指令系统 76
3.4.2 算术运算指令
1.2带进位位的加法指令 ADC
ADC指令在形式上和功能上都有与 ADD类似,
只是相加时还要包括进位标志 CF的内容,例如:
ADC AL,68H ;AL←(AL)+68H+(CF)
ADC AX,CX ;AX←(AX)+(CX)+(CF)
ADC BX,[DI] ;BX←(BX)+[DI+ 1][DI]
+(CF)
微机原理及应用 —— 第 3章 指令系统 77
3.4.2 算术运算指令
ADC指令主要用于多字节加法运算中例,有两个 4字节的无符号数相加:
2C56F8AC+309E47BE=?
设被加数、加数分别存放在 BUFFER1及
BUFFER2开始的两个存储区内,结果放回
BUFFER1存储区,如下页图所示。
因 CPU只能进行 8位或 16位的加法运算,为此可将加法分 4次进行 。
微机原理及应用 —— 第 3章 指令系统 78
3.4.2 算术运算指令
56H
2CH
BEH
47H
BUFFER1
BUFFER2
ACH
F8H
9EH
30H
被加数加数数据段多字节加法示意图...
微机原理及应用 —— 第 3章 指令系统 79
3.4.2 算术运算指令
1.3 加 1指令 INC( 单操作数指令 )
格式,INC reg/mem
功能:类似于 C语言中的 ++操作:对指定的操作数加 1
例,INC AL
INC SI
INC BYTE PTR[BX+4]
注:本指令不影响 CF标志。
微机原理及应用 —— 第 3章 指令系统 80
3.4.2 算术运算指令
ADD/ADC对 条件标志位 (CF/OF/ZF/SF)的影响:
CF位表示无符号数相加的溢出。
OF位表示带符号数相加的溢出。
1 结果为负
0 否则SF=
1 结果为 0
0 否则ZF=
1 和的最高有效位有向高位的进位
0 否则CF=
1 两个操作数符号相同,而结果符号与之相反
0 否则OF=
微机原理及应用 —— 第 3章 指令系统 81
3.4.2 算术运算指令
2,减法指令
2.1 不考虑借位的减法指令 SUB
格式,SUB dest,src
操作,dest←(dest) -(src)
注,1.源和目的操作数不能同时为存储器操作数
2.立即数不能作为目的操作数指令例子:
SUB AL,60H
SUB [BX+20H],DX
SUB AX,CX
微机原理及应用 —— 第 3章 指令系统 82
3.4.2 算术运算指令
2.2 考虑借位的减法指令 SBB
SBB指令主要用于多字节的减法 。
格式,SBB dest,src
操作,dest←(dest) -(src)-(CF)
指令例子:
SBB AX,CX
SBB WORD PTR[SI],2080H
SBB [SI],DX
微机原理及应用 —— 第 3章 指令系统 83
3.4.2 算术运算指令例,x,y,z均为 32位数,分别存放在地址为 X,X+2;
Y,Y+2 ; Z,Z+2 的 存 储 单 元 中,用 指 令 序 列 实 现
w?x+y+24-z,结果放在 W,W+2单元中 。
MOV AX,X
MOV DX,X+2
ADD AX,Y
ADC DX,Y+2 ; x+y
ADD AX,24
ADC DX,0 ; x+y+24
SUB AX,Z
SBB DX,Z+2 ; x+y+24-z
MOV W,AX
MOV W+2,DX ; 结果存入 W,W+2单元微机原理及应用 —— 第 3章 指令系统 84
3.4.2 算术运算指令
2.3 减 1指令 DEC
作用类似于 C语言中的,--,操作符。
格式,DEC opr
操作,opr←(opr) -1
对标志 CF无影响指令例子:
DEC CL
DEC BYTE PTR[DI+2]
DEC SI
微机原理及应用 —— 第 3章 指令系统 85
3.4.2 算术运算指令
2.4 求补指令 NEG
格式,NEG opr
操作,opr← 0 -(opr)
对一个操作数取补码相当于用 0减去此操作数,
故利用 NEG指令可得到负数的绝对值。
例:若 (AL)=0FCH,则执行 NEG AL 后,
(AL)=04H,CF=1
本例中,0FCH为 -4的补码,执行求补指令后,即得到 4(-4的绝对值 )。
微机原理及应用 —— 第 3章 指令系统 86
SUB/SBB对标志位 (CF/OF/ZF/SF)的影响
CF=1表示无符号数减法溢出。
OF=1表示带符号数减法溢出。
NEG指令对 CF/OF的影响:
CF,操作数为 0时,求补的结果使 CF=0,否则 CF=1。
OF,字节运算对 -128求补或字运算对 -32768求补时 OF=1,
否则 OF=0。
1 被减数的最高有效位有向高位的借位
0 否则CF=
1 两个操作数符号相反,而结果的符号与减数相同
0 否则OF=
微机原理及应用 —— 第 3章 指令系统 87
3.4.2 算术运算指令
3,比较指令 CMP
格式,CMP dest,src
操作,(dest)-(src)
CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。
指令例子:
CMP AL,0AH
CMP CX,SI
CMP DI,[BX+03]
微机原理及应用 —— 第 3章 指令系统 88
根据标志位来判断比较的结果
1)根据 ZF判断两个数是否相等。若 ZF=1,则两数相等。
2)若两个数不相等,则分两种情况考虑,
①比较的是两个无符号数若 CF=0,则 dest> src;
若 CF=1,则 dest< src。
②比较的是两个有符号数若 OF⊕ SF=0,则 dest> src;
若 OF⊕ SF=1,则 dest< src。
微机原理及应用 —— 第 3章 指令系统 89
3.4.2 算术运算指令
4.乘法指令
进行乘法时,8位 *8位 →16 位乘积
16位 *16位 →32 位乘积
4.1 无符号数的乘法指令 MUL(MEM/REG)
格式,MUL src
操作:字节操作数 (AX)? (AL) 3 (src)
字操作数 (DX,AX)? (AX) 3 (src)
指令例子:
MUL BL ; (AL)3(BL),乘积在 AX中
MUL CX ; (AX)3(CX),乘积在 DX,AX中
MUL BYTE PTR[BX]
微机原理及应用 —— 第 3章 指令系统 90
3.4.2 算术运算指令格式与 MUL指令类似,只是要求两操作数均为 有符号数 。
指令例子:
IMUL BL ; (AX)←(AL) 3(BL)
IMUL WORD PTR[SI]; (DX,AX)←(AX) 3([SI+1][SI])
4.2 有符号数乘法指令 IMUL
注意,MUL/IMUL指令中
● AL(AX)为隐含的乘数寄存器;
● AX(DX,AX)为隐含的乘积寄存器;
● SRC不能为立即数;
● 除 CF和 OF外,对 其它 标志位无定义 。
微机原理及应用 —— 第 3章 指令系统 91
乘法指令对 CF/OF的影响
00 乘积的高一半为零
11 否则MUL指令,CF/OF =
00 乘积的高一半是低一半的符号扩展
11 否则IMUL指令,CF/OF =
例,(AL) = A5H(-5B),(BL) = 11H
(1) IMUL BL ; (AX)? (AL)3(BL); A5311? -5B311=-060B?F9F5; (AX) = F9F5H CF=OF=1
(2) MUL BL ; (AX)? (AL)3(BL); A5311= 0AF5; (AX) = 0AF5H CF=OF=1
微机原理及应用 —— 第 3章 指令系统 92
3.4.2 算术运算指令
5.除法指令进行除法时,16位 /8位 → 8位商
32位 /16位 → 16位商对被除数、商及余数存放有如下规定:
被除数 商 余数字节除法 AX AL AH
字除法 DX:AX AX DX
微机原理及应用 —— 第 3章 指令系统 93
3.4.2 算术运算指令格式,DIV src
操作:字节操作 (AL)? (AX) / (SRC) 的商
(AH)? (AX) / (SRC) 的余数字操作 (AX)? (DX,AX) / (SRC) 的商
(DX)? (DX,AX) / (SRC) 的余数指令例子:
DIV CL
DIV WORD PTR[BX]
注:若除数为零或 AL中商大于 FFH(或 AX中商大于
FFFFH),则 CPU产生一个类型 0的内部中断。
5.1 无符号数除法指令 DIV
微机原理及应用 —— 第 3章 指令系统 94
3.4.2 算术运算指令
5.2有符号数除法指令 IDIV
格式,IDIV src
操作与 DIV类似 。 商及余数均为有符号数,且余数符号总是与被除数符号相同 。
注意,对于 DIV/IDIV指令
AX(DX,AX)为隐含的被除数寄存器。
AL(AX)为隐含的商寄存器。
AH(DX)为隐含的余数寄存器。
src不能为立即数。
对所有条件标志位均无定义。
微机原理及应用 —— 第 3章 指令系统 95
3.4.2 算术运算指令
除法运算要求被除数字长是除数字长的两倍,若不满足则需 对被除数进行扩展,否则产生错误。
对于无符号数除法扩展,只需将 AH或 DX清零即可。
对有符号数而言,则是符号位的扩展。可使用前面介绍过的符号扩展指令 CBW和 CWD
关于除法操作中的字长扩展问题微机原理及应用 —— 第 3章 指令系统 96
3.4.2 算术运算指令例,写出 34H÷25H的程序段。
MOV AL,34H
MOV BL,25H
CBW ; AL的符号扩展到 AH
IDIV BL ; 0034H÷25H,结果为; (AH)=0FH,
(AL)=01H
微机原理及应用 —— 第 3章 指令系统 97
3.4.2 算术运算指令
6.BCD码运算的十进制调整指令专用于对 BCD码运算的结果进行调整
包括,AAA,DAA,AAS,DAS,AAM,AAD
均为隐含寻址,隐含的操作数为 AL和 AH
为何要对 BCD码的运算结果进行调整?
BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算机是按二进制(十六进制)进行运算,并未按十进制规则进行运算。
微机原理及应用 —— 第 3章 指令系统 98
3.4.2 算术运算指令
6.1 加法的十进制调整指令
(1)非压缩 BCD码加法调整 AAA
本指令对在 AL中的由两个未组合的 BCD码相加后的结果进行调正,得到一个正确的未组合的 BCD码。
AAA指令只影响 AF和 CF,其余标志无定义。
AAA指令应紧跟在 ADD或 ADC指令之后。
微机原理及应用 —— 第 3章 指令系统 99
3.4.2 算术运算指令如果 AL的低 4位> 9∨ AF=1,则:
① AL←(AL)+6,(AH)←(AH)+1,AF←1
② AL←((AL)∧0FH)
③ CF←AF
否则 AL←(AL)∧0FH
∧,与运算,∨,或运算
AAA指令的操作如下:
微机原理及应用 —— 第 3章 指令系统 100
3.4.2 算术运算指令
调整原理:先看一个例子
计算 8+ 9 0000 1000
见右式 +0000 1001
0001 0001 = 11
结果应为 17,而计算机相加为 11,原因在于运算过程中,如遇到低 4位往高 4位产生进位时(此时 AF=1) 是按逢十六进一的规则,但 BCD码要求逢十进一,因此只要产生进位,个位就会少 6,这就要进行加 6调正。
这个 1代表了 16,而实际上仅应为 10,即多进了 6。
微机原理及应用 —— 第 3章 指令系统 101
3.4.2 算术运算指令
6.2 压缩 BCD码加法调整 DAA
两个压缩 BCD码相加结果在 AL中,通过 DAA调整得到一个正确的压缩 BCD码,
指令操作 (调整方法 ):
若 AL的低 4位> 9∨ AF=1
则 (AL)←(AL)+6,AF←1
若 AL的高 4位> 9∨ CF=1
则 (AL)←(AL)+60H,CF←1
除 OF外,DAA指令影响所有其它标志。
DAA指令应紧跟在 ADD或 ADC指令之后 。
微机原理及应用 —— 第 3章 指令系统 102
3.4.2 算术运算指令
例,0100 1000 48H
MOV AL,48H + 0111 0100 74H
MOV BL,74H 1011 1100 BCH
ADD AL,BL + 0110 0110 66H
DAA 1 0010 0010 1 22H
(进位 ) (进位 )
执行 ADD后,(AL)=BCH,高 4位低 4位均大于 9,
故 DAA指令执行加 66H调整,最后结果为:
(AL)=22H,CF=1,AF=1
微机原理及应用 —— 第 3章 指令系统 103
3.4.2 算术运算指令
7.1 非压缩 BCD码减法的十进制调正指令 AAS
对 AL中由两个非压缩的 BCD码相减的结果进行调整。调整操作为:
若 AL的低 4位> 9或 AF=1,则:
① AL←(AL) -6,AH←(AH) -1,AF←1
② AL←(AL)∧0FH
③ CF←AF
否则,AL←(AL)∧ 0FH
7.减法的十进制调整指令微机原理及应用 —— 第 3章 指令系统 104
3.4.2 算术运算指令
举例,16-8=?
MOV AX,0106H 0000 0110 06
MOV BL,08H - 0000 1000 - 08
SUB AL,BL 1111 1110 FE
AAS - 0000 0110 - 06
1111 1000 F8
∧ 0000 1111 ∧ 0F
0000 1000 08
结果为,(AL)=08H,(AH)=0,CF=AF=1
微机原理及应用 —— 第 3章 指令系统 105
3.4.2 算术运算指令
7.2 压缩 BCD码减法的十进制调正指令 DAS
对 AL中由两个压缩 BCD码相减的结果进行调整。调整操作为:
若 AL的低 4位> 9∨AF=1,则:
AL←(AL) -6,且 AF←1
若 AL的高 4位> 9∨CF=1,则:
AL←(AL) -60H,且 CF←1
DAS对 OF无定义,但影响其余标志位。
DAS指令要求跟在减法指令之后。
微机原理及应用 —— 第 3章 指令系统 106
3.4.2 算术运算指令
8,乘法的十进制调正指令 AAM
对 AX中由两个非压缩 BCD码相乘的结果进行调整。
调整操作为:
(AL)/0AH,(AH)← 商,(AL)← 余数
隐含的操作寄存器为 AL和 AH;
AAM跟在 MUL指令之后使用;
影响标志位 PF,SF,ZF,其它 无定义 ;
用 AAM可实现?99 的二 -十进制转换。
微机原理及应用 —— 第 3章 指令系统 107
3.4.2 算术运算指令例 1:按十进制乘法计算 738=?
程序段如下:
MOVAL,07H ; (AL)=07H
MOVCL,08H ; (CL)=08H
MULCL ; (AX)=0038H
AAM ; (AH)=05H,(AL)=06H
所得结果为非压缩的 BCD码。
例 2:把 3AH转换成等值的十进制数。
MOV AL,3AH ; 58
AAM ; (AH)=05H,(AL)=08H
微机原理及应用 —— 第 3章 指令系统 108
3.4.2 算术运算指令
9,除法的十进制调正指令 AAD
对非压缩 BCD除法运算进行调整。调整操作为:
(AL)← (AH)30AH+ (AL)
AH ← 0
隐含的操作寄存器为 AH,AL;
AAD要在 DIV指令 之前 使用;
影响标志位 PF,SF,ZF,其它 无定义 ;
用 AAD可实现?99 的十 -二进制转换。
微机原理及应用 —— 第 3章 指令系统 109
3.4.2 算术运算指令例 1:按十进制除法计算 55÷7=?
程序段如下:
MOV AX,0505H ; (AX)=55BCD
MOV CL,07H ; (CL)= 7
AAD ; (AX)=0037H
DIVCL ; (AH)=6,(AL)=7
所得结果为非压缩的 BCD码(商 7余 6)。
例 2:把 73转换成等值的二进制数。
MOV AX,0703H ; (AX)= 73BCD
AAD ; (AX)= 0049H
微机原理及应用 —— 第 3章 指令系统 110
3.5 逻辑运算和移位指令
逻辑运算指令
运算规则:按位操作,无进 /借位
对标志位的影响 (除 NOT指令外 ):
CF OF SF ZF PF AF
0 0 * * * 无定义根据运算结果设置微机原理及应用 —— 第 3章 指令系统 111
3.5 逻辑运算和移位指令
1,逻辑,与,AND
对两个操作数进行按位逻辑“与”操作。
格式,AND dest,src
用途:保留操作数的某几位,清零其他位。
例 1:保留 AL中低 4位,高 4位清 0。
AND AL,0FH
例 2,AL中有字符 ’a’~’ z’,将其转换成大写。
AND AL,01011111B
微机原理及应用 —— 第 3章 指令系统 112
3.5 逻辑运算和移位指令例 3:测试 AL的 bit7,bit5,bit2是否都是 1。
AND AL,10100100B
CMP AL,10100100B
JZ YES ; if match,go to YES
… … ; if not match
… …
YES,… … ; goes here if all ‘1’
微机原理及应用 —— 第 3章 指令系统 113
3.5 逻辑运算和移位指令
2,OR指令
OR AL,0FH; ALV0F?AL
OR AX,0FF00H; AXVFF00H?AX
例 1:把 AL的第 5位置为 1
OR AL,00100000B
微机原理及应用 —— 第 3章 指令系统 114
3.5 逻辑运算和移位指令对操作数进行按位逻辑,非,操作。
格式,NOT mem/reg
例,NOT CX
NOT BYTE PTR[DI]
3,逻辑,非,(取反 ) NOT
微机原理及应用 —— 第 3章 指令系统 115
3.5 逻辑运算和移位指令对两个操作数按位进行,异或,操作。
格式,XOR dest,src
用途:对 reg清零 (自身异或 )
把 reg/mem的某几位变反 (与 ’1’异或 )
例 1:把 AX寄存器清零。 例 2:把 DH的 bit4,3变反
① MOV AX,0 XOR DH,18H
② XOR AX,AX
③ AND AX,0
④ SUB AX,AX
4,逻辑,异或,XOR
微机原理及应用 —— 第 3章 指令系统 116
3.5 逻辑运算和移位指令操作与 AND指令类似,但不将,与,的结果送回,
只影响标志位。
TEST指令常用于位测试,与条件转移指令一起用。
例:测试 AL的内容是否为负数。
TEST AL,80H ; 检查 AL中 D7=1?
JNZ MINUS ; 是 1(负数 ),转 MINUS
… … ; 否则 (正数 )不转移
MINUS,… …
… …
5,测试指令 TEST
微机原理及应用 —— 第 3章 指令系统 117
3.5 逻辑运算和移位指令
6.移位指令
(1)非循环移位指令算术左移指令 SAL(Shift Arithmetic Left)
算术右移指令 SAR(Shift Arithmetic Right)
逻辑左移指令 SHL(Shift Left)
逻辑右移指令 SHR(Shift Right)
这 4条指令的格式相同,以 SAL为例:
SAL mem/reg,CL ;移位位数大于 1时1 ;移位位数等于 1时微机原理及应用 —— 第 3章 指令系统 118
3.5 逻辑运算和移位指令移位指令执行的操作如下图所示:
最低位最高位
CF 0
(a)算术 /逻辑左移 SAL/SHL
最低位最高位
CF
(b)算术右移 SAR
最低位最高位
CF
(c)逻辑右移 SHR
0
非循环移位指令功能示意图微机原理及应用 —— 第 3章 指令系统 119
3.5 逻辑运算和移位指令
算术移位 —— 把操作数看做有符号数;
逻辑移位 —— 把操作数看做无符号数。
移位位数放在 CL寄存器中,如果只移 1位,也可以直接写在指令中。例如:
MOV CL,4
SHR AL,CL ; AL中的内容右移 4位
影响 C,P,S,Z,O标志 。
结果未溢出时:
左移 1位 ≡ 操作数 *2
右移 1位 ≡ 操作数 /2
微机原理及应用 —— 第 3章 指令系统 120
3.5 逻辑运算和移位指令例:把 AL中的数 x乘 10
因为 10=8+2=23+21,所以可用移位实现乘 10操作。程序如下:
SAL AL,1 ; 2x
MOV AH,AL
SAL AL,1 ; 4x
SAL AL,1 ; 8x
ADD AL,AH ; 8x+2x = 10x
微机原理及应用 —— 第 3章 指令系统 121
3.5 逻辑运算和移位指令不含进位位的循环左移指令 ROL
不含进位位的循环右移指令 ROR
含进位位的循环左移指令 RCL
含进位位的循环右移指令 RCR
格式同非循环移位指令。
移位位数放在 CL寄存器中,如果只移 1位,
也可以直接写在指令中。
循环移位指令只影响标志位 CF和 OF。
(2)循环移位指令微机原理及应用 —— 第 3章 指令系统 122
3.5 逻辑运算和移位指令这 4条指令的功能如下图示:
最低位最高位
CF
(a) ROL
最低位最高位
CF
(c) RCL
最低位最高位
CF
(b) ROR
最低位最高位
CF
(d) RCR
循环移位指令功能示意图微机原理及应用 —— 第 3章 指令系统 123
3.5 逻辑运算和移位指令用移位操作代替乘除法可提高运算速度例:前例中计算 x310。
(1)采用乘法指令,
MOV BL,10
MUL BL
共需 70~ 77个 T周期。
(2)采用移位和加法指令,
SAL AL,1 ; 2T
MOV AH,AL ; 2T
SAL AL,1 ; 2T
SAL AL,1 ; 2T
ADD AL,AH ; 3T
只需 11个 T周期,仅相当于乘法的 1/7。
微机原理及应用 —— 第 3章 指令系统 124
3.5 逻辑运算和移位指令循环移位举例:
例 1:将 AL的高 4位与低 4位互换。
MOV CL,4
ROL AL,CL
例 2:将 1A00H内存单元中的双字循环左移 1位。
CMP [1A00H],8000H
CMC; 进位标志取反
RCL WORD PTR[1A02H],1
RCL WORD PTR[1A00H],1
微机原理及应用 —— 第 3章 指令系统 125
3.6 串操作指令
串:顺序放在内存中的一组相同类型的数据。
串操作,对串中的元素进行相同的操作。
串操作的寻址方式:
源操作数指针 ——— DS:SI
目的操作数指针 —— ES:DI
每次串操作后,
串操作指令自动修改 SI和 DI—— 字节 ±1,字 ±2。 DF
标志决定 ±。 (注意:退出串操作后,指针指向最后操作的元素的下一个元素 )
可完成两个存储单元之间的传送和比较操作(也仅是串指令可以)
微机原理及应用 —— 第 3章 指令系统 126
3.6 串操作指令
重复前缀
串操作指令前面可加上 重复前缀 REP。 当使用
REP前缀时,该指令重复执行,重复执行次数由
CX决定(带有 REP前缀的 串操作指令每执行一次,
CX自动减 1)。
重复前缀 包括:
REP CX≠0 时重复执行
REPE/REPZ CX≠0∧ ZF=1时重复执行
REPNE/REPNZ CX≠0∧ ZF=0时重复执行微机原理及应用 —— 第 3章 指令系统 127
串指令使用的一般方法设置源串地址设置目标串地址设置串长度设置操作方向 DF
串指令
MOV SI,源串首地址
(或 LEA SI,源串)
MOV DI,目的串首地址
(或 LEA DI,目的串)
MOV CX,串长度
CLD(或 STD)
,串指令,
微机原理及应用 —— 第 3章 指令系统 128
3.6 串操作指令指令执行的操作为:
MOVSB,((ES):(DI))←((DS):(SI))
SI±1,DI±1
MOVSW,((ES):(DI+1)(DI))←((DS):(SI+1)(SI))
SI±2,DI±2
指令也可写成,MOVS dest,src
但要求:
① src用 DS:SI寻址,dest用 ES:DI寻址
② 传送是字节还是字,由操作数的类型决定
⒈ 串传送指令 MOVSB / MOVSW
微机原理及应用 —— 第 3章 指令系统 129
3.6 串操作指令串传送指令使用举例
用串传送指令实现 200个字节的数据传送:
LEA SI,MEM1
LEA DI,MEM2
MOV CX,200
CLD
REP MOVSB
HLT
微机原理及应用 —— 第 3章 指令系统 130
3.6 串操作指令
⒉ 串比较指令 CMPSB / CMPSW
指令执行的操作为:
CMPSB,((DS):(SI))-((ES):(DI))
SI±1,DI±1
CMPSW,((DS):(SI+1)(SI))-((ES):(DI+1)(DI))
SI±2,DI±2
指令也可写成,CMPS dest,src
比较的结果只反映在标志位上,串本身无变化。
本指令可用来检查两个串是否相等。
微机原理及应用 —— 第 3章 指令系统 131
3.6 串操作指令
⒊ 串扫描 SCASB / SCASW
执行的操作:
对字节,(AL)- ((ES):(DI))
DI±1
对字,(AX)- ((ES):(DI+ 1)(DI))
DI±2
搜索指令执行的仍是比较 (减法 )操作,结果只影响标志位。
要搜索的关键字放在 AL(字节 )或 AX(字 )中。
本指令用于在串中查找指定的信息。
微机原理及应用 —— 第 3章 指令系统 132
3.6 串操作指令
SCAS指令加上重复前缀后,可对串 进行连续扫描比较:
若前缀为 REPZ,则表示 比较结果相等且
(ZF=1)且串未结束 (CX≠0),则继续比较。
若前缀为 REPNZ,则表示比较结果不相等
(ZF=0)且串未结束 (CX≠0) 就继续比较。
微机原理及应用 —— 第 3章 指令系统 133
3.6 串操作指令例:在 ES段的偏移 1000H开始处存有 10个
ASCII码。搜索’ E’,若找到则记下搜索次数及存放地址,并在屏幕上显示’ Y’;若未找到则显示’ N’。 (见右图 )
在屏幕上显示一个字符的指令段如下,(参见附录 C.3)
MOV DL,<字符 >
MOV AH,2
INT 21H
实现题目要求的程序段见下页:
1000H 41
42
43
44
45
46

A’’ B’
’ C’

D’

F’.,
.
ES段
’ E’
微机原理及应用 —— 第 3章 指令系统 134
3.6 串操作指令
MOV DI,1000H ; (DI)← 串偏移地址
MOV CX,0AH ; (CX)← 串长度
MOV AL,’E’ ; 搜索关键字 =’E’
CLD ; 从低地址到高地址进行搜索
REPNZ SCASB ; 若未找到,继续搜索
JZ FOUND ; 找到,转至 FOUND
MOV DL,’N’ ; 串中无’ E’,(DL)←’N’
JMP DONE ; 转至 DONE
FOUND:DEC DI ; 指针回退
MOV ADDR,DI ; ADDR←’E’ 的地址
SUB DI,1000H
MOV NUM,DI ; NUM← 搜索次数
MOV DL,’Y’ ; (DL)←’Y’
DONE,MOV AH,2
INT 21H ;显示字符
HLT
微机原理及应用 —— 第 3章 指令系统 135
3.6 串操作指令执行的操作为:
对字节,(AL)←((DS):(SI))
SI±1
对字,(AX)←((DS):(SI+1)(SI))
SI±2
串装入指令通常不加重复前缀。
LODSB等价于,LODSW等价于,
MOV AL,[SI] MOV AX,[SI]
INC SI INC SI
INC SI
⒋ 串装入指令 LODSB / LODSW
微机原理及应用 —— 第 3章 指令系统 136
3.6 串操作指令指令的操作为:
对字节,((ES):(DI))←(AL)
DI±1
对字,((ES):(DI+1)(DI))←(AX)
DI±2
本指令用于把一块存储区域填充成某一初始值 (即对存储区进行初始化 )。
存储区域的首地址要预先设置到 ES:DI中。
要存储到串中的数据要预先存到 AL(AX)中。
⒌ 串存储指令 STOSB / STOSW
微机原理及应用 —— 第 3章 指令系统 137
3.6 串操作指令例 1:把从 A000H开始的 2KB内存单元清零 。
程序段如下:
MOV DI,0A000H
MOV AX,0
MOV CX,1024
CLD
REP STOSW
微机原理及应用 —— 第 3章 指令系统 138
3.6 串操作指令例 2:把 1000H开始的 100个存储单元填入
ASCII码 2AH(*)。
程序段如下:
MOV DI,1000H ; 首地址
MOV AL,2AH ;‘ *’
MOV CX,100 ; 重复执行 100次
CLD ; 增量修改 DI
REP STOSB
微机原理及应用 —— 第 3章 指令系统 139
3.7 程序控制指令控制转移指令分为:
转移指令
循环控制指令
调用和返回指令
中断指令微机原理及应用 —— 第 3章 指令系统 140
3.7 程序控制指令
转移指令的实质:改变 IP(或 CS)的内容。
所有转移指令不会影响标志位。
分为 无条件转移 和 条件转移 两种。
1.转移指令微机原理及应用 —— 第 3章 指令系统 141
3.7 程序控制指令
(1) 无条件转移指令 - JMP
本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置 CS,IP的方法,JMP指令分成 4种情况 。
① 段内 直接转移,JMP disp
指令中给出的 8/16位的位移量 加到 IP。 CS保持不变。
② 段内 间接转移,JMP reg/mem
reg/mem中的 16位偏移地址 送 IP。 CS保持不变。
③ 段间 直接转移 JMP segment:offset
指令中给出的 16位的段和 16位的偏移地址 送到 CS和 IP。
④ 段间 间接转移 JMP mem32
mem32中 的 16位的段和 16位的偏移地址 送到 CS和 IP。
微机原理及应用 —— 第 3章 指令系统 142
3.7 程序控制指令转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个 相对于 IP的位移量,
位移量 转移范围 汇编语言中格式
8位 -128~ +127 JMP SHORT OPRD
16位 -32768~ +32767 JMP NEAR PTR OPRD
例,JMP 0120H ; 直接转向 0120H
JMP SHORT LP ; 转向 LP
JMP NEAR PTR BBB ; 转向 BBB
由于是段内转移,故转移后 CS内容保持不变
① 段内直接转移微机原理及应用 —— 第 3章 指令系统 143
3.7 程序控制指令
②段内间接转移转移的目标地址由寄存器或存储单元的内容给出。
例 1,JMP SI
若 (SI)=1200H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址 1200H处开始执行。
注意:目标地址以段内偏移的形式给出,而不是相对于 IP的位移量,
所以它是一个 16位的操作数。
微机原理及应用 —— 第 3章 指令系统 144
3.7 程序控制指令例 2,JMP [BX+DI]
设指令执行前,
(DS)=3000H,(BX)=1300H,
(DI)=1200H,(32500H)=2350H;
则指令执行后,(IP)=2350H
在汇编语言中,段内间接寻址通常写成:
JMP WORD PTR[BX+DI]
表示所取得的目标地址是一个字 。
微机原理及应用 —— 第 3章 指令系统 145
3.7 程序控制指令
③段间直接转移在指令中直接给出要转移到的目的段地址和偏移地址。
例,JMP 2000H:1000H
执行时,(IP)←1000H,(CS)←2000H
注:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符 FAR PTR。
例,JMP FAR PTR far_label
其中的 far_label为远类型的标号。
微机原理及应用 —— 第 3章 指令系统 146
3.7 程序控制指令转移的目的地址 (段和偏移 )在两个相邻的字存储单元中。例如:
JMP DWORD PTR[SI]
设指令执行前,(DS)=4000H,(SI)=1212H,
(41212H)=1000H,(41214H)=4A00H
则指令执行后,(IP)=1000H,(CS)=4A00H
于是转到 4B000H处开始执行指令。
例中的 DWORD PTR表示转移地址是一个双字。
④段间间接转移微机原理及应用 —— 第 3章 指令系统 147
3.7 程序控制指令
4000
1212+)
41212
DS
SI
00
10
00
4A
41212
41213
41214
41215
1000
4A00
IP
CS
段间间接转移操作示意图微机原理及应用 —— 第 3章 指令系统 148
3.7 程序控制指令
条件转移指令可实现程序的条件分支。
条件转移指令根据标志位的状态来决定是否进行分支转移。
格式:
JXX label ; xx为条件名称缩写
指令的转移范围为 -128~ +127字节。
主要的条件转移指令参见 p75。
(2)条件转移指令 - JXX
微机原理及应用 —— 第 3章 指令系统 149
3.7 程序控制指令
① 根据单个标志位设置的条件转移指令
JB/JC ; 低于,或 CF=1,则 转移
JNB/JNC/JAE ; 高于或等于,或 CF=0,则转移
JP/JPE ; 奇偶标志 PF=1(偶 ),则转移
JNP/JPO ; 奇偶标志 PF=0(奇 ),则转移
JZ/JE ; 结果为零 (ZF=1),则转移
JNZ/JNE ; 结果不为零 (ZF=0),则转移
JS ; SF=1,则转移
JNS ; SF=0,则转移
JO ; OF=1,则转移
JNO ; OF=0,则转移微机原理及应用 —— 第 3章 指令系统 150
3.7 程序控制指令这类指令主要用来判断两个数的大小。一般指令序列为:
CMP dist,src ;比较
Jxx label ;根据比较结果转移判断无符号数的大小
JA 高于则转移( dist> src)
转移条件为,CF=0∧ ZF=0
JNA/JBE 低于或等于则转移( dist?src )
转移条件为,CF=1∨ ZF=1
② 根据组合条件设置的条件转移指令微机原理及应用 —— 第 3章 指令系统 151
3.7 程序控制指令
JG ; 大于则转移 (dist> src)
转移条件为,(SF⊕ OF=0)∧ ZF=0
JGE ; 大于或等于则转移 (dist? src)
转移条件为,(SF⊕ OF=0)∨ ZF=1
JL ; 小于则转移 (dist< src)
转移条件为,(SF⊕ OF=1)∧ ZF=0
JLE ; 小于或等于则转移 (dist? src)
转移条件为,(SF⊕ OF=1)∨ ZF=1
判断有符号数的大小微机原理及应用 —— 第 3章 指令系统 152
3.7 程序控制指令
③ 根据 CX内容来决定是否转移的转移指令
JCXZ label
若 (CX)=0,则转移到 label处开始执行。
微机原理及应用 —— 第 3章 指令系统 153
3.7 程序控制指令
2.循环控制指令
用在循环程序中以确定是否要继续循环。
循环次数通常置于 CX中。
转移的目标应在距离本指令 -128~ +127的范围之内。
循环控制指令不影响标志位 。
微机原理及应用 —— 第 3章 指令系统 154
3.7 程序控制指令
(1)LOOP
格式,LOOP label
操作,(CX)-1→CX ;
若 (CX)≠0,则转至 label处执行 ;
否则退出循环,执行 LOOP后面的指令。
注,LOOP指令与下面的指令段等价:
DEC CX
JNZ label
微机原理及应用 —— 第 3章 指令系统 155
3.7 程序控制指令
(2)LOOPZ (LOOPE)
格式,LOOPZ label
操作,(CX)-1→CX ;
若 (CX)≠0∧ZF=1,则转至 label处执行 ;
否则退出循环,执行 LOOP后面的指令。
(3)LOOPNZ (LOOPNE)
格式,LOOPNZ label
操作,(CX)-1→CX ;
若 (CX)≠0∧ZF=0,则转至 label处执行 ;
否则退出循环,执行 LOOP后面的指令。
微机原理及应用 —— 第 3章 指令系统 156
3.7 程序控制指令例 2:在 8000H开始的长度为 1000字节的字符串中 查找 ’S’,若找到,把其偏移地址记录在 ADDR中,否则 ADDR单元置为 0FFFFH。
MOV DI,8000H
MOV CX,1000
MOV AL,’S’
MOV ADDR,0FFFFH
GOON,SCASB
LOOPNZ GOON
JNZ DONE
DEC DI
MOV ADDR,DI
DONE,HLT
微机原理及应用 —— 第 3章 指令系统 157
3.7 程序控制指令
3,过程调用和返回指令
过程 (子程序 )
一段具有特定功能的,供其它程序调用的公用程序。
特点
调用子程序时,IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到 IP(CS)。
子程序执行结束后一般均要返回调用程序。
一次定义,多次调用;
可带参数调用,以完成不同的功能。
优点程序代码短,结构清晰,便于编程、调试、修改和阅读。
两条相关指令:
子程序调用指令 CALL
子程序返回指令 RET
微机原理及应用 —— 第 3章 指令系统 158
3.7 程序控制指令一般格式,CALL sub ;sub为子程序的入口根据子程序入口的寻址方式,子程序调用有四类。
①段内直接调用子程序的偏移地址直接由 CALL指令给出。
格式,CALL near_proc
CALL执行时,它首先将 IP内容压栈,然后把指令中给出的位移量加到 IP上。
注:汇编以后的调用地址是相对于 CALL的下一条指令的位移量。
例,CALL 0120H ;子程序偏移地址由指令给出
(1)调用指令 CALL
微机原理及应用 —— 第 3章 指令系统 159
3.7 程序控制指令子程序的偏移地址在寄存器或存储器中 。
格式,CALL mem16/reg16
CALL执行时,它首先将 IP内容压栈,然后把指定的寄存器 /存储器的内容送入 IP。
例:
CALL BX ;子程序地址由 BX给出
CALL WORD PTR[SI] ;子程序地址在存储器中
②段内间接调用微机原理及应用 —— 第 3章 指令系统 160
3.7 程序控制指令
CALL
IPH IPL
代码段数据段
CALL WORD PTR [SI]指令的 操作图示:
假定,(DS) = 8000H,(SI) = 1200H
81200H
81201H
25H
10H
微机原理及应用 —— 第 3章 指令系统 161
3.7 程序控制指令子程序的段地址和偏移地址直接由 CALL指令给出。
格式,CALL far_proc ;far_proc为远过程的地址指令的操作为:
CS内容压栈
IP内容压栈
CS← 段地址
IP← 偏移地址例,CALL 2000H:1000H
CALL TIMER ;TIMER为远过程
③段间直接调用微机原理及应用 —— 第 3章 指令系统 162
3.7 程序控制指令子程序的段和偏移地址为存储器的连续 4个单元中的内容。
格式,CALL mem32
指令的操作为:
SP←(SP) -2
((SP)+1,(SP))←(CS) ;CS 压栈
CS← (mem32+2)
SP←(SP) -2
((SP)+1,(SP))←(IP) ;IP 压栈
IP← (mem32)
例,CALL DWORD PTR[DI]
调用地址在 [DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。
④段间间接调用微机原理及应用 —— 第 3章 指令系统 163
3.7 程序控制指令
CALL
代码段数据段
IPH IPL
CSH CSL
[DI]
[DI]+1
[DI]+2
[DI]+3
段间间接调用示意图
CALL DWORD PTR[DI]
微机原理及应用 —— 第 3章 指令系统 164
3.7 程序控制指令例:下面的程序执行后,(AX)=? (DX)=?
CS:2000H MOV AX,2012H
2003H MOV CX,200CH
2006H PUSH CX
2007H CALL 4000H
200AH ADD AX,BX
200CH ADD AX,DX
200EH HLT
… …
… …
CS:4000H MOV BX,200AH
POP DX
RET
微机原理及应用 —— 第 3章 指令系统 165
3.7 程序控制指令段内 返回指令 RET的操作为:
恢复子程序执行前 IP的内容。
段间 返回指令 RET的操作为:
恢复子程序执行前 IP和 CS的内容。
另有一种带立即数的返回指令,RET n,,其中 n为偶数,表示从栈顶弹出地址后另外丢弃的字节数。
例,RET 4 ;返回后再丢弃栈顶的 4个字节
(2)返回指令 RET
微机原理及应用 —— 第 3章 指令系统 166
3.7 程序控制指令
4.中断指令
8086/8088 CPU在程序中允许安排一条中断指令来引起一个中断过程,这种中断叫 内部中断,
或叫 软中断 。被中断的指令地址处称为,断点,。有关中断的详细情况将在第六章讨论。
中断指令共有三条:
(1)INT n 执行类型 n的中断服务程序,N=0~ 255
(2)INTO 执行溢出中断的中断服务程序
(3)IRET 从中断服务程序返回调用程序微机原理及应用 —— 第 3章 指令系统 167
3.7 程序控制指令
( 1) INT n
格式:
INT n
说明:
n34 = 向量地址。该向量地址中的内容即为中断服务程序入口地址 (段,偏移 ),入口地址也称为“中断向量,。
0000,n34 XXH
XXH
YYH
YYH
中断服务程序入口的偏移地址 (IP)
中断服务程序入口的段地址 (CS)
中断类型码
n = 0? 255 内存中断向量微机原理及应用 —— 第 3章 指令系统 168
3.7 程序控制指令
INT指令的操作:
将 FLAGS压入堆栈;
将 INT指令下一条指令的地址压栈(即把 CS和 IP的内容压栈);
取中断服务程序入口地址送入 CS和 IP。
INT指令只影响 IF和 TF,对其余标志位无影响
INT指令可用于调用系统服务程序,如 INT 21H
微机原理及应用 —— 第 3章 指令系统 169
3.7 程序控制指令
INT指令的操作例:
INT 21H
IPL
IPH
CSL
CSH
SP=1200
FLAGSL
FLAGSH
SP=11FA
执行 INT
21H指令后保护断点堆栈执行 INT
21H指令前微机原理及应用 —— 第 3章 指令系统 170
3.7 程序控制指令
INT指令的操作例(续):
执行 INT 21H指令后,CS=? IP=?
因为 n=21H,所以 n× 4=84H。
下图中,(0:0084H)=2000H:1123H
所以,CS=2000H IP=1123H
0000:0084H 23H
11H
00H
20H
IP
CS
0000,21H34
微机原理及应用 —— 第 3章 指令系统 171
3.7 程序控制指令
INTO检查溢出标志 OF,如果 OF=1,则启动一个类型 4的中断过程;如果 OF=0,不做任何操作。
通常 INTO指令安排在有符号数算术运算指令后面 。 如
IMUL DX
INTO ;若溢出,则启动 INT 4,否则往下执行
MOV RESULT,AX
MOV RESULT+2,DX
……
( 2)溢出中断 INTO
微机原理及应用 —— 第 3章 指令系统 172
用于从中断服务程序返回被中断的程序。 IRET负责 恢复断点 (CS和 IP)和恢复标志寄存器内容。
任何中断服务程序不管是外部中断引起的,还是内部中断引起的,最后都要用
IRET返回。 IRET指令执行的操作为:
栈顶内容弹出到 IP
栈顶内容弹出到 CS
栈顶内容弹出到 FLAG
(3)中断返回指令 IRET
3.7 程序控制指令微机原理及应用 —— 第 3章 指令系统 173
3.7 程序控制指令
1.标志操作指令用来设置标志位的状态 。
( 1) CF设置指令
CLC 0→CF
STC 1→CF
CMC CF变反
( 2) DF设置指令
CLD 0→DF (串操作的指针移动方向从低到高 )
STD 1→DF (串操作的指针移动方向从高到低 )
( 3) IF设置指令
CLI 0→IF (禁止 INTR中断 )
STI 1→IF (开放 INTR中断 )
微机原理及应用 —— 第 3章 指令系统 174
3.7 程序控制指令执行 HLT指令时,CPU进入暂停状态,设置该指令通常是为了等待中断。
外部中断 (包括 IF=1时的可屏蔽中断请求
INTR及非屏蔽中断请求 NMI)或复位信号可让
CPU退出暂停状态。
HLT不影响标志位 。
2,外部同步指令
(1)暂停指令 HLT
微机原理及应用 —— 第 3章 指令系统 175
3.7 程序控制指令
(2)空操作指令 NOP
NOP指令不做任何实质性的操作,但占用 3个时钟周期,然后执行下一条指令。
多用于延时或预留存储空间 (占位子 )。