37
1 第第第 8086/8088 第第第第复复 7 复复复复复 1. 复复复复复 MOV AX,09A0H 2. 复复复复复 MOV AX,BX 3. 复复复复 MOV AX,(09A0H) 4. 复复复复复复复 MOV AX,[BX] 5. 复复复复复复复复复复 MOV AX,[BX+55H] 6. 复复复复复复复 MOV [BX+SI] , AX 7. 复复复复复复复复复复 MOV 55H[BX+SI] , AX

第四讲 8086/8088 的指令系统

  • Upload
    dacia

  • View
    123

  • Download
    0

Embed Size (px)

DESCRIPTION

第四讲 8086/8088 的指令系统. 复习 7 种寻址方式 1. 立即数寻址 MOV AX,09A0H 2. 寄存器寻址 MOV AX,BX 3. 直接寻址 MOV AX,(09A0H) 4. 寄存器间接寻址 MOV AX,[BX] 5. 相对的寄存器间接寻址 MOV AX,[BX+55H] 6. 基址加变址寻址 MOV [BX+SI] , AX 7. 相对的基址加变址寻址 MOV 55H[BX+SI] , AX. 第一部分指令系统概述 8086/8088 的指令系统中共有 92 种基本指令。 - PowerPoint PPT Presentation

Citation preview

Page 1: 第四讲 8086/8088 的指令系统

1

第四讲 8086/8088 的指令系统

复习 7 种寻址方式1. 立即数寻址 MOV AX,09A0H

2. 寄存器寻址 MOV AX,BX

3. 直接寻址 MOV AX,(09A0H)

4. 寄存器间接寻址 MOV AX,[BX]

5. 相对的寄存器间接寻址 MOV AX,[BX+55H]

6. 基址加变址寻址 MOV [BX+SI] , AX

7. 相对的基址加变址寻址 MOV 55H[BX+SI] , AX

Page 2: 第四讲 8086/8088 的指令系统

2

第一部分 指令系统概述8086/8088 的指令系统中共有 92 种基本指令。

可以分成 6 个功能组:1 . 数据传送 (Data transfer)

2 . 算术运算( Arithmetic )

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

4 . 串操作 (String manipulation)

5 . 控制转移( Control Transfer )

6 . 处理器控制( Processor Control )

Page 3: 第四讲 8086/8088 的指令系统

3

介绍指令系统使用的符号:八位寄存器 : AH , AL , BH ,B H , BL , CH , CL , DH ,DL

十六位通用寄存器 : AX , BX , CX , DX , SP , BP , SI ,DI

堆栈指针 SP

指令指针 IP (或 PC )

标志位 Flags

目的和源变址寄存器 DI, SI

段寄存器 CS, DS, ES, SS

Page 4: 第四讲 8086/8088 的指令系统

4

src , dest 源,目的操作数(下列寻址方式都可以用)

[BX+SI+n] , [BX+DI+n] , [BP+SI+n] , [BP+DI+n]

[SI+n] , [DI+n] , [BP+n] , [BX+n]

[N] , r

[ ] 存储器单元的内容 ( 正常在数据段 )

ES:[ ] 附加存储器段的内容

OPRD 操作数

Seg 段寄存器( CS , DS , ES , SS )

i m 立即数 (n 8 位 , nn 16 位 , nnnn 32 位 )

Page 5: 第四讲 8086/8088 的指令系统

5

8086/8088 指令助记符表 ( 自学) 指令类型 助记符

通用传送 MOV, PUSH, POP, XCHG, XLAT

地址传送 LEA, LDS, LES

标志传送 PUSHF, POPF, LAHF, SAHF

数据传送 输入输出 IN, OUT

加法 ADD, ADC, INC, AAA, DAA

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

乘法 MUL, IMUL, AAM

除法 DIV, IDIV, AAD

算术运算

符号扩展 CBW, CWD

逻辑运算 AND, TEST, OR, XOR, NOT

移位 SHL, SAL, SHR, SAR逻辑操作 循环移位 ROL, ROR, RCL, RCR

自学

