当前位置: 首页 > >

第四章 8086指令系统-2

发布时间:

8086的指令系统 8086的指令系统
8086的指令系统中共有 种基本指令,可以 的指令系统中共有92种基本指令 的指令系统中共有 种基本指令, 分成6个功能组 个功能组: 分成 个功能组: 1. 2. 3. 4. 5. 6. 数据传输 算术运算 逻辑运算和移位指令 程序转移 字符串操作(了解) 字符串操作(了解) 处理器控制(了解) 处理器控制(了解)
1

的符号: 介绍指令系统使用的符号: 八位寄存器: ,BH, , 八位寄存器 AH,AL,BH,B ,BL,CH,CL,DH,DL , , ,B , , , 十六位通用寄存器: 十六位通用寄存器 AX,BX,CX,DX,SP,BP,SI,DI , , , , , , , 堆栈指针 指令指针 标志位 目的和源变址寄存器 段寄存器 通用寄存器 SP IP(或PC) ( ) Flags DI, SI CS, DS, ES, SS r

AL或AX(取决于操作数长度 acc 或 取决于操作数长度) 取决于操作数长度
2

src , dest

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

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

[ ] ES:[ ] OPRD Seg im

存储器单元的内容(正常在数据段 存储器单元的内容 正常在数据段) 正常在数据段 附加存储器段的内容 操作数 段寄存器( , , , ) 段寄存器(CS,DS,ES,SS) 立即数 (n 8位, nn 16位, nnnn 位 位 32位 ) 位
3

§4.2 数据传送指令

功能: 负责把数据、地址或立即数传送到寄存器或存储单元。 功能: 负责把数据、地址或立即数传送到寄存器或存储单元。 寄存器或存储单元 特点: 它是计算机最基本、最重要的一种操作,使用比例最高。 特点: 它是计算机最基本、最重要的一种操作,使用比例最高。 种类(分四种) 种类(分四种): (一)通用传送指令 (二)目标地址传送指令 (三)标志位传送指令 (四)输入输出指令

4

(一)通用传送指令 8086提供方便灵活的通用的传送操作, 8086提供方便灵活的通用的传送操作,适用于大 提供方便灵活的通用的传送操作 多数操作数。 多数操作数。 通用传送指令(除了XCHG以外) 唯一允许以 通用传送指令(除了XCHG以外)是唯一允许以段 XCHG以外 允许以段 寄存器为操作数的指令 为操作数的指令。 寄存器为操作数的指令。 通用传送指令包括: 通用传送指令包括: 1、传输指令 MOV 2、堆栈操作指令 PUSH 3、交换指令 XCHG 4、换码指令 XLAT

POP

5

1. .

MOV

dest,src dest, src 目的 源

;

(dest) ← (src) 目的 ← 源

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

立即数→寄存器/ 立即数→寄存器/存储器 寄存器/存储器?段寄存器之间的数据传送。 寄存器/存储器?段寄存器之间的数据传送。

6

?

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

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

;

8位寄存器→ 8位寄存器→ 8位寄存器 位寄存器

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

立即数传送至CPU CPU内部通用寄存器组 ② 立即数传送至CPU内部通用寄存器组 用于给寄存器(AX、BX、CX、DX、BP、SP、 用于给寄存器(AX、BX、CX、DX、BP、SP、 SI、DI)赋初值。 SI、DI)赋初值。 不能直接给段寄存器赋值 例: MOV CL,04H CL, AX, MOV AX,03FFH MOV WORD 存储器 MOV BYTE PTR ;立即数→8位寄存器 立即数→ ;立即数→16位寄存器 立即数→16位 立即数→ [ SI] ,057BH ;立即数→ MEM, 立即数→ 5 ;立即数→存储器
8

PTR

