1 / 41

6. 处理机控制指令 1) 标志处理指令 CLC, STC, CMC, CLD, STD, CLI, STI 2) 处理机控制指令

6. 处理机控制指令 1) 标志处理指令 CLC, STC, CMC, CLD, STD, CLI, STI 2) 处理机控制指令 HLT, NOP, WAIT, ESC, LOCK. 1) 标志处理指令 ▲ 设置和清除标志的指令,只影响指令指定的标志. 2) 处理机控制指令 ① 暂停指令 HLT 格式 HLT 执行 使 CPU 处于暂停状态 用于等待外部中断,中断处理结束后, 继续执行 HLT 后的下一条指令 例 、、、 、、、

dorie
Download Presentation

6. 处理机控制指令 1) 标志处理指令 CLC, STC, CMC, CLD, STD, CLI, STI 2) 处理机控制指令

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 6. 处理机控制指令 • 1) 标志处理指令 • CLC, STC, CMC, CLD, STD, CLI, STI • 2) 处理机控制指令 • HLT, NOP, WAIT, ESC, LOCK

  2. 1) 标志处理指令 • ▲设置和清除标志的指令,只影响指令指定的标志

  3. 2) 处理机控制指令 • ① 暂停指令HLT • 格式HLT • 执行 使CPU处于暂停状态 • 用于等待外部中断,中断处理结束后, • 继续执行HLT后的下一条指令 • 例 、、、 • 、、、 • STI ;允许外部中断 • HLT ;等待中断 • MOV AX, 0 • 、、、 • 、、、

  4. 其机器码占一个字节单元, 在调试程序时,修改程序用。 例: (也可用NOP指令进行短延时(教材中的一些例子用到) • ② 空操作指令NOP • 格式NOP • 指令不执行任何操作

  5. 7.串处理指令 • 串的基本概念 顺序存放在内存中的一组数据,称为串。 • 用串的首(末)地址、元素类型、串的长度表示。

  6. 串操作种类 • ①串传送 • 将串从内存某一区域传送到另一区域。 • ② 从串取 • 从串中取出某一元素。 • ③ 存入串 • 将某个数据存入串中。 • ④ 串比较 • 对两个串进行比较。 • ⑤ 搜索串 • 在串中搜索(查找)某数据(关键字)

  7. 串处理指令格式 • 重复控制前缀   串指令 • 控制重复次数  基本操作 • MOVSB、MOVSW串传送 • REP LODSB、LODSW从串取 • REPZ STOSB、STOSW存入串 • REPNZ CMPSB、CMPSW串比较 • SCASB、SCASW搜索串 • 例REP MOVSB • REPZ CMPSB • REPNZ SCASW

  8. ① 串指令 • 串传送 MOVS • 从串取 LODS • 存入串 STOS • 串比较 CMPS • 搜索串 SCAS

  9. 串指令的特点 • ① 指令给出串操作的种类、类型,而操作数隐含给出。 • 如 MOVSB ;字节 • MOVSW ;字 • ② 源串 由DS : SI指向的单元 • 目的串 由ES : DI指向的单元 • ③ 指令执行后,指针据DF标志、操作类型自动修改 • 字节操作 1 ; 字操作 2 • DF= 0 用 + ; DF= 1 用 -

  10. ④对只有一个存储器操作数的串指令 • 如 LODS(从串取) • STOS(存入串) • SCAS(搜索串) • 另一个操作数在 AL (字节操作) 或 AX (字操作) • ⑤CMPS(串比较)、SCAS(串搜索)影响标志, • MOVS(串传送)、LODS(从串取)、STOS(存入串)不影响标志。

  11. 串传送 • ◢ ◢ 格式 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 修改目的串指针

  12. 从串取 • ◢ ◢ 格式 LODSB 取字节 • LODSW 取字 • ◢ ◢ LODSB执行操作 • (AL) ← (DS:SI ) 从源串取入AL • (SI ) ← (SI ) 1 修改源串指针 • ◢ ◢LODSW执行操作 • (AX ) ← (DS:SI ) 从源串取入AX • (SI ) ← (SI ) 2 修改源串指针

  13. 存入串 • ◢ ◢ 格式 STOSB 存入字节 • STOSW 存入字 • ◢ ◢STOSB执行操作 • (ES:DI) ← (AL)将AL存入目的串 • (DI ) ← (DI ) 1 修改目的串指针 • ◢ ◢ STOSW执行操作 • (ES:DI) ← (AX)将AX存入目的串 • (DI) ← (DI ) 2 修改目的串指针

  14. 串比较 • ◢ ◢格式 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. 两数相减,只影响标志,不影响操作数

  15. 搜索串 • ◢ ◢格式 SCASB取字节 • SCASW取字 • ◢ ◢SCASB执行操作 • (AL) - (ES:DI ) 从目的串搜索字节 • (DI ) ← (DI ) 1 修改目的串指针 • ◢ ◢SCASW执行操作 • (AX ) - (ES:DI ) 从目的串搜索字节 • (DI) ← (DI ) 2 修改目的串指针 • 两数相减,只影响标志,不影响操作数。

  16. ② 重复控制前缀 • 重复前缀REP • 当相等重复前缀REPZ /REPE • 当不相等重复前缀REPNZ /REPNE

  17. 重复前缀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时退出循环

  18. 当相等重复前缀REPZ • 执行过程: • (1)当(CX)= 0 , 结束REPZ, • 执行REPZ下一条指令; • (2)当(CX)≠0,将CX 的内容减1, • 执行REPZ后的串指令; • (3)当ZF = 1, 返回 (1) ; • (4)当ZF≠1, 则结束REPZ, • 执行REPZ下一条指令。 • (CX)减1操作不影响标志 • ZF标志由串操作决定

  19. 当不相等重复前缀REPNZ • 执行过程: • (1)当(CX )= 0 , 结束REPNZ, • 执行REPNZ下一条指令。 • (2)当(CX)≠0,将CX 的内容减1, • 执行REPNZ后的串指令。 • (3)当ZF = 0, 返回(1); • (4)当ZF≠0, 则结束REPNZ, • 执行REPNZ下一条指令。

  20. 例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

  21. 例1 编程将存放在 str1中的4字节字符串传送到str2定义的缓冲区中。 str1 ‘A’ ‘B’ ‘C’ ‘D’ str2

  22. 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

  23. 假设程序经汇编、连接后,装入内存的情况如下:假设程序经汇编、连接后,装入内存的情况如下: • 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

  24. 程序执行结果:

  25. 例2 比较string1和string2的两串, 长度为8字节

  26. 用REPZ CMPS进行串比较 编程: ① 设置比较方向 (STD或CLD) ② 设置源串、目的串地址 将源串首地址(DF=0时),或末地址(DF=1时)放入 DS、SI 将目的串首地址(DF=0时),或末地址(DF=1时)放入ES、DI ③ 设置串长度 将串的长度放入CX中 ④ 按字节比较用 REPZ CMPSB 按字比较用 REPZ CMPSW

  27. 执行完REPZ CMPS后,根据ZF判断两串比较结果。 • 若ZF=1, 两串相等,此时: • CX=0, 表明串中所有元素已比较完毕 • SI、DI指向串尾的下一单元。 • 若ZF=0, 两串不等,此时: • CX的值为剩下的未比较的元素个数。 • SI、DI指向不相等元素的下一元素。

  28. 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

  29. 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: 、、、

  30. 执行完REPZ CMPSB后,此时: ZF=1, 两串相等 CX=0 , 两串所有元素已比较完 SI、DI串尾的下一单元

  31. 执行完REPZ CMPSB后,此时: ZF=0, 两串不等 CX=3,剩下的未比较的元素个数 SI、DI指向不相等元素的下一元素。

  32. 例3 用REPNZ SCAS 在串中找关键字。 编程步骤: ①设置查找方向 ②设置串地址 将串的首地址(DF=0时),或末地址(DF=1时)放入ES、DI中。 ③设置关键字 将关键字放入AL (关键字为字节)或 放入AX(关键字为字)。 ④设置串长度 将串的长度放入CX中。 ⑤查找字节用 REPNZ SCASB 查找字用 REPNZ SCASW

  33. 执行完REPNZ SCAS后,根据ZF判断查找结果。 • 若 ZF=1, 则串中有关键字,此时: • CX的值为剩下的未搜索的元素个数, • DI指向关键字元素的下一元素, • 而关键字在( DI )-1的位置 • 若 ZF=0, 则串中无关键字,此时: • CX=0,表明串中所有元素以搜索完毕 • DI指向串尾的下一单元。

  34. 例 、、、 REPNZ SCASB JZ found 未找到处理 JMP exit found: 找到处理 exit: 、、、

  35. 串指令可单独使用 • 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: 、、 说明:

  36. 下面程序段完成字传送 (8000:1000H) ← (4000:2000H) MOV AX, 4000H MOV DS, AX MOV SI, 2000H MOV AX, 8000H MOV ES, AX MOV DI, 1000H MOVSW

  37. 可在有源操作数的串指令前使用段跨越前缀, • 此时:源串操作数的段值由段跨越前缀指定。 • 包括指令MOVS、LODS、CMPS • 例ES : MOVSB • 执行 (ES:DI) ← (ES:SI) • 而不是 (ES:DI) ← (DS:SI) • ES: SCASB 没有源串 • ES: STOSW • 目的串操作数不允许使用段跨越前缀, • 即串指令前的段跨越前缀必指源串操作数。

  38. 重复前缀中CX 减1操作,不影响标志。

  39. 几种操作复习

  40. 寄存器组 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标志 寄存器 执行部件控制电路

  41. 本节结束,谢谢合作! 请继续学习下面的内容!

More Related