Page 6: 第四讲 8086/8088 的指令系统

6

指令类型 助记符串操作 MOVS,CMPS,SCAS,LODS,STOS串

处理 重复控制 REP,REPE/REPZ,REPNE/REPNZ

无条件转移 JMP

条件转移

JE/JZ, JNE/JNZ, JS, JNS, JO, JNO

JP, JNP, JC, JNC, JCXZ

JA/JNBE, JAE/JNB, JB/JNAE, JBE/JNA

JG/JNLE, JGE/JNL, JL/JNGE, JLE/JNG

循环控制 LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ

过程调用 CALL, RET

控制转移

中断指令 INT, INTO, IRET

处理机控制CLC, STC, CMC,CLD, STD, CLI, STI

NOP, HLT, WAIT, ESC, LOCK

自学

Page 7: 第四讲 8086/8088 的指令系统

7

第二部分 8086/8088 指令系统

一、 数据传送指令 (Data transfer)

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

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

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

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

Page 8: 第四讲 8086/8088 的指令系统

8

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

8088 提供方便灵活的通用的传送操作,适用于大多数操作数。

通用传送指令(除了通用传送指令(除了 XCHGXCHG 以外)是唯一允许以段寄存器为操以外)是唯一允许以段寄存器为操作数指令。作数指令。

通用传送指令包括:1 、 MOV ( Movement)

2 、 PUSH (Push word onto stack)

POP (Pop word off stack)

3 、 XCHG (Exchange)

4 、 XLAT (Translate)

Page 9: 第四讲 8086/8088 的指令系统

9

1 . MOV dest, src ; (dest) (src)

目的 源 目的 源

功能:功能: • 把一个字节 (B) 或一个字( W )操作数由源传送至目的。• 实现 : 寄存器 寄存器 / 存储器之间;

立即数寄存器 / 存储器

寄存器 / 存储器段寄存器之间的数据传送。

Page 10: 第四讲 8086/8088 的指令系统

10

具体说,通用数据传送指令能实现:

① CPU 内部寄存器之间的数据的任意传送

(除了码段寄存器 CS 和指令指针 IP 以外)。

段寄存器之间不能传送。段寄存器之间不能传送。例:

MOV DL , CH ; 8 位寄存器 8 位寄存器

MOV AX , DX ; 16 位寄存器 16 位寄存器

MOV SI , BP

MOV DS , BX ;通用寄存器 段寄存器

MOV AX, CS ;段寄存器 通用寄存器

Page 11: 第四讲 8086/8088 的指令系统

11

② 立即数传送至 CPU 内部通用寄存器组

( AX 、 BX 、 CX 、 DX 、 BP 、 SP 、 SI 、 DI )。

用于给寄存器赋初值。

不能直接给段寄存器赋值不能直接给段寄存器赋值

例:

MOV CL , 04H ;立即数 8 位寄存器

MOV AX , 03FFH ;立即数 16 位寄存器

PTR PTR :属性定义符号,符号后面的变量(或地址单元)有:属性定义符号,符号后面的变量(或地址单元)有符号前面的属性符号前面的属性

MOV WORD PTR [ SI] , 057BH ;立即数存储器

MOV BYTE PTR MEM, 5 ;立即数存储器

Page 12: 第四讲 8086/8088 的指令系统

12

③ CPU 内部寄存器(除 CS 和 IP 外)

与存储器(所有寻址方式)之间数据传送。

可以实现一字节或一个字的传送。

存储单元之间不能直接传送存储单元之间不能直接传送 例:

MOV MEM , AX ; 累加器存储器 , 直接寻址

MOV MEM ,DS ;段寄存器存储器,直接寻址

MOV DISP[BX] ,CX ;寄存器存储器,变址寻址

MOV AX , DISP [SI] ;存储器累加器,变址寻址

MOV DS , MEM ;存储器段寄存器,直接寻址

MOV CX , DISP [BX] [SI] ;存储器累加器,相对基址加变址

Page 13: 第四讲 8086/8088 的指令系统

13

注意注意::