CPU内部寄存器 内部寄存器( CS和IP外 与存储器( ③ CPU内部寄存器(除CS和IP外)与存储器(所有寻 址方式)之间数据传送。 址方式)之间数据传送。可以实现一字节或一个 字的传送。 字的传送。 存储单元(内存) 存储单元(内存)之间不能直接传送 例: MOV MOV MOV MOV MOV MEM , AX 累加器→存储器, ; 累加器→存储器,直接寻址

MEM ,DS;段寄存器→存储器,直接寻址 ,DS;段寄存器→存储器, ,CX;寄存器→存储器, [BX] ,CX;寄存器→存储器,变址寻址 [SI];存储器→累加器, AX , [SI];存储器→累加器,变址寻址 DS , MEM ;存储器→段寄存器,直接寻址 存储器→段寄存器, ;存储器→累加器,基 存储器→累加器,
9

MOV CX , [BX] [SI] 址加变址

? 注意: 注意:
(1)不能用一条MOV指令实现以下传送。 不能用一条MOV指令实现以下传送。 一条MOV指令实现以下传送 ①存储单元之间的传送 MOV MEM2 , MEM1 MOV AX , MEM1 MOV MEM2 , AX ②立即数送段寄存器 DS, 例 : MOV DS,2000H MOV MOV AX, 2000H DS , AX

错 对 对

错。


10

③ 段寄存器之间的传送 MOV ES , DS ; 错 MOV MOV AX , DS ES , AX

; 对 。

4 注意CS和IP的使用:CS和IP不能作为目标操作 注意CS IP的使用 CS和IP不能作为目标操作 CS和 的使用:
数,可以作为源操作数。 可以作为源操作数。 CS, 例: MOV CS,AX ; 错 MOV MOV MOV AX, AX,CS IP, AX ;对 ;对 。 ;错 ; 对。
11

AX, AX, IP

(2)段地址的默认 BX、SI、DI间址默认段地址寄存器为DS, BX、SI、DI间址默认段地址寄存器为DS, 间址默认段地址寄存器为DS BP间址默认段地址寄存器SS。 BP间址默认段地址寄存器SS。 间址默认段地址寄存器SS 了解】凡是遇到给SS赋值指令, SS赋值指令 (3)【了解】凡是遇到给SS赋值指令,系统自动禁止 外部中断,执行本条指令和下条指令后,恢复对SS SS寄 外部中断,执行本条指令和下条指令后,恢复对SS寄 存器赋值前的中断开放情况。 存器赋值前的中断开放情况。 这样做为了允许程序员连续用两条指令分别对SS 这样做为了允许程序员连续用两条指令分别对SS SP寄存器赋值 寄存器赋值, 和SP寄存器赋值,同时又防止堆栈空间变动过程出现 中断。在修改SS SP的指令之间不要插入其他指令 SS和 的指令之间不要插入其他指令。 中断。在修改SS和SP的指令之间不要插入其他指令。 (4) 所有通用传送指令不影响标志位。(除SAHF、 所有通用传送指令不影响标志位 不影响标志位。 SAHF、 POPF指令以外 指令以外)。 POPF指令以外)。
12

2. PUSH .

POP

这是两条堆栈操作指令。 这是两条堆栈操作指令。 (1)先介绍一下什么是堆栈, (1)先介绍一下什么是堆栈,为什么需要堆栈 先介绍一下什么是堆栈 堆栈——按照先进后出原则组织的一段内存区域, 堆栈 按照先进后出原则组织的一段内存区域, 按照先进后出原则组织的一段内存区域 特点:① 下推式的(规定堆栈设置在堆栈段内) 特点: 下推式的(规定堆栈设置在堆栈段内) 改变SP SP的内容 改变SP的内容 ② 随着推入堆栈内容增加,SP的值减少。 随着推入堆栈内容增加,SP的值减少。 推入堆栈内容增加 的值减少 ③先进后出工作原则(Last In First Out 先进后出工作原则( 简称LIFO) 简称LIFO)
13

移地 偏 址

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

地址 物理 00000H 低地 址) 00000H( 址) 90000H

可以用一条立即数传送指令给SP 可以用一条立即数传送指令给SP 0000H 用一条立即数传送指令给 赋值,确定SP在SS段中的初始位置。 赋值,确定SP在SS段中的初始位置。 SP 段中的初始位置 例:设: (SS)=9000H , 堆栈段为64KB 堆栈段为64KB
(SP)=E200H

