80x86微机原理及接口技术实验教程(20xx版)内容摘要:

这两条指令各不影响标志。 ( 3)交换指令 XCHG XCHG 指令与 8086/8088 的 XCHG 指令相同,可传送 8 位、 16位或 32位数据。 ( 4)进栈指令 PUSH 进栈指令 PUSH 与 8086/8088 格式一样,但功能增强了,压入堆栈的操作数还可以是立即数。 从 80X86 开始,操作数长度还可以达 32位,那么堆栈指针减 4。 ( 5)出栈指令 POP POP 指令与 8086/8088 的 POP 指令相同,可弹出 32位操作。 ( 6) 16 位全进栈指令 PUSHA 和全出栈指令 POPA PUSHA 指令和 POPA 指令提供了压入 或弹出 8 个 16 位通用寄存器的有效手段,它们的格式 如下: PUSHA 80X86微机原理及接口技术实验教程 西安唐都科教仪器公司 6 POPA PUSHA 指令将所有 8 个通用寄存器( 16 位)内容压入堆栈,其顺序是: AX、 CX、 DX、BX、 SP、 BP、 SI、 DI,然后堆栈指针寄存器 SP 的值减 16,所以 SP 进栈的内容是 PUSHA执行之前的值。 POPA指令从堆栈弹出内容以 PUSHA相反的顺序送到这些通用寄存器,从而恢复 PUSHA之前的寄存器内容。 但堆栈指针寄存器 ESP 的值不是由堆栈弹出,而是通过增加 16 来恢复。 这两条指令各不影响标志。 ( 7) 32 位全进栈指令 PUSHAD 和全出 栈指令 POPAD PUSHAD 指令和 POPAD 指令提供了压入或弹出 8 个 32 位通用用寄存器的有效手段,它们的 格式如下: PUSHAD POPAD PUSHAD 指令将所有 8 个通用寄存器( 32 位)内容压入堆栈,其顺序是: EAX、 ECX、EDX、 EBX、 ESP、 EBP、 ESI、 EDI,然后堆栈指针寄存器 ESP 的值减 32,所以 ESP 进栈的内容是 PUSHAD 执行之前的值。 POPAD 指令从堆栈弹出内容以 PUSHAD 相反的顺序送到这些通用寄存器,从而恢复PUSHAD 之前的寄存器内容。 但堆栈指针寄存器 SP 的值不是由堆栈弹出 ,而是通过增加 32来恢复。 这两条指令各不影响标志。 2. 地址传送指令组 ( 1)装入有效地址指令 LEA 装入有效地址指令的格式和功能同 8086/8088。 源操作数仍然必须是存储器操作数,目的操作数是 16 位或者 32 位通用寄存器。 当目的操作数是 16 位通用寄存器时,那么只装入有效地址的低 16 位。 ( 2)装入指针指令组 装入指针指令组有 5 条指令,格式如下: LDS REG, OPRD LES REG, OPRD LFS REG, OPRD LGS REG, OPRD LSS REG, OPRD 这 5 条指令的功能是将操 作数 OPRD 所指内存单元的 4 个或 6 个相继字节单元的内容送到指 令助记符给定的段寄存器和目的操作数 REG 中。 目的操作数必须是 16 位或 32 位通用寄存器,源操作数是存储器操作数。 如果目的操作数是 16 位通用寄存器,那么源操作数 OPRD 含 32 位指针。 如果目的操作数是 32 位通用寄存器,那么源操作数 OPRD 含 48位指针。 如: LSS SP, SPVAR ; SPVAR 是含有堆栈指针的双字 这些指令各不影响标志。 3. 标志传送指令组 80X86微机原理及接口技术实验教程 西安唐都科教仪器公司 7 80X86 的标志传送指令组含有以下 6 条指令: LAHF、 SAHF、 PUSHF、 PUSHFD、 POPF和 POPFD。 指令 LAHF、 SAHF、 PUSHF 和 POPF 指令格式和功能与 8086/8088 相同。 32 位标志寄存器进栈和出栈指令的格式如下: PUSHFD POPFD PUSHFD 指令将整个标志寄存器的内容压入堆栈; POPFD 指令将栈顶的一个双字弹出到32 位的标志寄存器中。 这两条指令是 PUSHF 和 POPF 指令的扩展。 PUSHFD 指令不影响各标志, POPFD 指令影响各标志。 4. 累加器专用传送指令组 80X86 累加器专用传送指令组含有如下指令: IN、 OUT 和 XLAT。 输入指令 IN、 OUT 与 8086/8088 相同,但可以通过累加器 EAX 输入、输出一个双字。 如: IN EAX, 20H ;从 20H 端口输入一个双字 OUT 20H, EAX ;输出一个双字到 20H 端口 表转换指令 XLAT 的格式和功能与 8086/8088 相同。 但是从 80X86 开始存放基值的寄存器 可以是 EBX。 也就是说,扩展的 XLAT 指令以 EBX 为存放基值的寄存器,非扩展的 XLAT指令以 BX 为存放基值的寄存器。 算术运算指令 80X86 算术运算指令的操作数可以扩展到 32 位,同时与 8086/8088 相比还增强了有符号数乘 法指令的功能。 1. 加法和减法指令组 加法和减法指令组的功能与 8086/8088 相同,有 8 条指令: ADD、 ADC、 INC、 SUB、SBB、 DEC、 CMP 和 NEG。 但在 80X86 下指令的操作数可以扩展到 32 位,如: ADD EAX, ESI ADC EAX, DWORD PTR [BX] INC EBX SUB ESI, 4 SBB DWORD PTR [EDI], DX DEC EDI CMP EAX, EDX NEG ECX 2. 乘法和除法指令组 乘法和除法指令组含有 4 条指令: MUL、 DIV、 IMUL 和 IDIV。 ( 1)无符号数乘法和除法指令 无符号数乘法 MUL 指令和除法指令 DIV 指令的格式没有变。 指令中只给出一个操作数, 80X86微机原理及接口技术实验教程 西安唐都科教仪器公司 8 自动 根据给出的操作数确定另一个操作数。 当指令中给出的源操作数为字节或字时,它们与8086/8088 相同。 在源操作数为双字的情况下,乘法指令 MUL 默认的另一个操作数是 EAX,其功能是把EAX 内容乘上源操作数内容所得积送入 EDX: EAX 中,若结果的高 32 位为 0,那么标志 CF和 OF 被清 0,否则被臵 1;除法指令 DIV 默认的被除数是 EDX: EAX,其功能是把指令中给出的操作数作为除数,所得的商送 EAX,余数送 EDX。 ( 2)有符号数乘法和除法指令 原有的有符号数乘法指令 IMUL 和除法指令 IDIV 继续保持,但操作数可以扩展到 32 位。 当 操作数为 32 位时,它与无符号数乘法指令相同。 另外, 80X86 还提供了新形式的有符号数乘法指令。 如: IMUL DST, SRC IMUL DST, SRC1, SRC2 上述第一种格式是将目的操作数 DST 与源操作数 SRC 相乘,结果送到目的操作数 DST中; 第二种格式是将 SRC1 和 SRC2 相乘,结果送到目的操作数 DST 中。 3. 符号扩展指令组 80X86 的符号扩展指令有 4 条: CBW、 CWD、 CWDE 和 CDQ。 其中 CBW 和 CWD 的功能没有发生变化;指令 CWDE 和 CDQ 是 80X86 新增的指令,它们 的格式如下: CWDE CDQ 指令 CWDE 将 16 位寄存器 AX 的符号位扩展到 32 位寄存器 EAX 的高 16 位中。 该指令是指 令 CBW 的扩展。 指令 CDQ 将寄存器 EAX 的符号位扩展到 EDX 的所有位。 该指令是指令 CWD 的扩展。 这些指令均不影响各标志。 4. 十进制调整指令组 十进制调整指令 DAA、 DAS、 AAA、 AAS、 AAM 和 AAD,这 6 条指令的功能与 8086/8088相同。 逻辑 运算和移位指令 80X86 的逻辑运算和移位指令包括逻辑运算指令、一般移位指令、循环移位指令和双精度移位指令。 1. 逻辑运算指令组 逻辑运算指令 NOT、 AND、 OR、 XOR 和 TEST 这 5 条指令,除了其操作数可以扩展到32 位外,其它功能与 8086/8088 相同。 2. 一般移位指令组 一般移位指令组含有 3 条指令: SAL/SHL、 SAR 和 SHR。 算术左移指令 SAL 和逻辑左移指令 SHL 是相同的。 80X86微机原理及接口技术实验教程 西安唐都科教仪器公司 9 从 80X86 开始,操作数可扩展到 32 位。 尽管这些指令的格式没有变化,但移位位数的表达增强了。 实际移位位数的变化范围是 0 至 31。 3. 循环移位指令组 循环移位指令组有 4 条指令: ROL、 ROR、 RCL 和 RCR。 从 80X86 开始,对循环指令 ROL 和 ROR 而言,实际移位的位数将根据被移位的操作数的长 度取 16或 32 位的模;对带进位循环移位指令 RCL 和 RCR 而言,移位位数先取指令中规定的移位位数的低 5 位,再根据被移位的操作数的长度取 17 或 32位的模。 4. 双精度移位指令组 双精度移位指令 SHLD 和 SHRD 从 80X86 开始才有,其格式如下: SHLD OPRD1, OPRD2, m SHRD OPRD1, OPRD2, m 其中, OPRD1 可以是 16 位通用寄存器、 16 位存储单元、 32 位通用寄存器或者 32 位存储单 元;操作数 OPRD2 的长度必须与操作数 OPRD1 和长度一致,并且只能是 16 位通用寄存器或者是 32 位通用寄存器; m 是移位位数,或者是 8 位立即数,或者是 CL。 双精度左移指令 SHLD 的功能是把操作数 OPRD1 左移指定的 m 位,空出的位用操作数OPRD2 高端的 m 位填补,但操作数 OPRD2 的内容不变,最后移出的位保留在进位标志 CF中。 如果只移 1 位,当进位标志和最后的符号位不一致是,臵溢出标志 OF,否则清 OF。 双精度右移指令 SHRD 的功 能是把操作数 OPRD1 右移指定的 m 位,空出的位用操作数OPRD2 低端的 m 位填补,但操作数 OPRD2 的内容不变,最后移出的位保留在进位标志 CF中。 当移位位数是 1 时, OF 标志受影响,否则清 OF。 控制转移指令 控制转移指令可分为以下 4 组:转移指令、循环指令、过程调用和返回指令、中断调用指令和中断返回指令。 1. 转移指令组 ( 1)无条件转移指令 无条件转移指令 JMP 在分为段内直接、段内间接、段间直接和段间间接四类的同时,还具有 扩展形式,扩展的无条件转移指令的转移目的地址偏移采用 32 位表示,段间转移 目的地址采用 48 位全指针形式表示。 在实模式下,无条件转移指令 JMP 的功能几乎没有提高。 尽管 80X86 的无条件转移指令允许把 32 位的段内偏移送到 EIP,但在实模式下段最大 64K,段内偏移不能超过 64K,所以不需要使用 32 位的段内偏移。 ( 2)条件转移指令 80X86 的条件转移指令(除 JCXZ 和 JECXZ 指令处)允许用多字节来表示转移目的地偏移 与当前偏移之间的差,所以转移范围可起出- 128~+ 127。 在 80X86 中,当寄存器 CX 的值为时,转移的指令 JCXZ 可以被扩展到 JECXZ,如: JECXZ OK 80X86微机原理及接口技术实验教程 西安唐都科教仪器公司 10 它 表示当 32 位寄存器 ECX 为 0 时,转移到标号 OK 处。 2. 循环指令组 循环指令组含有 3 条指令: LOOP、 LOOPZ/LOOPE 和 LOOPNZ/LOOPNE。 这三条循环指令的非扩展形式保持原功能。 它们的扩展形式使用 ECX作为计数器,即从 CX扩展到 ECX。 3. 过程调用和返回指令组 过程调用指令 CALL 在分为段内直接、段内间接、段间直接和段间间接四种的同时,还具有扩展形式。 扩展的调用指令的转移目的地址偏移采用 32 位表示。 对于扩展的段间调用指令,转移目的地址采用 48 位全指针形式表示,而且在把返回地址的 CS 压入堆 栈时扩展成高 16 位为 0 的双字,这样会压入堆栈 2 个双字。 过程返回指令 RET 在分为段内返回和段间返回的同时,还分别具有扩展形式。 扩展的过程返回指令要从堆栈弹出双字作为返回地址的偏移。 如果是扩展的段间返回指令,执行时要从堆栈弹出包含 48 位返回地址全指针的 2 个双字。 在实模式下,段内过程调用指令和返回指令 RET 的非扩展形式,它们与 8086/8088 的CALL 和 RET 相同。 4. 中断调用和中断返回指令组 在实模式下,中断调用指令 INT 和中断返回指令 IRET 的功能与 8086/8088 的相同。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。