第 6 讲 8086 指令系统(续) 2006.10.24 (星期二)

44
6 6 8086 8086 第第第 第第 () 第第第 第第 () 2006.10.24 2006.10.24 第第第第 () 第第第第 () 第第第第 6 第第第第1 第第 (Data transfer) 2 第第第第Arithmetic 3 第第第第第第第第第 (Logic& Shift) 4 第第第 (String manipulation) 5 第第第第Control Transfer 6 第第第第第Processor Control

Upload: kalei

Post on 14-Jan-2016

105 views

Category:

Documents


3 download

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 Presentation

TRANSCRIPT

Page 1: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

第第 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 )

Page 2: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

1 . 数据传送 (Data transfer)(一)通用传送指令( General Purpose Transfer )

(二)输入输出指令( Input and Output)

(三)目的地址传送指令( Address-object transfer)

(四)标志传送指令( Flag register transfer)

Page 3: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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] 得到什么?

例:

Page 4: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例:设( 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

.. .

存储器

Page 5: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

(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 (错)

Page 6: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

22 、、 LDSLDS (Load pointer using DS)

格式: LDS reg16, mem32 ;( reg16 )←( EA )

( DS )←(( EA ) +2 ))

功能:将指令指定将指令指定 3232 位地址指针送指令指定寄存器和位地址指针送指令指定寄存器和 DSDS 。

将指令指定 mem32 单元的前两个单元内容 (16 位偏移量 ) 装入指定通用寄存器,把后两个单元内容 ( 段地址 ) 装入到 DS段寄存器。

用于写远地址指针。

Page 7: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 :

假设: (DS)=C 000H

指令 : LDS SI, [0010H]

执行指令后 :

(SI)=0180H

(DS)=2000H

80H

01H

00H

20H

C000H:0010H

(DS)

C0011H

C0012H

C0013H

.. .

. . .

存储器

Page 8: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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 段寄存器。

用于写远地址指针。

Page 9: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 :

假设: (DS)=B 000H

(BX)=080AH

指令 : LES DI, [BX]

执行指令后 :

(DI)=05A2H

(ES)=4000H

A2H

05H

00H

40H

B000H:080AH

(DS)

B080BH

B080CH

B080DH

.. .

. . .

存储器

(BX)

Page 10: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

综合举例:设:

(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

Page 11: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

(四)标志传送指令(四)标志传送指令( 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 )

Page 12: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

11 .. LAHFLAHF ( Load AH from flags )格式: LAHF ;( AH )←( PSW 的低字节)

功能:标志寄存器低八位 标志寄存器低八位 (( AHAH ))。

SFZF AF PF CF

01234567

TFIFDFOF

89101112131415

01234567

FLAGS

AH

LAHF 指令操作图示意

Page 13: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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

功能 :标志出栈。

Page 14: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

注意:

( 1 ) 标志位的影响

LAHF 、 PUSHF 不影响标志位 ,

SAHF 、 POPF 由装入的值确定标志位的值,直接对标志位的操作,影响标志位。

( 2 ) PUSH F 、 POPF 用于保护调用过程前( PSW), 过程返回后恢复。例: …

PUSH AX

PUSH CX

PUSH F

CALL TRANS

返回顺序POPF

POP CX

POP AX

Page 15: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

三 . 算术运算指令

二进制运算 十进制调整

加 ADD, ADC, INC AAA, DAA

减 SUB, SBB, DEC, NEG, CMP AAS, DAS

乘 MUL, IMUL AAM

除 DIV, IDIV AAD

符号扩展指令: CBW、CWD

指令分类:

Page 16: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

特点: 带符号数用补码表示 如 MOV AX, -1 等价于 MOV AX, 0FFFFh

对加、减运算,不区分无符号数、带符号数 对乘、除运算,区分无符号数、带符号数 可进行字节或字操作 影响状态标志 十进制运算方法:

当数据用组合(压缩)或分离(非压缩) BCD 码表示时,为使运算的结果仍为 BCD 码表示,需对结果进行调整。 十进制运算 = 二进制运算 + 十进制调整

Page 17: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

十进制数码 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

Page 18: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

ASCIIASCII 码是一种分离码是一种分离 BCDBCD 码码数字的 ASCII 的高 4 位 0011 无意义;

低 4 位是以 8421 码形式表示的十进制数位。

符合分离 BCD 码高 4 位无意义的规定。

2 的 ASCII 码:

高 4 位 0011 无意义

0 0 1 1 0 0 1 0

Page 19: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

当数据用组合或分离 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

Page 20: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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

Page 21: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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)

Page 22: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 2 加 1 指令 : INC AL

  执行前 ( AL ) = FFH

执行后 :

( AL ) =00H

CF= 不变, OF=0 , ZF=1 , SF=0

FFH

+ 01H

11

00H

Page 23: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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]

