第5章 80X86指令系统-传送指令(3-4)

发布于:2021-10-03 07:09:54

第五章

8086/8088指令系统 指令系统

§1 8086/8088的寻址方式 8086/8088的寻址方式 §2 8086/8088的指令系统 8086/8088的指令系统 §3 80X86/Pentium指令系统 80X86/Pentium指令系统

1

8086/8088的指令系统 §2 8086/8088的指令系统
8086/8088的指令系统中共有 种基本指令. 的指令系统中共有92种基本指令 的指令系统中共有 种基本指令. 可以分成6个功能组: 可以分成 个功能组: 个功能组
1. . 2. . 3. . 4. . 5. . 6. . 数据传送(Data transfer) 数据传送 算术运算( 算术运算(Arithmetic) ) 逻辑运算和移位指令(Logic& Shift) 逻辑运算和移位指令 串操作(String manipulation) 串操作 控制转移( 控制转移(Control Transfer) ) 处理器控制( 处理器控制(Processor Control) )

2

8086/8088的指令系统 8086/8088的指令系统

数据传送指令(Data 一, 数据传送指令

transfer)

通用传送指令( (一)通用传送指令(General Purpose Transfer) ) 目的地址传送指令( (二)目的地址传送指令(Address-object Transfer) 标志传送指令( (三)标志传送指令(Flag register transfer) 输入输出指令( (四)输入输出指令(Input and Output)

3

一. 数据传送指令
功能: 功能: 负责把数据,地址或立即数 送到寄存器或存储单元 寄存器或存储单元. 负责把数据,地址或立即数传 送到寄存器或存储单元. 特点: 特点: 它是计算机最基本,最重要的一种操作,使用比例最高. 它是计算机最基本,最重要的一种操作,使用比例最高. 种类(分四种 : 种类 分四种): 分四种 通用传送指令包括: MOV, PUSH, POP ,XCHG, XLAT. 通用传送指令包括: MOV, PUSH, XLAT. 目的地址传送指令包括: LEA, LDS, LES 目的地址传送指令包括: 标志传送指令包括 : LAHF, SAHF, PUSHF, POPF 输入输出指令指令包括: IN, OUT. 输入输出指令指令包括: OUT. 指令外, 除 SAHF和POPF指令外,对标志位没有影响. 和 指令外 对标志位没有影响.
4

(一)通用传送指令(General Purpose Transfer) 通用传送指令( )
8088提供方便灵活的通用的传送操作,适用于大多数操作数. 提供方便灵活的通用的传送操作,适用于大多数操作数. 提供方便灵活的通用的传送操作 通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操 以外) 通用传送指令(除了XCHG以外 作数指令. 作数指令.

通用传送指令包括: 通用传送指令包括:
1,MOV (Movement) , 2,PUSH (Push word onto stack) , POP (Pop word off stack) 3,XCHG (Exchange) , 4,XLAT (Translate) ,
5

1. .

MOV dest,

src ;

dest ← src 目的 ← 源

目的 源 功能: 功能:

把一个字节(B)或一个字( )操作数由源传送至目的. 把一个字节 或一个字(W)操作数由源传送至目的. 或一个字 寄存器/存储器之间 存储器之间; 寄存器 寄存器 存储器之间; 立即数→寄存器/存储器 立即数→寄存器/存储器 寄存器/存储器段寄存器之间的数据传送. 寄存器 存储器段寄存器之间的数据传送. 存储器

实现 实现:

6



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

① CPU内部寄存器之间的数据的任意传送 内部寄存器之间的数据的任意传送 和指令指针IP以外 (除代码段寄存器CS和指令指针 以外). 除代码段寄存器 和指令指针 以外). 段寄存器之间不能传送. 段寄存器之间不能传送.
例: MOV DL,CH , MOV AX,DX , MOV SI, BP , 通用寄存器→ ;通用寄存器→ 段寄存器 ;段寄存器 →通用寄存器
7

; 8位寄存器→ 8位寄存器 位寄存器→ 位寄存器 位寄存器 ; 16位寄存器→ 16位寄存器 位寄存器→ 位寄存器 位寄存器

MOV DS,BX , MOV AX, CS

立即数传送至CPU内部通用寄存器组 ② 立即数传送至 内部通用寄存器组 (AX,BX,CX,DX,BP,SP,SI,DI). , , , , , , , ). 用于给寄存器赋初值. 用于给寄存器赋初值. 不能直接给段寄存器赋值 例: MOV CL,04H , MOV AX,03FFH , ;立即数→8位寄存器 立即数→ 位 ;立即数→16位寄存器 立即数→ 位

8

内部寄存器( ③ CPU内部寄存器(除CS和IP外) 内部寄存器 和 外 与存储器(所有寻址方式)之间数据传送. 与存储器(所有寻址方式)之间数据传送. 可以实现一字节或一个字的传送. 可以实现一字节或一个字的传送. 存储单元之间不能直接传送
例: MOV MEM , AX MOV MEM ,DS MOV DISP[BX] ,CX ; 累加器→存储器,直接寻址 累加器→存储器,直接寻址 段寄存器→存储器, ;段寄存器→存储器,直接寻址 寄存器→存储器, ;寄存器→存储器,变址寻址 存储器→累加器, ;存储器→累加器,变址寻址 存储器→段寄存器, ;存储器→段寄存器,直接寻址 存储器→累加器, ;存储器→累加器,相对基址加变址
9

MOV AX , DISP [SI] MOV DS , MEM MOV CX , DISP [BX] [SI]

2. PUSH (Push word onto stack) . POP (Pop word off stack) 这是两条堆栈操作指令. 这是两条堆栈操作指令. (1) 先介绍一下什么是堆栈,为什么需要堆栈 先介绍一下什么是堆栈, 堆栈——按照先进后出原则组织的一段内存区域, 按照先进后出原则组织的一段内存区域, 堆栈 按照先进后出原则组织的一段内存区域 特点: 特点: 下推式的(规定堆栈设置在堆栈段内)改变 的内容 的内容, 下推式的(规定堆栈设置在堆栈段内)改变SP的内容, 随着推入堆栈内容增加, 的值减少 的值减少. 随着推入堆栈内容增加,SP的值减少. 推入堆栈内容增加 先进后出工作原则(Last In First Out 简称 先进后出工作原则( 简称LIFO) 堆栈在内存中的情况
10



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

可以用一条立即数传送指令给 赋值,确定SP在SS段 可以用一条立即数传送指令给SP赋值,确定 在 段 用一条立即数传送指令给 赋值 中的初始位置. 中的初始位置. 偏移地址 物理地址 例: 堆栈段为64KB 设: SS =9000H , 堆栈段为 MOV SP,0E200H ; SP = 0E200H 则:
(SP)=E200H 9E200H 0000H ... 00000H 低地址) 00000H(低地址) 90000H

堆 栈 段

整个堆栈段的物理地址范围为: 整个堆栈段的物理地址范围为: 90000H~9FFFFH 栈顶的物理地址为: 栈顶的物理地址为:9E200H 堆栈在内存中的情况如右图所示: 堆栈在内存中的情况如右图所示:
... FFFFH 9FFFFH

11

堆栈在内存中的情况

堆栈用途:
存放CPU寄存器或存储器中暂时不使用的数据, 存放CPU寄存器或存储器中暂时不使用的数据, 寄存器或存储器中暂时不使用的数据 使用数据时将其弹出; 使用数据时将其弹出; 调用子程序, 响应中断时都要用到堆栈. 调用子程序, 响应中断时都要用到堆栈. 调用子程序(或过程)或发生中断时要保护断点的地址, 调用子程序(或过程)或发生中断时要保护断点的地址, 保护断点的地址 子程序或中断返回时恢复断点. 子程序或中断返回时恢复断点.

12

注意: 堆栈指针,始终指向栈顶 注意:SP——堆栈指针 始终指向栈顶. 堆栈指针 始终指向栈顶. SP初值用 初值用MOV SP,i m来设定. 初值用 , 来设定.

13

(2)

堆栈操作指令 (堆栈操作指令有两条 : 堆栈操作指令有两条): 堆栈操作指令有两条 ; SP ← SP - 2 (SP+1),(SP) ← src 把一个字从源操作数→ SP指向堆栈顶部 把一个字从源操作数→由SP指向堆栈顶部. 指向堆栈顶部. 操作如:PUSH 操作如: AX dest ← (SP+1),(SP) SP ← SP+2

入栈指令 格式: 格式:PUSH src

出栈指令 格式: 格式:POP dest ;

把现行SP所指向堆栈顶部的一个字 把现行SP所指向堆栈顶部的一个字 → 指定的目的操作数, 指定的目的操作数, 同时进行修改堆栈指针的操作. 同时进行修改堆栈指针的操作. 操作如: 操作如: POP BX
14

应用时注意: 应用时注意: 堆栈操作都按字操作. 堆栈操作都按字操作. PUSH , POP 指令的操作数可能有三种: 指令的操作数可能有三种: 寄存器(通用寄存器,地址指针,变址寄存器) 寄存器(通用寄存器,地址指针,变址寄存器), 段寄存器(CS除外,PUSH CS 合法,POP CS 非法), 除外, 合法, 非法) 段寄存器 除外 存储器. 存储器. 执行PUSH 指令 指令, 执行 SP-2 → SP,

低字节放在低地址,高字节放在高地址. 低字节放在低地址,高字节放在高地址. 随着推入堆栈内容增加,堆栈就扩展, 的值减少 的值减少, 随着推入堆栈内容增加,堆栈就扩展,SP的值减少, 总是指向栈顶, 但SP总是指向栈顶, 总是指向栈顶 堆栈工作原则后进先出. 堆栈工作原则后进先出. 后进先出 PUSH ,POP指令应该成对使用,保持堆栈原有状态. ,POP指令应该成对使用 保持堆栈原有状态. 指令应该成对使用, 堆栈最大容量即为 的初值与SS之间的差. 堆栈最大容量即为SP的初值与 之间的差 的初值与 之间的差.
15

16

17

调用子程序(或过程)或发生中断时要保护断点的地址, 调用子程序(或过程)或发生中断时要保护断点的地址, 子程序或中断返回时恢复断点. 子程序或中断返回时恢复断点.
主 程 序 子 程 序 1 断点2 断点2

...

断点1 断点1

子 程 序 2 弹出 断点2 断点2
(SP)

后 压 入 先 压 入

断点2 断点2(L) 断点2 断点2(H) 断点1(L) 断点1 断点1 断点1(H)

先 弹 出 后 弹 出

堆 栈 段

弹出 断点1 断点1

...

子程序嵌套

断点地址压入和弹出情况
18

堆栈应用举例: 堆栈应用举例:
例 : 压入堆栈的内容 与弹出内容顺序相反 … PUSH AX PUSH BX PUSH CX … POP CX POP BX POP AX BP的基址指令 例:用BP的基址指令 代替POP指令 代替POP指令 … MOV BP,SP PUSH AX PUSH BX PUSH CX … MOV CX,[BP-6] MOV BX,[BP-4] MOV AX,[BP-2] … ADD SP, 6
19

3,交换指令(Exchange) 交换指令(
格式: 格式:XCHG dest , src 执行操作: 执行操作: 把一个字节或一个字的源操作数与目的操作数相交换. 把一个字节或一个字的源操作数与目的操作数相交换. 可以实现: 寄存器之间 可以实现: 寄存器和存储器之间 ; dest src

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

应用举例: 应用举例:
XCHG BL,DL XCHG AX,SI XCHG COUNT[DI], AX (错) 错 (错) 错

XCHG XCHG

[BX],[DI] DS, AX

21

4. XLAT(Trans late)换码指令:该指令不影响标 XLAT( late)换码指令: 志位. 志位. 格式: 格式: XLAT str_table; AL ← (BX +AL) ; ) XLAT指令使用方法: XLAT指令使用方法: 指令使用方法
先建立一个字节表格; 先建立一个字节表格; 表格首偏移地址存入BX; 表格首偏移地址存入BX; 需要转换代码的序号(相对与表格首地址位移量)存入 需要转换代码的序号 相对与表格首地址位移量) 代码的序号( AL; (表中第一个元素的序号为 ) AL; 表中第一个元素的序号为0) 执行XLAT指令后,表中指定序号的元素存于AL中. 执行XLAT指令后,表中指定序号的元素存于AL中 指令后 (AL)为转换的代码. 为转换的代码. 为转换的代码
22

