• 410 likes • 606 Views
6. 处理机控制指令 1) 标志处理指令 CLC, STC, CMC, CLD, STD, CLI, STI 2) 处理机控制指令 HLT, NOP, WAIT, ESC, LOCK. 1) 标志处理指令 ▲ 设置和清除标志的指令,只影响指令指定的标志. 2) 处理机控制指令 ① 暂停指令 HLT 格式 HLT 执行 使 CPU 处于暂停状态 用于等待外部中断,中断处理结束后, 继续执行 HLT 后的下一条指令 例 、、、 、、、
E N D
6. 处理机控制指令 • 1) 标志处理指令 • CLC, STC, CMC, CLD, STD, CLI, STI • 2) 处理机控制指令 • HLT, NOP, WAIT, ESC, LOCK
1) 标志处理指令 • ▲设置和清除标志的指令,只影响指令指定的标志
2) 处理机控制指令 • ① 暂停指令HLT • 格式HLT • 执行 使CPU处于暂停状态 • 用于等待外部中断,中断处理结束后, • 继续执行HLT后的下一条指令 • 例 、、、 • 、、、 • STI ;允许外部中断 • HLT ;等待中断 • MOV AX, 0 • 、、、 • 、、、
其机器码占一个字节单元, 在调试程序时,修改程序用。 例: (也可用NOP指令进行短延时(教材中的一些例子用到) • ② 空操作指令NOP • 格式NOP • 指令不执行任何操作
7.串处理指令 • 串的基本概念 顺序存放在内存中的一组数据,称为串。 • 用串的首(末)地址、元素类型、串的长度表示。
串操作种类 • ①串传送 • 将串从内存某一区域传送到另一区域。 • ② 从串取 • 从串中取出某一元素。 • ③ 存入串 • 将某个数据存入串中。 • ④ 串比较 • 对两个串进行比较。 • ⑤ 搜索串 • 在串中搜索(查找)某数据(关键字)
串处理指令格式 • 重复控制前缀 串指令 • 控制重复次数 基本操作 • MOVSB、MOVSW串传送 • REP LODSB、LODSW从串取 • REPZ STOSB、STOSW存入串 • REPNZ CMPSB、CMPSW串比较 • SCASB、SCASW搜索串 • 例REP MOVSB • REPZ CMPSB • REPNZ SCASW
① 串指令 • 串传送 MOVS • 从串取 LODS • 存入串 STOS • 串比较 CMPS • 搜索串 SCAS
串指令的特点 • ① 指令给出串操作的种类、类型,而操作数隐含给出。 • 如 MOVSB ;字节 • MOVSW ;字 • ② 源串 由DS : SI指向的单元 • 目的串 由ES : DI指向的单元 • ③ 指令执行后,指针据DF标志、操作类型自动修改 • 字节操作 1 ; 字操作 2 • DF= 0 用 + ; DF= 1 用 -
④对只有一个存储器操作数的串指令 • 如 LODS(从串取) • STOS(存入串) • SCAS(搜索串) • 另一个操作数在 AL (字节操作) 或 AX (字操作) • ⑤CMPS(串比较)、SCAS(串搜索)影响标志, • MOVS(串传送)、LODS(从串取)、STOS(存入串)不影响标志。
串传送 • ◢ ◢ 格式 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 修改目的串指针
从串取 • ◢ ◢ 格式 LODSB 取字节 • LODSW 取字 • ◢ ◢ LODSB执行操作 • (AL) ← (DS:SI ) 从源串取入AL • (SI ) ← (SI ) 1 修改源串指针 • ◢ ◢LODSW执行操作 • (AX ) ← (DS:SI ) 从源串取入AX • (SI ) ← (SI ) 2 修改源串指针
存入串 • ◢ ◢ 格式 STOSB 存入字节 • STOSW 存入字 • ◢ ◢STOSB执行操作 • (ES:DI) ← (AL)将AL存入目的串 • (DI ) ← (DI ) 1 修改目的串指针 • ◢ ◢ STOSW执行操作 • (ES:DI) ← (AX)将AX存入目的串 • (DI) ← (DI ) 2 修改目的串指针
串比较 • ◢ ◢格式 CMPSB字节比较 • CMPSW字比较 • ◢ ◢CMPSB 执行操作 • (DS:SI ) - (ES:DI ) 字节比较 • (SI ) ← (SI ) 1 修改源串指针 • (DI ) ← (DI ) 1 修改目的串指针 • ◢ ◢CMPSW 执行操作 • (DS:SI ) - (ES:DI ) 字比较 • (SI ) ← (SI ) 2 修改源串指针 • (DI ) ← (DI ) 2 修改目的串指针 • 注意:1. 源串 - 目的串 • 2. 两数相减,只影响标志,不影响操作数
搜索串 • ◢ ◢格式 SCASB取字节 • SCASW取字 • ◢ ◢SCASB执行操作 • (AL) - (ES:DI ) 从目的串搜索字节 • (DI ) ← (DI ) 1 修改目的串指针 • ◢ ◢SCASW执行操作 • (AX ) - (ES:DI ) 从目的串搜索字节 • (DI) ← (DI ) 2 修改目的串指针 • 两数相减,只影响标志,不影响操作数。
② 重复控制前缀 • 重复前缀REP • 当相等重复前缀REPZ /REPE • 当不相等重复前缀REPNZ /REPNE
重复前缀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 • 只在(CX)=0时退出循环
当相等重复前缀REPZ • 执行过程: • (1)当(CX)= 0 , 结束REPZ, • 执行REPZ下一条指令; • (2)当(CX)≠0,将CX 的内容减1, • 执行REPZ后的串指令; • (3)当ZF = 1, 返回 (1) ; • (4)当ZF≠1, 则结束REPZ, • 执行REPZ下一条指令。 • (CX)减1操作不影响标志 • ZF标志由串操作决定
当不相等重复前缀REPNZ • 执行过程: • (1)当(CX )= 0 , 结束REPNZ, • 执行REPNZ下一条指令。 • (2)当(CX)≠0,将CX 的内容减1, • 执行REPNZ后的串指令。 • (3)当ZF = 0, 返回(1); • (4)当ZF≠0, 则结束REPNZ, • 执行REPNZ下一条指令。
例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
例1 编程将存放在 str1中的4字节字符串传送到str2定义的缓冲区中。 str1 ‘A’ ‘B’ ‘C’ ‘D’ str2
data1 SEGMENT • str1 DB ‘ABCD’;源串 • data1 ENDS • data2 SEGMENT • str2 DB 4 DUP(?) ;缓冲区 • data2 ENDS • code SEGMENT • 、、、、、、 • CLD ;DF=0,正方向传送 • MOV AX,data1 ;源串首地址的段值→ DS • MOV DS,AX • LEA SI,str1 ;源串首地址的偏值→ SI • MOV AX,data2 ;目的串首地址的段值→ ES • MOV ES,AX • LEA DI,str2 ;目的串首地址的偏值→ DI • MOV CX, 4 ;串长度 CX • REP MOVSB;串传送 • 、、、、、、 • code ENDS
假设程序经汇编、连接后,装入内存的情况如下:假设程序经汇编、连接后,装入内存的情况如下: • 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
用REPZ CMPS进行串比较 编程: ① 设置比较方向 (STD或CLD) ② 设置源串、目的串地址 将源串首地址(DF=0时),或末地址(DF=1时)放入 DS、SI 将目的串首地址(DF=0时),或末地址(DF=1时)放入ES、DI ③ 设置串长度 将串的长度放入CX中 ④ 按字节比较用 REPZ CMPSB 按字比较用 REPZ CMPSW
执行完REPZ CMPS后,根据ZF判断两串比较结果。 • 若ZF=1, 两串相等,此时: • CX=0, 表明串中所有元素已比较完毕 • SI、DI指向串尾的下一单元。 • 若ZF=0, 两串不等,此时: • CX的值为剩下的未比较的元素个数。 • SI、DI指向不相等元素的下一元素。
code SEGMENT • 、、、、、、 • CLD ;DF=0,正向比较 • MOV AX,SEG string1 ;源串首地址→ DS:SI • MOV DS,AX • LEA SI,string1 • MOV AX,SEG string2 ;目的串首地址→ ES:DI • MOV ES,AX • LEA DI,string2 • MOV CX, 8 ;串长度→ CX • REPZ CMPSB;串比较 • JZ equal ;利用ZF判断比较结果 • 不相等处理 • JMP exit • equal: 相等处理 • exit: 、、、 • code ENDS
code SEGMENT • 、、、、、、 • CLD ;DF=0,正向比较 • MOV AX,SEG string1 ;源串首地址→ DS:SI • MOV DS,AX • LEA SI,string1 • MOV AX,SEG string2 ;目的串首地址→ ES:DI • MOV ES,AX • LEA DI,string2 • MOV CX, 8 ;串长度→ CX • REPZ CMPSB • JZ equal • 不相等处理 • JMP exit • equal: 相等处理 • exit: 、、、 • code ENDS JNZ notequ 相等处理 JMP exit notequ: 不相等处理 exit: 、、、
例 执行完REPZ CMPSB后,此时: ZF=1, 两串相等 CX=0 , 两串所有元素已比较完 SI、DI串尾的下一单元
例 执行完REPZ CMPSB后,此时: ZF=0, 两串不等 CX=3,剩下的未比较的元素个数 SI、DI指向不相等元素的下一元素。
例3 用REPNZ SCAS 在串中找关键字。 编程步骤: ①设置查找方向 ②设置串地址 将串的首地址(DF=0时),或末地址(DF=1时)放入ES、DI中。 ③设置关键字 将关键字放入AL (关键字为字节)或 放入AX(关键字为字)。 ④设置串长度 将串的长度放入CX中。 ⑤查找字节用 REPNZ SCASB 查找字用 REPNZ SCASW
执行完REPNZ SCAS后,根据ZF判断查找结果。 • 若 ZF=1, 则串中有关键字,此时: • CX的值为剩下的未搜索的元素个数, • DI指向关键字元素的下一元素, • 而关键字在( DI )-1的位置 • 若 ZF=0, 则串中无关键字,此时: • CX=0,表明串中所有元素以搜索完毕 • DI指向串尾的下一单元。
例 、、、 REPNZ SCASB JZ found 未找到处理 JMP exit found: 找到处理 exit: 、、、
串指令可单独使用 • MOV AL, [SI] • MOV ES:[DI], AL 等价于 MOVSB • INC SI • INC DI (假设 DF=0) • next: JCXZ exit • DEC CX • MOVSB 等价于 REP MOVSB • JMP next • exit: 、、 说明:
下面程序段完成字传送 (8000:1000H) ← (4000:2000H) MOV AX, 4000H MOV DS, AX MOV SI, 2000H MOV AX, 8000H MOV ES, AX MOV DI, 1000H MOVSW
可在有源操作数的串指令前使用段跨越前缀, • 此时:源串操作数的段值由段跨越前缀指定。 • 包括指令MOVS、LODS、CMPS • 例ES : MOVSB • 执行 (ES:DI) ← (ES:SI) • 而不是 (ES:DI) ← (DS:SI) • ES: SCASB 没有源串 • ES: STOSW • 目的串操作数不允许使用段跨越前缀, • 即串指令前的段跨越前缀必指源串操作数。
寄存器组 DS AX BX CX DX AH AL 地址加法器 ES BH 地址总线AB BL 、、、 指令1 指令2 指令3 指令4 、、、 数据1 数据2 数据3 、、、 SS 地 址 译 码 器 CH CL CS DH DL SI IP DI 数据总线DB BP 数据暂存器 SP 总线 接口控制电路 指 令 队 列 控制总线CB 运 算 器 指令译码器 PSW标志 寄存器 执行部件控制电路
本节结束,谢谢合作! 请继续学习下面的内容!