9E200H

MOV SP,0E200H;(SP)=0E200H 则:整个堆栈段的物理地址范围为: 整个堆栈段的物理地址范围为: 90000H~9FFFFH 栈顶的物理地址为: 栈顶的物理地址为:9E200H 堆栈在内存中的情况如右图所示: 堆栈在内存中的情况如右图所示:
... FFFFH 9FFFFH

堆 栈 段

14

堆栈在内存中的情况

堆栈用途: 堆栈用途: 存放CPU寄存器或存储器中暂时不使用的数据, 存放CPU寄存器或存储器中暂时不使用的数据, CPU寄存器或存储器中暂时不使用的数据 使用数据时将其弹出; 使用数据时将其弹出;

调用子程序, 响应中断时都要用到堆栈。 调用子程序, 响应中断时都要用到堆栈。 调用子程序(或过程)或发生中断时要保护 调用子程序(或过程)或发生中断时要保护 断点的地址,子程序或中断返回时恢复断点。 断点的地址,子程序或中断返回时恢复断点。

15

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

下边详细说明一下堆栈用途: 下边详细说明一下堆栈用途:

16

(2) 堆栈操作指令 ? 入栈指令 格式: 格式:PUSH src

(堆栈操作指令有两条): 堆栈操作指令有两条)

(SP); (SP) ← (SP)-2 ;((SP)+1,(SP)) ← (src)

把一个字的源操作数→压入堆栈顶部,同时修改堆栈指针。 把一个字的源操作数→压入堆栈顶部,同时修改堆栈指针。 例:PUSH ?出栈指令 格式: 格式:POP AX (dest) ← ((SP)+1,(SP)) (SP) ← (SP)+2 指定的目的操作数, 指定的目的操作数,

dest

; ;

把现行SP 把现行SP所指向堆栈顶部的一个字 → SP所指向堆栈顶部的一个字 同时进行修改堆栈指针的操作。 同时进行修改堆栈指针的操作。 例: POP BX

17

存放CPU寄存器或存储器中暂时不使用的数据, 存放CPU寄存器或存储器中暂时不使用的数据, CPU寄存器或存储器中暂时不使用的数据 使用数据时将其弹出: 使用数据时将其弹出: (AX)
11H
11 22 ...

PUSH

AX (AX)

;

将(AX)入栈 (AX)入栈

22H ...

(SP)
(SP)-2 (SP)-1 (SP) 堆 栈 段

22H 11H 堆 栈 段

(SP)+1 (SP)+2

...
...

PUSH

AX前 AX 前

AX后 PUSH AX后
18

使用数据时将其弹出: 使用数据时将其弹出: POP BX
BX

BX
11H 22H ...

33H

44H ...
(SP)-2 22H 11H 堆 栈 段

(SP) (SP)+1 (SP)+2

22H 11H 堆 栈 段
(SP)-1 (SP)

...

...

POP

BX后 BX后
19

POP

BX前 BX前

调用子程序(或过程)或发生中断时要保护断点的地址, 调用子程序(或过程)或发生中断时要保护断点的地址, 子程序或中断返回时恢复断点。 子程序或中断返回时恢复断点。
主 程 序 子 程 序 1
... 后 压 入 先 压 入 (SP) 断点2 断点2(L) 断点2 断点2(H) 断点1(L) 断点1 断点1 断点1(H) 先 弹 出 后 弹 出

断点1 断点1

断点2 断点2

子 程 序 2 弹出 断点2 断点2

堆 栈 段

弹出 断点1 断点1

...

子程序嵌套 断点地址压入和弹出情况
20

应用时注意: 应用时注意:
① 堆栈操作都按字操作。 堆栈操作都按字操作。 ② PUSH , 指令的操作数可能有三种: POP 指令的操作数可能有三种:

寄存器(通用寄存器,地址指针,变址寄存器) 寄存器(通用寄存器,地址指针,变址寄存器), 段寄存器(CS除外, 段寄存器(CS除外,PUSH 除外 器。 CS 合法, 合法,POP CS 非法) 非法),存储

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