XLAT指令应用: XLAT指令应用: 指令应用
若把数字 数字0~9转换成 段数码所需要的相应代码(字形码) 转换成7段数码所需要的相应代码 例: 若把数字 转换成 段数码所需要的相应代码(字形码) 就要用XLAT指令. 指令. 就要用 指令 假设这段数据存放在偏移地址为2000H的内存中,取出"3" 的内存中,取出" 假设这段数据存放在偏移地址为 的内存中 所对应的数码,用如下几条指令即可: 所对应的数码,用如下几条指令即可:

23

执行指令序列: 执行指令序列
MOV BX,2000H , MOV AL,03H , XLAT
0 1 2 3 01000000 01111001 00100100 00110000 ... 8 9 00000000 00010000

7段数码显示表 段数码显示表

24

(二)目的地址传送指令(Address-object transfer) 目的地址传送指令( 8086 /8088 提供三条 提供三条: 地址指针写入指定寄存器

1,LEA(Load Effective Address) , 2,LDS (Load pointer using DS) , 3,LES (Load pointer using ES) ,

25

1,LEA LEA(Load Effective Address)
格式: LEA reg16 , mem16 ;EA→ reg16 格式: → 功能:加载有效地址,用于写*地址指针. 功能:加载有效地址,用于写*地址指针. 把指令中指定的存储器操作数有效地址 把指令中指定的存储器操作数有效地址装入指定的寄存器 . 存储器操作数有效地址装入指定的寄存器

例:设 BX=0400H, SI =003CH , LEA BX,[BX+SI+0F62H] , 执行指令后: 执行指令后: EA= BX + SI +0F62H=0400H+003CH+0F62H=139EH BX =139EH
26

LEA 指令与 指令与MOV 的区别 LEA BX , [1000] MOV BX , [1000]

; BX = 1000H ; BX = 0040H

27

2,LDS (Load pointer using DS)
格式: 格式:LDS ; reg16 ←(EA) ( ) DS ←( EA+2) ( ) 功能:将指令指定32位地址指针送指令指定寄存器和 . 位地址指针送指令指定寄存器和DS 功能:将指令指定32位地址指针送指令指定寄存器和DS. 将指令指定mem32单元的前两个单元内容 位偏移量)装入指 将指令指定 单元的前两个单元内容(16位偏移量 装入指 单元的前两个单元内容 位偏移量 定通用寄存器,把后两个单元内容(段地址 装入到DS段寄存 段地址) 定通用寄存器,把后两个单元内容 段地址 装入到 段寄存 器.

reg16, mem32

28

例: 假设: 假设: DS =C000H
(DS) 存储器 ... 80H 01H 00H 20H ...

指令: 指令 LDS SI, [0010H]

C000H:0010H C0011H

执行指令后: 执行指令后 SI =0180H DS=2000H

C0012H C0013H

29

3,LES (Load pointer using ES)
格式: 格式:LES reg16, mem32 ; reg16 ←(EA) ( ) ES ←(EA+2) ( )

功能:把源操作数指定的4 功能:把源操作数指定的4个相继字节送指令指定的寄存器 ES寄存器中 寄存器中. 及ES寄存器中. 此指令常常指定DI寄存器. 此指令常常指定 寄存器. 寄存器 将指令指定mem32单元的前两个单元内容 位偏移量 装入 单元的前两个单元内容(16位偏移量 将指令指定 单元的前两个单元内容 位偏移量)装入 指定通用寄存器,把后两个单元内容(段地址 装入到ES段 段地址) 指定通用寄存器,把后两个单元内容 段地址 装入到 段 寄存器. 寄存器.

30

例: 假设: DS =B000H 假设: BX =080AH

存储器 (DS) (BX) ... A2H 05H 00H 40H ...
31

指令: 指令 LES DI, [BX]

B000H:080AH B080BH

执行指令后: 执行指令后 DI =05A2H ES =4000H

B080CH B080DH

(三)标志传送指令(Flag register transfer) 标志传送指令( ) 采用了隐含寄存器( , 操作数方式. 采用了隐含寄存器(AH,Flags)操作数方式. 操作数方式

8086有四条标志传送操作指令: 有四条标志传送操作指令: 有四条标志传送操作指令
1. . 2. . 3. . 4. . LAHF(Load AH from flags) ( ) SAHF(Set AH into flags) ( ) PUSH F(Push flags onto stack) ) ( POP F(Pop flags off stack) ) (

32

1.LAHF(Load AH from flags) LAHF( )
格式: 格式:LAHF ; AH← PSW的低字节 的低字节 功能:标志寄存器低八位 → AH 功能:

7 AH FLAGS 15 14 13 12 11 10 9 8 7

6

5

4

3

2

1

0

6

5

4 AF

3

2 PF

1

0 CF

OF DF IF TF SF ZF

LAHF指令操作图示意 指令操作图示意
33

2. .

SAHF(Set AH into flags) ( ) 格式: 格式:SAHF ; PSW的低字节 ← AH 的低字节 功能:( )送标志寄存器低八位. 功能:(AH)送标志寄存器低八位. :(

3. .

PUSHF(Push flags onto stack) ( ) 格式: 格式:PUSHF ; SP ← SP -2

(SP + 1 ),( )← PSW ),(SP) 标志进栈. 功能 : 标志进栈. 4. . POPF(Pop flags off stack) ( ) 格式:POP F ; PSW ←(SP+1),( ) 格式: ( ),(SP) ),( SP ← SP + 2 标志出栈. 功能 :标志出栈.
34

注意: 注意: (1) 标志位的影响 ) LAHF,PUSHF不影响标志位 , 不影响标志位, 不影响标志位 SAHF,POPF由装入的值确定标志位的值, 即影响标志位. , 由装入的值确定标志位的值, 由装入的值确定标志位的值 即影响标志位. 用于保护调用过程前( (2)PUSHF,POPF用于保护调用过程前(PSW),过程返回后 ) , 用于保护调用过程前 过程返回后 恢复. 恢复. 例:
… PUSH AX PUSH CX PUSH F CALL TRANS POPF POP CX POP AX …
35

(四)输入输出指令(Input and Output) 输入输出指令(
输入输出指令共两条: 输入输出指令共两条: 1,IN (Input byte or word) 2 ,OUT (Output byte or word)

输入指令用于 从外设端口接受数据, 输入指令用于CPU从外设端口接受数据, 用于 从外设端口接受数据 输出指令用于 向外设端口发送数据. 输出指令用于CPU向外设端口发送数据. 用于 向外设端口发送数据

无论接受还是发送数据,必须通过累加器 字节), 无论接受还是发送数据,必须通过累加器AX(字)或AL(字节), 字 字节 又称累加器专用传送指令 . 输入,输出指令不影响标志位. 输入,输出指令不影响标志位.
36

1,IN (Input byte or word)
格式: 格式:IN acc, port

输入指令

; acc ← (port)

具体形式有四种: 具体形式有四种: IN AL, 50H IN AX, 50H IN AL, DX IN AX, DX ; 50H端口字节读入 端口字节读入AL 端口字节读入 端口字节读入AX ;50H,51H端口字节读入 , 端口字节读入 ;端口地址16位,输入一个字节 端口地址 位 ;端口地址16位,输入一个字 端口地址 位

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

37

2 ,OUT OUT(Output byte or word)
格式: 格式: OUT port, acc

输出指令

;(port) ← acc

具体形式有四种: 具体形式有四种: OUT 50H , AL ; 端口地址 位,输出一个字节 端口地址8位 OUT 50H, AX ;端口地址 位,输出一个字 端口地址8位 OUT DX , AL ;端口地址16位,输出一个字节 端口地址 位 OUT DX , AX ;端口地址16位,输出一个字 端口地址 位

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


相关推荐

最新更新

猜你喜欢