(( 11 )不能用一条)不能用一条 MOVMOV 指令实现以下传送。指令实现以下传送。

存储单元之间的传送存储单元之间的传送

MOV MEM2 , MEM1 错。

MOV AX , MEM1MOV MEM2 , AX 对。

立即数送段寄存器立即数送段寄存器

例 : MOV DS , 2000H 错。

MOV AX, 2000HMOV DS , AX 对。

Page 14: 第四讲 8086/8088 的指令系统

14

段寄存器之间的传送段寄存器之间的传送

MOV ES , DS ; 错

MOV AX , DSMOV ES , AX ; 对 。

注意注意 CSCS 和和 IPIP 的使用的使用 CSCS 和和 IPIP 不能作为目标操作数,不能作为目标操作数, CSCS 可以作为源操作可以作为源操作

数。数。

例: MOV CS , AX ; 错

MOV AX , CS ; 对 。

MOV IP, AX ; 错

MOV AX , IP ; 错。

Page 15: 第四讲 8086/8088 的指令系统

15

注意操作数的范围

对字节操作指令 0 ~ FFH 0 ~ 255

对字操作指令 0 ~ FFFFH 0 ~ 65535

MOV AL , 260

MOV AX , 70000

MOV AL, 1FFH

MOV AL, 2ABCDH

Page 16: 第四讲 8086/8088 的指令系统

16

注意如下指令:

① 不能两个同为存储器操作数 MOV [ DI ] , [ SI ]

② 目的操作数不能是立即数 ADD 3 , AL ③ 两个操作数的类型应相同 SUB AX , BL

若 value 定义为字类型存储器变量:

MOV CL, value [ BX ]

Page 17: 第四讲 8086/8088 的指令系统

17

(后面跟立即数时)内存操作数的属性应明确。

MOV [ BX ] , 0

MOV byte ptr [ BX ] , 0

MOV word ptr [ BX ] , 0

MOV [ BX ] , AL

MOV [ BX ] , AX

Page 18: 第四讲 8086/8088 的指令系统

18

A 、 B 、 C 、 D 、 E 、 F 开头的十六进制数前面加 0 ,

与 H 结尾的标识符区别。

如 寄存器名: AH 、 BH 、 CH 、 DH

变量名 : abcdH 等

例 mov AL, 0AH

mov AL, AH

mov BX, 0abcdH

Page 19: 第四讲 8086/8088 的指令系统

19

CS 和 IP 的值只在控制转移指令中修改。

对非控制转移指令,取完指令后 IP 值自动 +1 , 指向下条指令。

段寄存器 CS 的值,只在 MOV 、 PUSH 中可作操作数, 且这两条指令执行结果不改变 CS 值。

MOV AX, CS

PUSH CS

IP 、 FR 两个寄存器不能作为操作数在指令中出现。mov IP , 1234H

mov FR , 0F0FH

FR 状态寄存器的值由指令执行后确定, 不同的指令对各标志的影响不同。

Page 20: 第四讲 8086/8088 的指令系统

20

(( 22 )段地址的默认)段地址的默认

BX 、 SI 、 DI 间址默认段地址为 DS ,

BP 间址默认段地址 SS 。

(( 33 ))凡是遇到给凡是遇到给 SSSS 赋值指令,系统自动禁止外部中断,执行赋值指令,系统自动禁止外部中断,执行本条指令和下条指令,恢复对本条指令和下条指令,恢复对 SSSS 寄存器赋值前的中断开放情况。寄存器赋值前的中断开放情况。

这样做为了允许程序员连续用两条指令分别对 SS 和 SP寄存器赋值,同时又防止堆栈空间变动过程出现中断。

** 在修改在修改 SSSS 和和 SPSP 的指令之间不要插入其他指令。的指令之间不要插入其他指令。

(( 44 ))所有通用传送指令不影响标志位所有通用传送指令不影响标志位

(除 SAHF 、 POPF 以外)。

Page 21: 第四讲 8086/8088 的指令系统

21

2 . PUSH (Push word onto stack)

POP (Pop word off stack)