堆栈应用举例: 堆栈应用举例:
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
22

例 : 压入堆栈的内容 与弹出内容顺序相反 … PUSH AX PUSH BX PUSH CX … POP CX POP BX POP AX

3. 交换指令 格式:XCHG 格式:
执行操作: 执行操作: 交换。 交换。

dest ,

src ;(dest) ?(src)

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

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

23

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

XCHG XCHG

[BX],[DI] DS, AX

(错) 错 (错) 错

24

4. XLAT换码指令(了解) XLAT换码指令 了解) 换码指令( 该指令不影响标志位。 该指令不影响标志位。
格式: ;(AL AL) ((BX AL)) 格式:XLAT ;(AL)←((BX )+(AL))

起始地址预存在BX中,AL中存放的是偏移地址。 起始地址预存在BX中 AL中存放的是偏移地址。 BX 中存放的是偏移地址

25

XLAT指令使用方法 XLAT指令使用方法:

?

先建立一个字节表格; 先建立一个字节表格; 表格首偏移地址存入BX 表格首偏移地址存入BX; BX;

?

? 需要转换代码的序号(相对与表格首地址位移量) 需要转换代码的序号 相对与表格首地址位移量) 代码的序号( 存入AL AL; 表中第一个元素的序号为0 存入AL; (表中第一个元素的序号为0) ? 执行XLAT指令后,表中指定序号的元素存于AL中。 执行XLAT指令后,表中指定序号的元素存于AL XLAT指令后 AL中 (AL)为转换的代码 为转换的代码。 (AL)为转换的代码。

26

XLAT指令应用: XLAT指令应用: 指令应用

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

例:内存的数据段中有一张十六进制数字的ASCII码 内存的数据段中有一张十六进制数字的ASCII码 ASCII 表。 首地址为: ,欲查出表中第10个元素 欲查出表中第10 首地址为:Hex_table ,欲查出表中第10个元素 (‘A’) )
27

执行指令序列: 执行指令序列
MOV BX,OFFSET Hex_table , MOV AL,0AH , XLAT
... Hex_table Hex_table+1 Hex_table+2 32H '2' 30H 31H '0' '1'

假设: 假设: (DS)=F000H, ) , Hex_table=0040H (AL)=0AH )
Hex_table+0FH Hex_table+0AH Hex_table+0BH

39H 41H 42H ... 46H ...

'9' 'A' 'B'

'F'

执行XLAT以后: 执行 以后: 以后 (AL)=41H=(F004AH), ) ( ), 即“A”的ASCII码。 的 码 16进制数的 进制数的ASCII码表 进制数的 码表
28

