微机原理第四章(5)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
22
例1
编程将存放在 str1中的4字节字符串传送到str2定义的缓冲区中。 str1
„A‟ „B‟ „C‟ „D‟
str2
23
data1 SEGMENT str1 DB „ABCD‟ data1 ENDS data2 SEGMENT str2 DB 4 DUP(?) data2 ENDS code SEGMENT 、、、、、、 CLD MOV AX,data1 MOV DS,AX LEA SI,str1 MOV AX,data2 MOV ES,AX LEA DI,str2 MOV CX, 4 REP MOVSB 、、、、、、 code ENDS
字节传送 字传送
字节传送 修改源串指针 修改目的串指针
字传送 修改源串指针 修改目的串指针
13
从串取
◢ ◢ 格式 LODSB LODSW ◢ ◢ LODSB执行操作 (AL) ← (DS:SI ) 从源串取入AL 取字节 取字
(SI ) ← (SI )
其中:
1
修改源串指针
DF = 0 ,用 + DF = 1 ,用 -
CX=0 ? Y N (CX)=(CX)-1 REP 后的 串 指 令
只在(CX)=0时退出循环
REP 执行流程
19
当相等重复前缀REPZ
执行过程: (1) 当(CX)= 0 , 结束REPZ, 执行REPZ下一条指令; (2) 当(CX)≠0,将CX 的内容减1, 执行REPZ后的串指令; (3) 当ZF = 1, 返回 (1) ; (4) 当ZF≠1, 则结束REPZ, 执行REPZ下一条指令。 (CX)减1操作不影响标志 ZF标志由串操作决定
① 暂停指令HLT 格式 HLT 执行 使CPU处于暂停状态 用于等待外部中断,中断处理结束后, 继续执行HLT后的下一条指令 例 、、、 、、、 STI ;允许外部中断 HLT ;等待中断 MOV AX, 0 、、、 、、、 (HLT指令在第6章中断技术用到)
5
② 空操作指令NOP 格式 NOP 指令不执行任何操作 其机器码占一个字节单元, 在调试程序时,修改程序用。 例:
8
串处理指令格式 重复控制前缀 串指令
控制重复次数
基本操作
MOVSB、MOVSW LODSB、LODSW STOSB、STOSW CMPSB、CMPSW SCASB、SCASW 串传送 从串取 存入串 串比较 搜索串
REP REPZ REPNZ

REP REPZ REPNZ
MOVSB CMPSB SCASW
DS:SI 1234:0001
ES:DI 1235:0000
ES:DI 1235:0001
(CX)=4 执行 REP 前各 寄存器的设置
(CX)=3 执行一次 MOVSB 后
ES:DI 1235:0004 (CX)=0
执行完 REP 后
26
例2 比较string1和string2的两串, 长度为8字节
③ 设置串长度
将串的长度放入CX中 ④ 按字节比较用 REPZ CMPSB 按字比较 用 REPZ CMPSW
28
执行完REPZ CMPS后,根据ZF判断两串比较结果。
▲ 若ZF=1, 两串相等,此时:
CX=0, 表明串中所有元素已比较完毕
SI、DI指向串尾的下一单元。 ▲ 若ZF=0, 两串不等,此时: CX的值为剩下的未比较的元素个数。 SI、DI指向不相等元素的下一元素。
从目的串搜索字节 修改目的串指针
两数相减,只影响标志,不影响操作数。
17

