6 8086 2006 10 24
Download
Skip this Video
Download Presentation
第 6 讲 8086 指令系统(续) 2006.10.24 (星期二)

Loading in 2 Seconds...

play fullscreen
1 / 44

第 6 讲 8086 指令系统(续) 2006.10.24 (星期二) - PowerPoint PPT Presentation


  • 85 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第 6 讲 8086 指令系统(续) 2006.10.24 (星期二)' - teddy


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
6 8086 2006 10 24
第6讲 8086指令系统(续)2006.10.24(星期二)

可以分成6个功能组:

1. 数据传送(Data transfer)

2. 算术运算(Arithmetic)

3. 逻辑运算和移位指令(Logic& Shift)

4. 串操作(String manipulation)

5. 控制转移(Control Transfer)

6. 处理器控制(Processor Control)

slide2

1. 数据传送(Data transfer)

(一)通用传送指令(General Purpose Transfer)

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

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

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

slide3

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

8086 /8088 提供三条:

地址指针写入指定寄存器或寄存器对指令。

已知变量DDR对应一内存单元DS :EA (1000H):2000H)

LEA BX,DDR表明把DDR的偏移量2000H送入BX寄存器。

1、LEA(Load Effective Address)(熟练掌握内容)

格式: LEA reg16 , mem16 ;EA(reg16)

功能:加载有效地址,用于写近地址指针。

把指令中指定的存储器操作数有效地址装入指定的寄存器 。

例:

LEA BX,[SI]得到什么?

slide4

例:设(BX)=0400H,(SI)=003CH

LEA BX,[BX+SI+0F62H]

执行指令后:

EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H

=139EH,(BX)=139EH

注意:设()表示对应寄存器的内容,不妨设

(DS)=3000H

BUFFER=1000H

(31000H)=0040H

slide5

(1) LEA 指令与MOV 的区别

LEA BX , BUFFER ;(BX)=1000H

MOV BX , BUFFER ; (BX)=0040H

LEA 指令与MOV等价

LEA BX , BUFFER ; (BX)=1000H

MOV BX , OFFSET BUFFER ; (BX)=1000H

(2)LEA 指令中的目标寄存器必须是16位的通用寄存器,

源操作数必须是一个存储器。

(3)请思考下列指令的正、误

LEA DX ,BETA[BX][SI] (对)

LEA DX , AX(错)

slide6

2、LDS (Load pointer using DS)

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

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

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

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

用于写远地址指针。

slide7

例:

假设:(DS)=C 000H

指令: LDS SI, [0010H]

执行指令后:

(SI)=0180H

(DS)=2000H

slide8

3、LES (Load pointer using ES)

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

(ES)←((EA)+2))

功能:把源操作数指定的4个相继字节送指令指定的寄存器 及ES寄存器中。

此指令常常指定DI寄存器。

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

用于写远地址指针。

slide9

例:

假设:(DS)=B 000H

(BX)=080AH

指令: LES DI, [BX]

执行指令后:

(DI)=05A2H

(ES)=4000H

slide10

综合举例:

设:

(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

slide11

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

slide12

1.LAHF(Load AH from flags)

格式:LAHF ;(AH)←(PSW的低字节)

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

7

6

5

4

3

2

1

0

AH

FLAGS

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

LAHF指令操作图示意

slide13

2. SAHF(Store AH into flags)

格式:SAHF ;(PSW的低字节)←(AH)

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

3. PUSH F(Push flags onto stack)

格式:PUSH F ;(SP)←(SP)-2

((SP)+1,(SP))←(PSW)

功能 : 标志进栈。

4. POP F(Pop flags off stack)

格式:POP F;(PSW)←((SP)+1,(SP))

(SP)←(SP)+2

功能 :标志出栈。

slide14

注意:

(1) 标志位的影响

LAHF、PUSHF不影响标志位,

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

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

例: …

PUSH AX

PUSH CX

PUSH F

CALL TRANS

返回顺序

POPF

POP CX

POP AX

slide15

三. 算术运算指令

指令分类:

二进制运算

十进制调整

ADD, ADC, INC

AAA,

DAA

SUB, SBB, DEC, NEG, CMP

AAS,

DAS

MUL, IMUL

AAM

DIV, IDIV

AAD

CBW

CWD

符号扩展指令:

slide16

特点:

  • 带符号数用补码表示

如 MOV AX, -1 等价于 MOV AX, 0FFFFh

  • 对加、减运算,不区分无符号数、带符号数

对乘、除运算,区分无符号数、带符号数

  • 可进行字节或字操作
  • 影响状态标志
  • 十进制运算方法:
      • 当数据用组合(压缩)或分离(非压缩)BCD码表示时,
      • 为使运算的结果仍为BCD码表示,需对结果进行调整。
      • 十进制运算 = 二进制运算 + 十进制调整
slide17

0

1

2

3

4

十进制数码

0000

0001

0010

0011

0100

8421

BCD

5

6

7

8

9

十进制数码

  • BCD码( Binary Coded Decimal )
  • 用二进制编码表示十进制数。
  • 常用8421 BCD码, 与十进制数码对应关系:

0101

0110

0111

1000

1001

8421

BCD

例 48的BCD码为 ( 0100 1000)BCD

slide18

ASCII码是一种分离BCD码

  • 数字的ASCII的高4位0011无意义;
  • 低4位是以8421码形式表示的十进制数位。
  • 符合分离BCD码高4位无意义的规定。
  • 2的ASCII码:
  • 高4位0011无意义
slide19

计算机计算过程 看作压缩BCD

0000 1000 08

+ 0000 1001 09

0001 0001 11

二进制运算

+ 0000 0110

0001 0111 17

十进制调整

当数据用组合或分离BCD码表示时,

为使运算的结果仍为BCD码表示,需对结果进行调整。

十进制运算 = 二进制运算 + 十进制调整

  • 例 (0000 1000 )压缩BCD+ (0000 1001)压缩BCD
          • = (0001 0111 ) 压缩BCD
slide20

OF

DF

IF

TF

SF

ZF

AF

PF

CF

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带进位加法,实现字以上运算(进位是上条指令运算的进位)
slide21

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,0CFA1H

ADD DX,62A0H

  • 执行后:
    • (DX)=3241H CF=1,OF=0,SF=0, ZF=0
    • (注意:CF和OF的判断方法,OF=CD6 CD7)
slide22

FFH

  • + 01H
  • 11
  • 00H

例2加1指令 :INC AL

  执行前 (AL)= FFH

执行后:

(AL)=00H

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

slide23

例3value 是一个字变量

OFFSET value = 1000H

 (DS)=2000H,(21000H)=01FFH

执行前

value FF

21000H

01

执行后:

  (21000H)=0200H

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

执行后

value 00

21000H

02

01FFH

+ 0001H

进位11

0200H

INC value

或写成:

INC [value]

注意: INC value是内存单元内容加1,而非地址加1

slide24

例4 将buffer为首的4个字节内存内容相加,存放在AL中。

buffer

1A

B7

C5

D6

    • …...
    • MOV CX, 4
    • LEA BX, buffer
  • MOV AL, 0
  • exit: ADD AL, [BX]
    • INC BX
    • DEC CX
    • JNZ exit
      • 注意若编程如下,
      • MOV CX, 4
      • MOV AL, 0
  • exit: ADD AL, [buffer]
    • INC buffer
    • DEC CX
      • JNZ exit

不能实现, 为什么?

实现的是(1A)+(1B)+(1C)+(1D)

指令INC buffer

将buffer指向的内存单元内容加1,而不是地址buffer加1

slide25

0002 F365 H

+0005 E024 H

进位1 

0008 D389 H

0008 D389

(BX) (AX)

结果存放在:

例5 带进位加:两双字相加 0002F365H + 0005 E024 H = ?

  • 分析: 8086/8088只能按字节或字相加。
  • 位数在字以上的操作数,先加低位,再加高位,
  • 加高位时加入从低位产生的进位。

MOV AX,0F365H ①

ADD AX,0E024H ②

MOV BX,0002H ③

ADC BX,0005H ④

      • 执行完①、②:(AX)= D389H CF=1, OF=0, SF=1, ZF=0
  • 执行完③、④:(BX)= 0008H CF=0, OF=0, SF=0, ZF=0
slide26

指令格式

执行操作

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)

-

2. 减法运算指令

  • SUB、SBB、 CMP为双操作数,DEC、NEG为单操作数
  • SBB为带进位减法(进位是上条指令运算的进位)。
  • 除DEC不影响CF标志外,其余指令6个状态标志均据结果置位。
  • NEG求补运算,等价于用0减去操作数。
      • 其对标志位的影响,由0减去该操作数的过程决定。
slide27

2D04H 0010 1101 0000 0100

  • - 3AB0H - 0011 1010 1011 0000
  • 1 1 1111 1 1 111
  • F254H 1111 0010 0101 0100

例1 减法指令:编程完成 2D04H – 3AB0H

MOV AX ,2D04H

SUB AX ,3AB0H

借位

  • 执行后:
    • (AX)=0F254H CF=1,OF=0,SF=1,ZF=0
slide28

0546 7A70H

  • - F001 A543H

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

MOV AX,7A70H

SUB AX,A543H

MOV BX,0546H

SBB BX,0F001H

slide29

00 H

- 01 H

11

FFH

  • 例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

slide30

00 H 0000 0000 B

- 80 H - 1000 0000 B

1 1

80H 1000 0000B

  • 例4 求补指令:MOV AH, 80H
      • NEG AH

执行后:

(AL)=80H , CF=1,OF=1,ZF=0,SF=1

slide31

例5:求绝对值

在内存中,

从AREA1开始存放100个带符号数。

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

流程图

slide32

程序:

LEA SI, AREA1

LEA DI, AREA2

MOV CX, 100

CHECK: MOV AL, [SI]

OR AL, AL ;(AL)内容不变,置标志

JNS NEXT ;SF=0转NEXT

NEG AL ;负数求补

NEXT: MOV [DI], AL ;送目标

INC SI

INC DI

DEC CX

JNZ CHECK

HLT

负数的真值和它的补码互为补(本位和为0)。

slide33

CF= 1 A低于B

  • CF= 0 A高于或等于B
  • CF=1或 ZF=1 A低于等于B
  • CF=0且 ZF=0 A高于B

比较指令:

CMP oprd1, oprd2 ; (oprd1) - (oprd2)

  • 比较指令CMP,进行两操作数相减操作,

但只影响标志值,不影响操作数(减的结果不保存)

  • 利用CMP执行后的标志值,比较两操作数之间的关系

CMP A, B

  • ① 据ZF判断两数是否相等

ZF=1 两数相等, A = B ;

ZF=0 两数不等, A ≠ B

  • ② 据ZF和CF判断两无符号数关系
slide34

条件转移指令

判断条件

JB

next

CF = 1

低于

JBE

next

CF = 1

ZF = 1

低于或等于

JA

next

CF = 0

ZF = 0

高于

JAE

next

CF = 0

高于或等于

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

  • CMP AX, BX ;比较
          • JAE above ;高于或等于则跳转
          • XCHG AX, BX ;低于则交换
    • above: 、、、

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

slide35

CMP A,B

  • 例 将AX和BX中较大的带符号数,存于AX中
        • CMP AX, BX ;比较
        • JGE great ;大于或等于则跳转
        • XCHG AX, BX ;小于则交换
  • great: 、、、
slide36

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

  • 若自BLOCK开始的内存缓冲区中,有100个带符号数。
  • 找出最大值。并存放到MAX单元中。
  • 思路:
    • 第一个数取出( AX),
    • 取出第二个数(第二个字单元内容)与(AX)比较 :
  • (AX)>第二个数,不做交换,
  • 否则,(第二个字单元内容)  (AX)。
    • 再取第三个数,
    • 经过99次比较,在(AX)中得到最大数。
slide37

编程:

MOV BX,OFFSET BLOCK

MOV AX,[BX]

INC BX

INC BX

MOV CX,99

AGAIN:CMP AX,[BX]

JG NEXT;(AX) >(16(ds)+(BX))转NEXT

MOV AX,[BX]

NEXT: INC BX

INC BX

DEC CX

JNE AGAIN

MOV MAX,AX ;MAX单元存放最大值

slide38

指令格式

执行操作

src

为字节类型:

(

AX

)

(

AL

)

(src)

×

src

为字类型:

MUL

src

(

DX

)

(

AX

)

(

AX

)

(src)

×

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

乘的结果也为无带符号数

MUL

执行的操作与

相似

I

MUL

src

,

将被乘数、乘数看作带符号数

进行乘运算

乘的结果也为带符号数

3. 乘法指令

无符号数乘法

带符号数乘法

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

slide39

指令格式

执行操作

(src)

为字节类型:

(

A

L)

(

A

X)

/

(src)

的商

(

AH

)

(

A

X)

/

(src)

的余数

(src)

为字类型:

DIV

src

(

AX

)

(D

X

)

,(

AX

)

/

(src)

的商

无符号数除法

(DX)

(DX

)

, (

A

X)

/

(src)

的余数

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

商、余数也为无符号数

DIV

执行的操作与

相同,

IDIV

src

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

带符号数除法

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

4. 除法指令

slide40

指令格式

执行操作

(

AL

)

AH

的符号扩展到

CBW

(

AL

)

D7=0

(

AH

)

=0

0H

D7=1

(

AH

)

=FFH

(

AX

)

D

X

的符号扩展到

CWD

(AX

)

D15=0

(

DX

)

=0

000H

D15=1

(

DX

)

=FFFFH

5. 符号扩展指令

slide41

6、调整指令

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

但人们常用的是十进制。

当用计算机进行计算时:

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

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

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

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

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

slide42

8088中有六条调整指令:

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

算术运算指令复习

二进制运算

十进制调整

ADD, ADC, INC

AAA,

DAA

SUB, SBB, DEC, NEG, CMP

AAS,

DAS

MUL, IMUL

AAM

DIV, IDIV

AAD

CBW

CWD

符号扩展指令:

slide44

作业:

41,48,53

ad