(二)输入输出指令 输入输出指令共两条: 输入输出指令共两条: 1. IN 2. OUT 输入指令用于CPU从外设端口接受数据(读), 输入指令用于CPU从外设端口接受数据( 用于CPU从外设端口接受数据 输出指令用于CPU向外设端口发送数据(写)。 输出指令用于CPU向外设端口发送数据( 用于CPU向外设端口发送数据 无论接受还是发送数据,必须通过累加器AX(字 无论接受还是发送数据,必须通过累加器AX(字) 累加器AX( 或AL(字节),又称累加器专用传送指令 。 AL(字节) 字节 输入、输出指令不影响标志位。 输入、输出指令不影响标志位。
29

每个外设要占几个端口:数据口, 每个外设要占几个端口:数据口,状态口和控 制口。每个端口像存储单元一样要赋予一个地址, 制口。每个端口像存储单元一样要赋予一个地址, 称端口地址。 称端口地址。
DB 数据端口 AB CPU CB 控制端口 I/O接口 译 码 I/O 设备

状态端口

30

信息交换要通过端口: 信息交换要通过端口: 在IBMPC机里,可以配接许多外部设备,每个外 IBMPC机里,可以配接许多外部设备, 机里 设与CPU之间交换数据、状态信息和控制命令, CPU之间交换数据 设与CPU之间交换数据、状态信息和控制命令,每一 种信息交换都要通过一个端口来进行。 种信息交换都要通过一个端口来进行。 端口数:外部设备最多有65536=64K个I/O端口。 端口数:外部设备最多有65536=64K个I/O端口。 65536=64K 端口 译码形成。 由A0~A15译码形成。 端口号:端口号(即外设端口地址) 端口号:端口号(即外设端口地址)为 0000H~FFFFH。 0000H~FFFFH。

31

直接寻址方式: 直接寻址方式: 外设端口地址(端口号)直接用8位立即数给出, 外设端口地址(端口号)直接用8位立即数给出, 寻址范围00H~FFH 0~255) 00H~FFH( 寻址范围00H~FFH(0~255)

间接寻址方式: 间接寻址方式: 当端口地址(端口号)>255(FFH)时,只能使 当端口地址(端口号) 255(FFH) 用间接寻址方式。 用间接寻址方式。 必须先把端口号放到DX寄存器中,通过DX寻址。 必须先把端口号放到DX寄存器中,通过DX寻址。 DX寄存器中 DX寻址

32

1、IN

输入指令(外设→CPU) 输入指令(外设→CPU) acc, port ;(acc) ← (port)

格式: 格式:IN

具体形式有四种: 具体形式有四种: IN AL, data8 ; 端口地址8 端口地址8位,输入一个字节

IN IN IN

AX, AL, AX,

data8 DX DX

;端口地址8位,输入一个字 端口地址8 ;端口地址16位,输入一个字节 端口地址16位 16 ;端口地址16位,输入一个字 端口地址16位 16

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

2 、OUT输出指令 OUT输出指令
格式: OUT 格式: port, acc ;(port) ← (acc)

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

OUT data8, AX OUT DX , AL OUT DX , AX

;端口地址8位,输出一个字 端口地址8 ;端口地址16位,输出一个字节 端口地址16位 16 ;端口地址16位,输出一个字 端口地址16位 16

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

34

例1:实现端口(28H)→(DATA_WORD) :实现端口( ) ( ) IN AX,28H ,

MOV DATA_WORD,AX , 送一个字到AX寄存器 例2:从端口 :从端口3FCH 送一个字到 寄存器 MOV DX,3FCH , IN AX,DX ; (AL)←(3FCH), , ) ( ), (AH)←(3FDH) ) ( ) 端口(05H) 例3:实现将(AL) →端口 :实现将( 端口 OUT 5,AL;( , ;( ;(05H)←(AL) ) ( )
35

(三)目的地址传送指令
提供三条: 8086 /8088 提供三条: 地址指针写入指定寄存器或寄存器对指令。 地址指针写入指定寄存器或寄存器对指令。

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

using ES)

36

1、LEA
格式: 格式: LEA reg16 , mem16 ;EA→(reg16) → 功能:取有效地址(偏移地址),用于写进地址指针。 功能:取有效地址(偏移地址),用于写进地址指针。 ),用于写进地址指针 把指令中指定的存储器操作数有效地址 把指令中指定的存储器操作数有效地址装入指定的寄存器 。 存储器操作数有效地址装入指定的寄存器 例:设(BX)=0400H,( )=003CH ,(SI) ) ,( LEA BX,[BX+SI+0F62H] , 执行指令后: 执行指令后: EA=(BX)+(SI)+0F62H=0400H+003CH+0F62H=139EH ( ) ( ) (BX)=139EH )

37

储 存 器
注意: 注意:设 (DS)=3000H (DS) BUFFER BUFFER=1000H (31000H)=0040H 3000H:1000H (1) LEA 指令与 指令与MOV 的区别 LEA BX , BUFFER 31001H ;(BX)=1000H ;( MOV BX , BUFFER ; (BX)=0040H LEA 指令与 指令与MOV等价 等价 LEA BX , BUFFER ; (BX)=1000H MOV BX , OFFSET BUFFER ;(BX)=1000H ;(

... 40H 00H ...

38

指令中的目标寄存器必须是16位 目标寄存器必须是 (2)LEA 指令中的目标寄存器必须是16位的通用 ) 寄存器,源操作数必须是一个存储器(内存) 必须是一个存储器 寄存器,源操作数必须是一个存储器(内存)。 (3)请思考下列指令的正、误 )请思考下列指令的正、 LEA DX ,[BX][SI] LEA DX , AX

39

2、LDS 格式: 格式: LDS ;(reg16 reg16) EA) reg16, mem32 ;(reg16)←(EA) (DS)←((EA)+2)) DS) ((EA)+2)) EA 功能:将指令指定32位(4B)地址指针送指令指定 32位 4B)地址指针送 功能:将指令指定32 寄存器和DS(取段地址和偏移地址) 寄存器和DS(取段地址和偏移地址)。 将指令指定mem32单元的前两个单元内容(16位 将指令指定mem32单元的前两个单元内容(16位 mem32单元的前两个单元内容(16 偏移量)装入指定通用寄存器, 偏移量)装入指定通用寄存器,把后两个单元内容 段地址) 装入到DS段寄存器。 DS段寄存器 (段地址) 装入到DS段寄存器。 用于写远地址指针。 用于写远地址指针。
40