重复控制前缀
重复前缀REP 当相等重复前缀REPZ /REPE
当不相等重复前缀REPNZ /REPNE
18
重复前缀REP
执行过程: (1)当(CX)= 0 ,结束REP, 执行REP下一条指令。 (2)当(CX)≠0,将CX 的 内容减1, 执行REP后的串指令,返回 (1)。 例 LEA DI, destination LEA SI, source MOV CX,20 REP MOVSB MOV AX, 0
字节比较 修改源串指针 修改目的串指针 字比较 修改源串指针 修改目的串指针
◢ ◢ CMPSB 执行操作 (DS:SI ) - (ES:DI ) (SI ) ← (SI ) 1 (DI ) ← (DI ) 1 ◢ ◢ CMPSW 执行操作 (DS:SI ) - (ES:DI ) (SI ) ← (SI ) 2 (DI ) ← (DI ) 2
(DI ) ← (DI )
其中: DF = 0 ,用 + DF = 1 ,用 -
1
修改目的串指针
◢ ◢ STOSW执行操作
(ES:DI) ← (AX) (DI) ← (DI )
其中: DF = 0 ,用 + DF = 1 ,用 -
将AX存入目的串 2 修改目的串指针
15
串比较
◢ ◢格式 CMPSB CMPSW 字节比较 字比较
◢ ◢ LODSW执行操作
(AX ) ← (DS:SI ) (SI ) ← (SI )
其中:
从源串取入AX 修改源串指针
14
2
DF = 0 ,用 + DF = 1 ,用 -
存入串
◢ ◢ 格式 STOSB STOSW ◢ ◢ STOSB执行操作 (ES:DI) ← (AL) 将AL存入目的串 存入字节 存入字
12
串传送
◢ ◢ 格式 MOVSB
MOVSW
◢ ◢ MOVSB 执行操作 (ES:DI ) ← (DS:SI ) (SI ) ← (SI ) 1 (DI) ← (DI ) 1 其中: DF = 0 ,用 + DF = 1 ,用 ◢ ◢ MOVSW 执行操作 (ES:DI ) ← (DS:SI ) (SI ) ← (SI ) 2 (DI ) ← (DI ) 2 其中: DF = 0 ,用 + DF = 1 ,用 -
③ 指令执行后,指针据DF标志、操作类型自动修改
字节操作 DF= 0 1 ; 字操作 2 用+ ; DF= 1 用 -
11
④ 只有一个存储器操作数的串指令 如 LODS(从串取) STOS(存入串) SCAS(搜索串) 另一个操作数在 AL (字节操作) 或 AX (字操作) ⑤影响标志情况 CMPS(串比较)、SCAS(串搜索)影响标志, MOVS(串传送)、LODS(从串取)、STOS(存入串)不影响标志。
9
① 串指令
串传送 MOVS
从串取 LODS
存入串 STOS
串比较 CMPS 搜索串 SCAS
10
▲串指令的特点 ① 指令给出串操作的种类、类型,而操作数隐含给出。 如 MOVSB ;字节 MOVSW ;字 ② 源串 由DS : SI指向的单元 目的串 由ES : DI指向的单元
第三节 8086/8088的指令系统(续)
六. 处理机控制指令 七.串处理指令
第四节
DOS操作系统简介
1
作业:
2-23
补充题1:应用LODS和STOS 内存中有一个首地址为BLOCK补码表示的有符号数的数据块。请编写程序段 要求将正、负数分开,分别存于二个缓冲区: 存放正数的缓冲区首址为PUOS-DATA, 存放负数的缓冲区首址为MINUS-DATA。 补充题2 :请编写程序段
25
Leabharlann Baidu
str2 1235:0000
1236:0000 程 序
REP MOVS BB
程序执行结果:
DS:SI 1234:0000 „A‟ „B‟ „C‟ „D‟ 00H 00H 00H 00H „A‟ „B‟ „C‟ „D‟ „A‟ 00H 00H 00H DS:SI 1234:0004 „A‟ „B‟ „C‟ „D‟ „A‟ „B‟ „C‟ „D‟
2、 处理机控制指令
HLT, NOP, WAIT, ESC, LOCK
3
1、 标志处理指令 ▲设置和清除标志的指令,只影响指令指定的标志
指令格式 CLC STC CLM CLD STD CLI STI
执行操作 CF=0 CF=1 CF ← CF DF=0 DF=1 IF=0 IF=1
4
2、 处理机控制指令
利用REP NE
SCASB指令要搜索的关键字 放在(AL)或(AX)中,
搜索某一数据块或字符串中有无关 键字, 若有,把搜索次数记下来,且记录关键字地址; 若次数为0,表示没有要搜索的关键字。
复习内容:P72~76,P83-84
预习内容:97~110
2
六. 处理机控制指令
1、标志处理指令
CLC, STC, CMC, CLD, STD, CLI, STI
6
七、串处理指令 串的基本概念 顺序存放在内存中的一组数据,称为串。 用串的首(末)地址、元素类型、串的长度表示。
11 22 33
„A‟ „B‟ „C‟ „D‟ „ ‟ „E‟
、、 、
„Y‟ „Z‟
string
1234:0000 DS:BX
1a 2b 3c 4d
7
串操作种类
①串传送 将串从内存某一区域传送到另一区域。 ② 从串取 从串中取出某一元素。 ③ 存入串 将某个数据存入串中。 ④ 串比较 对两个串进行比较。 ⑤ 搜索串 在串中搜索(查找)某数据(关键字)
注意:1. 源串 - 目的串 2. 两数相减,只影响标志,不影响操作数
16
搜索串
◢ ◢格式 SCASB SCASW 取字节 取字 从目的串搜索字节 修改目的串指针
◢ ◢ SCASB执行操作 (AL) - (ES:DI ) (DI ) ← (DI ) 1
◢ ◢ SCASW执行操作 (AX ) - (ES:DI ) (DI) ← (DI ) 2
string1
、、 、 11 22 33 、、 、 1a 2b 3c 4d
、、 、 11 22 33 、、 、 1a 11 22 34
string2
27
用REPZ CMPS 进行串比较 编程: ① 设置比较方向 (STD或CLD)
② 设置源串、目的串地址
将源串首地址(DF=0时),或末地址(DF=1时)放入 DS、SI 将目的串首地址(DF=0时),或末地址(DF=1时)放入ES、DI
data1 SEGMENT str1 DB „ABCD‟ data1 ENDS
data2 SEGMENT str2 DB 4 DUP(?) data2 EMDS code SEGMENT 、、、、、、 CLD MOV AX,data1 MOV DS,AX LEA SI,str1 MOV AX,data2 MOV ES,AX LEA DI,str2 MOV CX, 4 REP MOVSB 、、、、、、 code ENDS
CX=0? N (CX)=(CX)-1 REPZ 后的 串 指 令 ZF=1 ? Y
Y
N
REPZ 执行流程
20
当不相等重复前缀REPNZ
执行过程: (1) 当(CX )= 0 , 结束REPNZ, 执行REPNZ下一条指令。
CX=0 ? N (CX)=(CX)-1
Y
(2)当(CX)≠0,将CX 的内容减1,
;源串
;缓冲区
;DF=0,正方向传送 ;源串首地址的段值→ DS ;源串首地址的偏值→ SI ;目的串首地址的段值→ ES ;目的串首地址的偏值→ DI ;串长度 CX ;串传送
24
假设程序经汇编、连接后,装入内存的情况如下:
str1 1234:0000 „A‟ „B‟ „C‟ „D‟ 00H 00H 00H 00H FC 、 、 、 、 F3 A4 CLD
B8 00 01 3A 07 B8 FE 11 mov cmp BX, [100] AL,[BX] B8 00 01 90 90 90 3A 07 mov nop nop nop cmp BX, [100]
mov CX, 20H B9 20 00 AL,[BX]
(也可用NOP指令进行短延时(教材中的一些例子用到)
执行REPNZ后的串指令。 (3) 当ZF = 0, 返回(1);
REPNZ 后的 串指 令 ZF=0 ? Y N
(4) 当ZF≠0, 则结束REPNZ,
执行REPNZ下一条指令。
REPNZ 执行流程
21
例1
用REP MOVS 进行数据块传送。
编程: ①设置传送方向 用CLD 使DF = 0, 地址增加方向(正向) 用STD 使 DF = 1, 地址减小方向(反向) ②设置源串地址 将源串首地址(DF=0),或末地址(DF=1)放入 DS、SI中。 ③设置目的串地址 将目的串首地址(DF=0),或末地址(DF=1)放入 ES、DI中。 ④设置串长度 将串的长度(传送次数)放入CX中。 ⑤字节传送用 REP MOVSB 字传送 用 REP MOVSW
相关文档
最新文档