这是两条堆栈操作指令。

(1) (1) 先介绍一下什么是堆栈,为什么需要堆栈先介绍一下什么是堆栈,为什么需要堆栈

堆栈——按照先进后出原则组织的一段内存区域,

特点:特点:• 下推式的(规定堆栈设置在堆栈段内)改变 SP 的内容,

随着推入堆栈内容增加, SP 的值减少。• 先进后出工作原则( Last In First Out 简称 LIFO)

• 堆栈在内存中的情况:

(10月 20日课讲到此 )

Page 22: 第四讲 8086/8088 的指令系统

22

• 堆栈在内存中的情况:堆栈在内存中的情况:

例:

设: SS=2000H , SP= 40H,BX=2340H

运行 PUSH BX 后, SP=SP-2

堆栈在内存中的情况如右图所示:

堆栈在内存中的情况

...

...

偏移地址 物理地址

20000H

2003FH

堆栈段

2003EH

20040H40H

3FH

3EH

Page 23: 第四讲 8086/8088 的指令系统

23

堆栈用途堆栈用途::

存放存放 CPUCPU 寄存器或存储器中暂时不使用的数据,寄存器或存储器中暂时不使用的数据, 使用数据时将其弹出;使用数据时将其弹出;

调用子程序调用子程序 , , 响应中断时都要用到堆栈。响应中断时都要用到堆栈。

调用子程序(或过程)或发生中断时要保护断点的地址,

子程序或中断返回时恢复断点。

注意: SP—— 堆栈指针 ,始终指向栈顶。

SP 初值用 MOV SP , i m来设定。

Page 24: 第四讲 8086/8088 的指令系统

24

33 、交换指令、交换指令( Exchange)

格式: XCHG dest , src ;(dest) (src)

执行操作:

把一个字节或一个字的源操作数与目的操作数相交换。把一个字节或一个字的源操作数与目的操作数相交换。

可以 实现: 寄存器之间寄存器之间

寄存器和存储器之间寄存器和存储器之间

注意:• 存储器之间不能交换,两个操作数中必须有一个在寄存器;• 段寄存器不能作为一个操作数;• 允许字或字节操作,不影响标志位。

Page 25: 第四讲 8086/8088 的指令系统

25

应用举例:

XCHG BL,DLXCHG AX,SIXCHG COUNT[DI], AX

XCHG [BX],[DI] ( 错)XCHG DS, AX ( 错)

Page 26: 第四讲 8086/8088 的指令系统

26

4.4. XLATXLAT (( TranslateTranslate )换码指令:)换码指令:该指令不影响标志位。

格式: XLAT str_table ;( AL )←( BX +AL )

或 XLAT

str_table—— 表格符号地址(首地址),

只是为了提高可读性而设置,汇编时仍用 BX 。

Page 27: 第四讲 8086/8088 的指令系统

27

XLAT 指令使用方法:

• 先建立一个字节表格;• 表格首偏移地址存入表格首偏移地址存入 BXBX ;;• 需要转换需要转换代码的序号代码的序号(相对与表格首地址位移量)存入存入 AALL ; (表中第一个元素的序号为 0 )• 执行执行 XLATXLAT 指令后,表中指定序号的元素存于指令后,表中指定序号的元素存于 ALAL 中中。

(AL) 为转换的代码。

Page 28: 第四讲 8086/8088 的指令系统

28

XLATXLAT 指令应用:指令应用:

若把字符的扫描码转换成 ASCII 码;

或数字 0~9 转换成 7 段数码所需要的相应代码(字形码)等就要用 XLAT 指令。

例:内存的数据段中有一张十六进制数字的 ASCII 码表。

首地址为: Hex_table ,欲查出表中第 10 个元素(‘ A’)

Page 29: 第四讲 8086/8088 的指令系统

29

执行指令序列:MOV BX , OFFSET Hex_table

MOV AL , 0AH

XLAT Hex_table

假设:

( DS ) =F000H ,

Hex_table=0040H

( AL ) =0AH

执行 XLAT 以后:

( AL ) =41H= ( F004AH ),

