第 6 讲 8086 指令系统(续) 2006.10.24 (星期二)
DESCRIPTION
第 6 讲 8086 指令系统(续) 2006.10.24 (星期二). 可以分成 6 个功能组: 1 .数据传送 (Data transfer) 2 .算术运算( Arithmetic ) 3 .逻辑运算和移位指令 (Logic& Shift) 4 .串操作 (String manipulation) 5 .控制转移( Control Transfer ) 6 .处理器控制( Processor Control ). 1 .数据传送 (Data transfer) (一)通用传送指令( General Purpose Transfer ) - PowerPoint PPT PresentationTRANSCRIPT
第第 66 讲 讲 80868086 指令系统(续)指令系统(续)2006.10.242006.10.24 (星期二)(星期二)
可以分成 6 个功能组:1 . 数据传送 (Data transfer)
2 . 算术运算( Arithmetic )
3 . 逻辑运算和移位指令 (Logic& Shift)
4 . 串操作 (String manipulation)
5 . 控制转移( Control Transfer )
6 . 处理器控制( Processor Control )
1 . 数据传送 (Data transfer)(一)通用传送指令( General Purpose Transfer )
(二)输入输出指令( Input and Output)
(三)目的地址传送指令( Address-object transfer)
(四)标志传送指令( Flag register transfer)
11 、、 LEALEA(Load Effective Address)( 熟练掌握内容 )
格式: LEA reg16 , mem16 ;EA(reg16)
功能:加载有效地址,用于写近地址指针。
把指令中指定的存储器操作数有效地址装入指定的寄存器把指令中指定的存储器操作数有效地址装入指定的寄存器 。
(三)目的地址传送指令(三)目的地址传送指令( Address-object transfer) 8086 /8088 提供三条 :
地址指针写入指定寄存器或寄存器对指令。
已知变量 DDR 对应一内存单元 DS : EA ( 1000H : 2000H )
LEA BX,DDR 表明把 DDR 的偏移量 2000H 送入 BX 寄存器。LEA BX,[SI] 得到什么?
例:
例:设( BX ) =0400H ,( SI ) =003CHLEA BX , [BX+SI+0F62H]
执行指令后: EA= ( BX ) + ( SI ) +0F62H=0400H+003CH+0F62H=139EH ,( BX ) =139EH注意:设()表示对应寄存器的内容,不妨设
(DS)=3000HBUFFER=1000H(31000H)=0040H
40H
00H
.. .
3000H:1000H
(DS) BUFFER
31001H
.. .
存储器
(1) LEA 指令与 MOV 的区别LEA BX , BUFFER ;( BX)=1000HMOV BX , BUFFER ; (BX)=0040H
LEA 指令与 MOV 等价 :LEA BX , BUFFER ; (BX)=1000HMOV BX , OFFSET BUFFER ; (BX)=1000H
( 2 ) LEA LEA 指令中的目标寄存器必须是指令中的目标寄存器必须是 1616 位的通用寄存位的通用寄存器器, 源操作数必须是一个存储器源操作数必须是一个存储器。
( 3 )请思考下列指令的正、误
LEA DX ,BETA[BX][SI] (对)LEA DX , AX (错)
22 、、 LDSLDS (Load pointer using DS)
格式: LDS reg16, mem32 ;( reg16 )←( EA )
( DS )←(( EA ) +2 ))
功能:将指令指定将指令指定 3232 位地址指针送指令指定寄存器和位地址指针送指令指定寄存器和 DSDS 。
将指令指定 mem32 单元的前两个单元内容 (16 位偏移量 ) 装入指定通用寄存器,把后两个单元内容 ( 段地址 ) 装入到 DS段寄存器。
用于写远地址指针。
例 :
假设: (DS)=C 000H
指令 : LDS SI, [0010H]
执行指令后 :
(SI)=0180H
(DS)=2000H
80H
01H
00H
20H
C000H:0010H
(DS)
C0011H
C0012H
C0013H
.. .
. . .
存储器
33 、、 LES (Load pointer using ES)LES (Load pointer using ES)
格式: LES reg16, mem32 ;( reg16 )←( EA )
( ES )←(( EA ) +2 ))
功能:把源操作数指定的把源操作数指定的 44 个相继字节送指令指定的寄存个相继字节送指令指定的寄存器 器 及及 ESES 寄存器中。寄存器中。
此指令常常指定 DI 寄存器。
将指令指定 mem32 单元的前两个单元内容 (16 位偏移量 )装入指定通用寄存器,把后两个单元内容 ( 段地址 ) 装入到ES 段寄存器。
用于写远地址指针。
例 :
假设: (DS)=B 000H
(BX)=080AH
指令 : LES DI, [BX]
执行指令后 :
(DI)=05A2H
(ES)=4000H
A2H
05H
00H
40H
B000H:080AH
(DS)
B080BH
B080CH
B080DH
.. .
. . .
存储器
(BX)
综合举例:设:
(DS)=5000H
TABLE=1000H
分析下列指令执行结果:
MOV BX , TABLE ;( BX ) =0040H
MOV BX , OFFSET TABLE ;( BX ) =1000H
LEA BX , TABLE ;( BX ) =1000H
LES BX , TABLE ;( BX ) =0040H ,( ES ) =3000H
LDS BX , TABLE ;( BX ) =0040H ,( DS ) =3000H
40H
00H
00H
5000H:1000H
(DS) TABLE
51001H
.. .
存储器
30H
. . .
51002H
51003H
(四)标志传送指令(四)标志传送指令( Flag register transfer )
采用了隐含寄存器( AH 、 Flags) 操作数方式。
8088 有四条标志传送操作指令:1 . LAHF ( Load AH from flags )
2 . SAHF ( Store AH into flags )
3 . PUSH F ( Push flags onto stack )
4 . POP F ( Pop flags off stack )
11 .. LAHFLAHF ( Load AH from flags )格式: LAHF ;( AH )←( PSW 的低字节)
功能:标志寄存器低八位 标志寄存器低八位 (( AHAH ))。
SFZF AF PF CF
01234567
TFIFDFOF
89101112131415
01234567
FLAGS
AH
LAHF 指令操作图示意
2 . SAHF ( Store AH into flags )
格式: SAHF ;( FR 的低字节)←( AH )
功能:( AH )送标志寄存器低八位。
3 . PUSH F ( Push flags onto stack )
格式: PUSH F ;( SP )←( SP ) -2
(( SP ) +1 ,( SP ))←( FR )
功能 : 标志进栈。
4 . POP F ( Pop flags off stack )
格式: POP F ;( PSW )←(( SP ) +1 ,( SP ))
( SP )←( SP ) +2
功能 :标志出栈。
注意:
( 1 ) 标志位的影响
LAHF 、 PUSHF 不影响标志位 ,
SAHF 、 POPF 由装入的值确定标志位的值,直接对标志位的操作,影响标志位。
( 2 ) PUSH F 、 POPF 用于保护调用过程前( PSW), 过程返回后恢复。例: …
PUSH AX
PUSH CX
PUSH F
CALL TRANS
返回顺序POPF
POP CX
POP AX
…
三 . 算术运算指令
二进制运算 十进制调整
加 ADD, ADC, INC AAA, DAA
减 SUB, SBB, DEC, NEG, CMP AAS, DAS
乘 MUL, IMUL AAM
除 DIV, IDIV AAD
符号扩展指令: CBW、CWD
指令分类:
特点: 带符号数用补码表示 如 MOV AX, -1 等价于 MOV AX, 0FFFFh
对加、减运算,不区分无符号数、带符号数 对乘、除运算,区分无符号数、带符号数 可进行字节或字操作 影响状态标志 十进制运算方法:
当数据用组合(压缩)或分离(非压缩) BCD 码表示时,为使运算的结果仍为 BCD 码表示,需对结果进行调整。 十进制运算 = 二进制运算 + 十进制调整
十进制数码 0 1 2 3 4
8421 BCD 码 0000 0001 0010 0011 0100
十进制数码 5 6 7 8 9
8421 BCD 码 0101 0110 0111 1000 1001
BCD 码( Binary Coded Decimal )
用二进制编码表示十进制数。 常用 8421 BCD 码 , 与十进制数码对应关系:
例 48 的 BCD 码为 ( 0100 1000 ) BCD
ASCIIASCII 码是一种分离码是一种分离 BCDBCD 码码数字的 ASCII 的高 4 位 0011 无意义;
低 4 位是以 8421 码形式表示的十进制数位。
符合分离 BCD 码高 4 位无意义的规定。
2 的 ASCII 码:
高 4 位 0011 无意义
0 0 1 1 0 0 1 0
当数据用组合或分离 BCD 码表示时,为使运算的结果仍为 BCD 码表示,需对结果进行调整。 十进制运算 = 二进制运算 + 十进制调整
例 (0000 1000 ) 压缩 BCD + (0000 1001) 压缩 BCD
= (0001 0111 ) 压缩 BCD
计算机计算过程 看作压缩 BCD
0000 1000 08 + 0000 1001 09 0001 0001 11
二进制运算
十进制调整 + 0000 0110 0001 0111 17
1. 加法运算指令
指令格式 执 行 操 作
ADD dst, src (dst) ← (dst) + (src)
ADC dst, src (dst) ← (dst) + (src) + CF
INC oprd (oprd) ← (oprd) + 1
ADD 、 ADC 为双操作数指令 INC 为单操作数指令 除 INC 指令不影响 CF 外,其余指令 6 个状态标志均据结果置位
ADC 带进位加法,实现字以上运算(进位是上条指令运算的进位)
OF DF IF TF SF ZF AF PF CF
CFA1H 1100 1111 1010 0001
+ 62A0H + 0110 0010 1010 0000 111 1 1 1 1111 1 3241H 0011 0010 0100 0001
例 1 加法指令: 编程完成 CFA1H + 62A0H
MOV DX , 0CFA1HADD DX , 62A0H
执行后 :( DX ) =3241H CF=1 , OF=0 , SF=0 , ZF=0
(注意: CF 和 OF 的判断方法, OF=CD6 CD7)
例 2 加 1 指令 : INC AL
执行前 ( AL ) = FFH
执行后 :
( AL ) =00H
CF= 不变, OF=0 , ZF=1 , SF=0
FFH
+ 01H
11
00H
01FFH+ 0001H进位 11 0200H
例 3 value 是一个字变量 OFFSET value = 1000H
( DS ) =2000H ,( 21000H ) =01FFH
value FF21000H 01
执行前
value 0021000H 02
执行后执行后: ( 21000H ) =0200H
CF= 不变, OF=0 , ZF=0 , SF=0
注意: INC value 是内存单元内容加 1 ,而非地址加 1
INC value
或写成 :
INC [value]
例 4 将 buffer 为首的 4 个字节内存内容相加,存放在 AL 中。
buffer 1AB7C5D6
注意若编程如下 ,MOV CX, 4MOV AL, 0
exit: ADD AL, [buffer] INC buffer DEC CX
JNZ exit
不能实现 , 为什么?
…... MOV CX, 4 LEA BX, buffer
MOV AL, 0exit: ADD AL, [BX]
INC BX DEC CX JNZ exit
实 现 的 是 (1A)+(1B)+(1C)+(1D)指令 INC buffer 将 buffer 指向的内存单元内容加 1 ,而不是地址 buffer 加 1
例 5 带进位加:两双字相加 0002F365H + 0005 E024 H = ?
MOV AX , 0F365H ①ADD AX , 0E024H ②MOV BX , 0002H ③ADC BX , 0005H ④
0002 F365 H + 0005 E024 H 进位1 0008 D389 H
结果存放在 : 0008 D389( BX ) ( AX )
执行完①、②: (AX)= D389H CF=1, OF=0, SF=1, ZF=0 执行完③、④: (BX)= 0008H CF=0, OF=0, SF=0, ZF=0
分析: 8086/8088 只能按字节或字相加。 位数在字以上的操作数,先加低位,再加高位, 加高位时加入从低位产生的进位。
2. 减法运算指令
SUB 、 SBB 、 CMP 为双操作数, DEC 、 NEG 为单操作数 SBB 为带进位减法(进位是上条指令运算的进位)。 除 DEC 不影响 CF 标志外,其余指令 6 个状态标志均据结果置位。 NEG 求补运算,等价于用 0 减去操作数。
其对标志位的影响,由 0 减去该操作数的过程决定。
指令格式 执行操作 SUB dst, src (dst) ← (dst) - (src)
SBB dst, src (dst) ← (dst) - (src) - CF
DEC oprd (oprd) ← (oprd) - 1
NEG oprd (oprd) ← 0 - (oprd)
CMP oprd1, oprd2 (oprd1) - (oprd2)
例 1 减法指令:编程完成 2D04H – 3AB0H
执行后 : ( AX ) =0F254H CF=1 , OF=0 , SF=1 , ZF=0
2D04H 0010 1101 0000 0100 - 3AB0H - 0011 1010 1011 0000 1 1 1111 1 1 111 F254H 1111 0010 0101 0100
MOV AX , 2D04HSUB AX , 3AB0H
借位
例 2 带进位减法: 用指令完成两双字相减运算
0546 7A70H - F001 A543H
MOV AX , 7A70H
SUB AX , A543H
MOV BX , 0546H
SBB BX , 0F001H
例 3 减 1 指令: value 是一个字节变量
OFFSET value = 1000H
( DS ) =2000H ,( 21000H ) =00H
DEC value
执行后:( 21000H ) =0FFH
CF= 不变, OF=0 , ZF=0 , SF=1
注意: DEC value 是内存单元内容减 1 ,而非地址减 1
00 H - 01 H 11
FFH
例 4 求补指令: MOV AH, 80H
NEG AH
00 H 0000 0000 B - 80 H - 1000 0000 B 1 1 80H 1000 0000B
执行后: ( AL ) =80H , CF=1 , OF=1 , ZF=0 , SF=1
例 5 :求绝对值
在内存中,从 AREA1 开始存放100 个带符号数。
求各数的绝对值存于AREA2 的开始单元。
流程图
开始
初始化置源地址,置目的地址指针
置循环次数
取一个带符号数
负数?
求补
送存
1地址指针+
1循环次数-
0循环次数= ?
结束
N
Y
N
Y
程序:LEA SI, AREA1LEA DI, AREA2MOV CX, 100
CHECK: MOV AL, [SI]OR AL, AL ;(AL) 内容不变,置标志JNS NEXT ; SF=0 转 NEXTNEG AL ; 负数求补
NEXT: MOV [DI], AL ;送目标INC SIINC DIDEC CXJNZ CHECKHLT
负数的真值和它的补码互为补(本位和为0 )。
CMP oprd1, oprd2 ; (oprd1) - (oprd2)
① 据 ZF 判断两数是否相等CMP A, B
ZF=1 两数相等 , A = B ;ZF=0 两数不等 , A ≠ B
② 据 ZF 和 CF 判断两无符号数关系CF= 1 A 低于 B
CF= 0 A 高于或等于 B
CF=1 或 ZF=1 A 低于等于 B
CF=0且 ZF=0 A 高于 B
利用 CMP 执行后的标志值,比较两操作数之间的关系
比较指令 CMP ,进行两操作数相减操作, 但只影响标志值,不影响操作数 ( 减的结果不保存 )
比较指令:
条件转移指令 判断条件
低于 JB next CF = 1
低于或等于 JBE next CF = 1 或 ZF = 1
高于 JA next CF = 0 且 ZF = 0
高于或等于 JAE next CF = 0
CMP AX, BX ;比较 JAE above ; 高于或等于则跳转 XCHG AX, BX ; 低于则交换
above: 、、、
例 将 AX 和 BX 中较大的无符号数,存于AX 中
比较指令常常根据条件(标志)转移,无符号数转移指令如下:
例 将 AX 和 BX 中较大的带符号数,存于 AX 中
CMP AX, BX ;比较 JGE great ;大于或等于则跳转 XCHG AX, BX ;小于则交换
great: 、、、
CMP A , B
CMP 指令应用举例:带符号数找最大值带符号数找最大值
若自 BLOCK开始的内存缓冲区中,有 100个带符号数。
找出最大值。并存放到 MAX单元中。
思路:思路:• 第一个数取出 ( AX) , • 取出第二个数(第二个字单元内容)与 (AX)比较 :
( AX ) > 第二个数,不做交换,
否则,(第二个字单元内容) ( AX )。
• 再取第三个数,
…
• 经过 99次比较,在( AX )中得到最大数。
…
编程: MOV BX , OFFSET BLOCK
MOV AX , [BX]
INC BX
INC BX
MOV CX , 99
AGAIN : CMP AXCMP AX ,, [BX][BX] JG NEXTJG NEXT ; (AX) >(16(ds)+(BX))转 NEXT MOV AX , [BX]
NEXT: INC BX
INC BX
DEC CX
JNE AGAIN
MOV MAX , AX ; MAX 单元存放最大值
3. 乘法指令
无符号数乘法
带符号数乘法
问题思考问题思考:乘法中为什么要用 MUL , IMUL 指令 ?
指令格式 执行操作
MUL src
若 src 为字节类型: ( AX) ← ( AL) × (src) 若 src 为字类型: (DX),(AX) ← (AX) × (src)
将被乘数、乘数看作无符号数,进行乘运算 乘的结果也为无带符号数
IMUL src 执行的操作与 MUL 相似 将被乘数、乘数看作带符号数 , 进行乘运算 乘的结果也为带符号数
4. 除法指令
指令格式 执行操作
DIV src
无符号数除法
(src)为字节类型:
(AL) ← (AX) / (src) 的商
(AH) ← (AX) / (src) 的余数
(src)为字类型:
(AX) ← (D X ) ,( AX ) / (src) 的商 (DX) ← (DX) , (AX) / (src) 的余数
将被除数、除数看作无符号数,进行除法运算,
商、余数也为无符号数
IDIV src
带符号数除法
执行的操作与 DIV 相同, 将被除数、除数看作带符号数,进行除法运算
商、余数也为带符号数,余数的符号与被除数同
5. 符号扩展指令
指令格式 执行操作
CBW
将 (AL) 的符号扩展到 AH 中
(AL)的 D7=0,(AH)=00H
D7=1 ,(AH)=FFH
CWD
将 (AX) 的符号扩展到 DX 中
(AX)的 D15=0,(DX)=0000H
D15=1 ,
(DX)=FFFFH
66 、调整指令、调整指令前面提到的所有算术运算指令都是二进制的运算指令,
但人们常用的是十进制。
当用计算机进行计算时:
必须先把十进制十进制 二进制数, 二进制数,
计算结果计算结果 十进制数输出。 十进制数输出。
为便于十进制运算,计算机提供了一组十进制调整指令,
这组指令在二进制基础上给予十进制调整,直接得到十进制数二进制基础上给予十进制调整,直接得到十进制数。
8086/8088 中提供了六条调整指令。
80888088 中有六条调整指令:中有六条调整指令:( 1 )、 DAA ( Decimal adjust for addition) 加法十进制调整指令
( 2 )、 DAS ( Decimal adjust for subtration) 减法十进制调整指令
( 3 )、 AAA ( ASCII adjust for addition) 加法 ASCII 调整指令
( 4 )、 AAS ( ASCII adjust for subtration) 减法 ASCII 调整指令
( 5 )、 AAM ( ASCII adjust for multiply) 乘法 ASCII 调整指令
( 6 )、 AAD ( ASCII adjust for division) 除法 ASCII 调整指令
共同点:• 调整指令后边不跟操作数调整指令后边不跟操作数::
十进制调整指令隐含寄存器操作数 AL;
ASCII 调整指令隐含寄存器操作数 AL 或 AH 。• 调整对象调整对象::十进制调整指令对组合 BCD 码进行调整;
ASCII 调整指令对分离 BCD 码进行调整,
算术运算指令复习
二进制运算 十进制调整
加 ADD, ADC, INC AAA, DAA
减 SUB, SBB, DEC, NEG, CMP AAS, DAS
乘 MUL, IMUL AAM
除 DIV, IDIV AAD
符号扩展指令: CBW、CWD
作业:
41 , 48 , 53