Page 24: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 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

Page 25: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 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 只能按字节或字相加。 位数在字以上的操作数,先加低位,再加高位, 加高位时加入从低位产生的进位。

Page 26: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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)

Page 27: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 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

借位

Page 28: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 2 带进位减法: 用指令完成两双字相减运算

0546 7A70H - F001 A543H

MOV AX , 7A70H

SUB AX , A543H

MOV BX , 0546H

SBB BX , 0F001H

Page 29: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 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

Page 30: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 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

Page 31: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 5 :求绝对值

在内存中,从 AREA1 开始存放100 个带符号数。

求各数的绝对值存于AREA2 的开始单元。

流程图

开始

初始化置源地址,置目的地址指针

置循环次数

取一个带符号数

负数?

求补

送存

1地址指针+

1循环次数-

0循环次数= ?

结束

N

Y

N

Y

Page 32: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

程序: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 )。

Page 33: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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 ,进行两操作数相减操作, 但只影响标志值,不影响操作数 ( 减的结果不保存 )

比较指令:

Page 34: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

条件转移指令 判断条件

低于 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 中

比较指令常常根据条件(标志)转移,无符号数转移指令如下:

Page 35: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

例 将 AX 和 BX 中较大的带符号数,存于 AX 中

CMP AX, BX ;比较 JGE great ;大于或等于则跳转 XCHG AX, BX ;小于则交换

great: 、、、

CMP A , B

Page 36: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

CMP 指令应用举例:带符号数找最大值带符号数找最大值

若自 BLOCK开始的内存缓冲区中,有 100个带符号数。

找出最大值。并存放到 MAX单元中。

思路:思路:• 第一个数取出 ( AX) , • 取出第二个数(第二个字单元内容)与 (AX)比较 :

( AX ) > 第二个数,不做交换,

否则,(第二个字单元内容) ( AX )。

• 再取第三个数,

• 经过 99次比较,在( AX )中得到最大数。

Page 37: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

编程: 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 单元存放最大值

Page 38: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

3. 乘法指令

无符号数乘法

带符号数乘法

问题思考问题思考:乘法中为什么要用 MUL , IMUL 指令 ?

指令格式 执行操作

MUL src

若 src 为字节类型: ( AX) ← ( AL) × (src) 若 src 为字类型: (DX),(AX) ← (AX) × (src)

将被乘数、乘数看作无符号数,进行乘运算 乘的结果也为无带符号数

IMUL src 执行的操作与 MUL 相似 将被乘数、乘数看作带符号数 , 进行乘运算 乘的结果也为带符号数

Page 39: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

4. 除法指令

指令格式 执行操作

DIV src

无符号数除法

(src)为字节类型:

(AL) ← (AX) / (src) 的商

(AH) ← (AX) / (src) 的余数

(src)为字类型:

(AX) ← (D X ) ,( AX ) / (src) 的商 (DX) ← (DX) , (AX) / (src) 的余数

将被除数、除数看作无符号数,进行除法运算,

商、余数也为无符号数

IDIV src

带符号数除法

执行的操作与 DIV 相同, 将被除数、除数看作带符号数,进行除法运算

商、余数也为带符号数,余数的符号与被除数同

Page 40: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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

Page 41: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

66 、调整指令、调整指令前面提到的所有算术运算指令都是二进制的运算指令,

但人们常用的是十进制。

当用计算机进行计算时:

必须先把十进制十进制 二进制数, 二进制数,

计算结果计算结果 十进制数输出。 十进制数输出。

为便于十进制运算,计算机提供了一组十进制调整指令,

这组指令在二进制基础上给予十进制调整,直接得到十进制数二进制基础上给予十进制调整,直接得到十进制数。

8086/8088 中提供了六条调整指令。

Page 42: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

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 码进行调整,

Page 43: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

算术运算指令复习

二进制运算 十进制调整

加 ADD, ADC, INC AAA, DAA

减 SUB, SBB, DEC, NEG, CMP AAS, DAS

乘 MUL, IMUL AAM

除 DIV, IDIV AAD

符号扩展指令: CBW、CWD

Page 44: 第 6 讲  8086 指令系统(续) 2006.10.24 (星期二)

作业:

41 , 48 , 53