即“ A” 的 ASCII 码。

30H

31H

32H

...

39H

41H

42H

...

46H

...

Hex_table

Hex_table+1

Hex_table+2

Hex_table+0AH

Hex_table+0BH

Hex_table+0FH 'F'

'B'

'A'

'9'

'1'

'2'

'0'

16 进制数的 ASCII 码表

Page 30: 第四讲 8086/8088 的指令系统

30

(二)输入输出指令(二)输入输出指令( Input and Output)输入输出指令共两条:

11 、、 ININ (Input byte or word)

2 2 、、 OUTOUT (Output byte or word)

输入指令用于 CPU从外设端口接受数据,

输出指令用于 CPU 向外设端口发送数据。

无论接受还是发送数据,必须通过累加器 AX( 字)或 AL( 字节),

又称累加器专用传送指令 。

输入、输出指令不影响标志位。输入、输出指令不影响标志位。

Page 31: 第四讲 8086/8088 的指令系统

31

每个外设要占几个端口:数据口,状态口和控制口。

CPUI/O设备

译码

数据端口DB

AB

CB

I/O接口

状态端口

控制端口

Page 32: 第四讲 8086/8088 的指令系统

32

信息交换要通过端口,信息交换要通过端口,在 IBMPC机里,可以配接许多外部设备,

每个外设与 CPU 之间交换数据,状态信息和控制命令,

每一种信息交换都要通过一个端口来进行。

端口数:外部设备最多有 65536 个 I/O端口。

A0~A15译码形成。

端口号:端口号(即外设端口地址)为 0000H~FFFFH 。

PC机仅使用 A0~A9译码形成 I/O口地址,即 1024H 个口地址

端口号: 0000H~03FFH

其中: A9=1 ,表示扩充槽上的口地址。

Page 33: 第四讲 8086/8088 的指令系统

33

长格式:长格式:

端口号中前端口号中前 256256 个端口(个端口( 0~FFH0~FFH )),可以直接写在指令中,这就是长格式。

端口号代替指令中的 PORT ,

机器指令用二字节表示,第二字节就是端口号。

短格式:短格式:

当端口号≥当端口号≥ 256256 时,只能使用短格式时,只能使用短格式,

必须先把端口号放到 DX 寄存器中。

不需要用任何段寄存器来修改它的值。

Page 34: 第四讲 8086/8088 的指令系统

34

11 、、 IN (Input byte or word) IN (Input byte or word) 输入指令输入指令

格式: IN acc, port ;(acc) (port)

具体形式有四种:

IN AL, data8 ; 端口地址 8 位,输入一个字节

IN AX, data8 ;端口地址 8 位,输入一个字

IN AL, DX ;端口地址 16 位,输入一个字节

IN AX, DX ;端口地址 16 位,输入一个字

必须通过累加器 AX( 字)或 AL( 节)输入数据。

Page 35: 第四讲 8086/8088 的指令系统

35

2 2 、、 OUTOUT(Output byte or word) 输出指令输出指令格式: OUT port, acc ;(port) (acc)

具体形式有四种:

OUT data8 , AL ; 端口地址 8 位,输出一个字节

OUT data8, AX ;端口地址 8 位,输出一个字

OUT DX , AL ;端口地址 16 位,输出一个字节

OUT DX , AX ;端口地址 16 位,输出一个字

必须通过累加器 AX( 字)或 AL( 节)输出数据。

Page 36: 第四讲 8086/8088 的指令系统

36

例 1 :实现 (29H) ( 28H )→( DATA_WORD )

IN AX , 28H

MOV DATA_WORD , AX

例 2 :从端口 3FCH 送一个字到 AX 寄存器

MOV DX , 3FCH

IN AX , DX ; ( AL )←( 3FCH ),

( AH )←( 3FDH )

例 3 :实现将( AL) →(05H)

OUT 5 , AL ;( 05H )←( AL )

Page 37: 第四讲 8086/8088 的指令系统

37

作业:

3.39 ( 1 ) ~ ( 6 ), 3.44 ,3.46