例: 假设: 假设: (DS)=C 000H
(DS) C000H:0010H

存储器 ... 80H 01H 00H 20H ...

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

C0011H C0012H

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

C0013H

41

3、LES 格式: 格式: LES ;(reg16 reg16) EA) reg16, mem32 ;(reg16)←(EA) ;(ES) ((EA)+2)) ;(ES)←((EA)+2)) ES EA 功能:与LDS类似。将指令指定mem32单元的前两个 功能: LDS类似。将指令指定mem32单元的前两个 类似 mem32 单元内容(16位偏移量)装入指定通用寄存器, (16位偏移量 单元内容(16位偏移量)装入指定通用寄存器,把后 两个单元内容(段地址) 装入到ES段寄存器。 ES段寄存器 两个单元内容(段地址) 装入到ES段寄存器。 用于写远地址指针。 用于写远地址指针。

42

例:

存储器
假设: 假设: (DS)=B 000H

(DS)
(BX)=080AH

(BX)

... A2H 05H 00H 40H ...

B000H:080AH
指令: LES DI, [BX] 指令

B080BH B080CH

执行指令后: 执行指令后 (DI)=080AH (ES)=B000H

B080DH

43

存储器 (DS) TABLE ... 40H 00H 00H 30H ...

综合举例: 综合举例:
5000H:1000H

设:
51001H

(DS)=5000H
51002H

TABLE=1000H
51003H

分析下列指令执行结果: 分析下列指令执行结果: (1) MOV BX,TABLE ;(BX) , ;( )=0040H (2) MOV BX,OFFSET TABLE ;( )=1000H ;(BX) , (3) LEA BX,TABLE ;( )=1000H ;(BX) , (4) LES BX,TABLE ;( )=0040H,( )=3000H ;(BX) ,(ES) , ,( (5) LDS BX,TABLE ;( )=0040H,( )=3000H ;(BX) ,(DS) , ,(
44

(四)标志传送指令 采用了隐含寄存器(AH、Flags)操作数方式。 采用了隐含寄存器(AH、Flags)操作数方式。 操作数方式

8088有四条标志传送操作指令: 8088有四条标志传送操作指令: 有四条标志传送操作指令 1. 2. 3. 4. LAHF SAHF PUSH F POP F

45

1.LAHF 格式: 格式:LAHF ;(AH) ;(AH)←(PSW的低字节) AH PSW的低字节) 的低字节 →(AH)。 AH)
6 5 4 3 2 1 0

功能: 功能:标志寄存器低八位
7 AH FLAGS 15 14 13 12 11 10 9

8

7

6

5

4 AF

3

2 PF

1

0 CF

OF DF IF TF SF ZF

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

2.

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

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

3.

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

((SP)+1,(SP))← PSW) ((SP)+1,(SP))←(PSW) SP ,(SP)) 功能 : 标志进栈。 标志进栈。

4.

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

功能

:标志出栈。 标志出栈。

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


PUSH PUSH PUSH F

AX CX

POPF POP CX POP AX …
48

CALL TRANS




友情链接: