好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

经典的80x86指令系统.docx

19页
  • 卖家[上传人]:飞***
  • 文档编号:44857725
  • 上传时间:2018-06-14
  • 文档格式:DOCX
  • 文档大小:32.12KB
  • / 19 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 80x86 指令系统 80x86 的指令系统可以分为以下 6 组: 数据传送类指令 算术指令 逻辑指令 串处理指令 控制转移指令 处理机控制指令 1、数据传送指令 数据传送类指令负责把数据、地址或立即数传送到寄存器或存储单元中它又可以分为五 种: 1.1、通用数据传送指令 MOV 传送 MOVSX 带符号扩展传送 MOVZX 带零扩展传送 PUSH 进栈 POP 出栈 PUSHA 所有寄存器进栈 POPA 所有寄存器出栈 XCHG 交换 (1)MOV 传送指令 格式为:MOV DST,SRC 执行操作:(DST)(OPR2) 该指令不影响标志位 1.2、累加器专用传送指令 IN 输入 OUT 输出 XLAT 换码 这组指令只限于使用累加器 EAX,AX 或 AL 传送信息 (1)IN 输入指令 长格式为: IN AL,PORT(字节) IN AX,PORT(字) IN EAX,PORT(双字) 执行的操作: (AL)<——(PORT) (字节) (AX)<——(PORT+1,PORT) (字) (EAX)<——(PORT+3,PORT+2,PORT+1,PORT) (双字) 短格式为: IN AL,DX(字节) IN AX,DX(字) IN EAX,DX(双字) 执行的操作: (AL)<——((DX) ) (字节) (AX)<——((DX)+1, (DX) ) (字) (EAX)<——((DX)+3, (DX)+2, (DX)+1, (DX) ) (双字) (2)OUT 输出指令 长格式为: OUT PORT,AL(字节)OUT PORT,AX(字) OUT PORT,EAX(双字) 执行的操作: (PORT)<——(AL) (字节) (PORT+1,PORT)<——(AX) (字) (PORT+3,PORT+2,PORT+1,PORT)<——(EAX) (双字) 短格式为: OUT DX,AL(字节) OUT DX,AX(字) OUT DX,EAX(双字) 执行的操作: ((DX) )<——(AL) (字节) ((DX)+1, (DX) )<——(AX) (字) ((DX)+3, (DX)+2, (DX)+1, (DX) )<——(EAX) (双字) 在 80x86 里,所有 I/O 端口与 CPU 之间的通信都由 IN 和 OUT 指令来完成。

      其中,IN 完成 从 I/O 到 CPU 的信息传送,而 OUT 则完成从 CPU 到 I/O 的信息传送CPU 只能用累加器 (AL,AX,EAX)接收或发送信息外部设备最多可有 65536 个 I/O 端口,端口号为 0000~FFFFH其中的前 256 个端口可以直接在指令中指定,这就是长格式中的 PORT,此时 机器指令用两个字节表示,第二个字节就是端口号当端口号大于等于 256 时,只能用短 格式,此时必须先把端口号放到 DX 寄存器中,然后再用 IN 或 OUT 指令来传送信息 输入、输出指令不影响标志位 (3)XLAT 换码指令 格式为:XALT OPR 执行的操作: 16 位指令:(AL)<——((BX)+(AL) ) 32 位指令:(AL)<——((EBX)+(AL) ) 经常需要把一种代码转换为另一种代码在使用这条指令之前,应先建立一个字节表格, 表格的首地址提前存入 BX 或 EBX 寄存器,需要转化的代码应该是相对于表格首地址的位 移量也提前存放在 AL 寄存器中,表格的内容则是所要换取的代码,该指令执行后就可在 AL 中得到转换后的代码 该指令不影响标志位 1.3、地址传送指令 LEA 有效地址送寄存器 LDS 指针送寄存器和 DS LES 指针送寄存器和 ES LFS 指针送寄存器和 FS LGS 指针送寄存器和 GS LSS 指针送寄存器和 SS 这一组指令完成把地址送到指定寄存器的功能 (1)LEA 有效地址送寄存器指令 格式为:LEA REG,SRC 执行的操作:(REG)<——SRC 指令把源操作数的有效地址送到指定的寄存器中 (2)LDS、LES、LFS、LGS 和 LSS 指针送寄存器和段寄存器指令格式为:LDS REG,SRC 执行的操作: (REG)<——(SRC) (SREG)<——(SRC+2) 或(SREG)<——(SRC+4) 该组指令的源操作数只能用于存储器寻址方式,根据任一种存储器寻址方式找到一个存储 单元的地址,当指令指定的寄存器是 16 位寄存器时,把该存储单元中存放的 16 位偏移地 址装入该寄存器中,然后把(SRC+2)中的 16 位数装入指令指定的段寄存器中;当指令指 定的是 32 位寄存器时,把该存储单元中存放的 32 位偏移地址装入该寄存器中,然后把 (SRC+4)中的 16 位数装入到指定的段寄存器中 本组指令不影响标志位 1.4、标志寄存器传送指令 LAHF 标志送 AH SAHF AH 送标志寄存器 PUSHF:标志进栈 POPF:标志出栈 (1)LAHF 标志送 AH 指令 格式为:SAHF 执行的操作:(AH)<——(FLAGS 的低字节) (2)SAHF AH 送标志寄存器 格式为:SAHF 执行的操作:(FLAGS 的低字节)<——(AH) 1.5、类型转换指令 CBW 字节转换成字 CWD 字转换成双字 CDQ 双字转换为 4 字 BSWAP 字节交换 (1)CBW 字节转换为字指令 格式:CBW 执行的操作:AL 的内容符号扩展到 AH,形成 AX 中的字 (2)CWD 字转换为双字指令 格式:CWD 执行的操作:AX 的内容符号扩展到 DX,形成 DX:AX 中的双字 (3)CDQ 双字转换为 4 字指令 格式:CDQ 执行的操作:EAX 的内容符号扩展到 EDX,形成 EDX:EAX 中的 4 字 (4)BSWAP 字节交换指令 格式:BSWAP r32 执行的操作:使指令指定的 32 位寄存器的字节次序变反 本组指令不影响标志位 2、算术指令 80x86 的算术运算指令包括二进制运算和十进制运算指令 2.1、加法指令 ADD 加法ADC 带进位加法 INC 加 1 XADD 交换并相加 (1)ADD 加法指令 格式:ADD DST,SRC 执行的操作:(DST)<——(SRC)+(DST) (2)ADC 带进位加法指令 格式:ADC DST,SRC 执行的操作:DST)<——(SRC)+(DST)+CF (3)INC 加 1 指令 格式:INC OPR 执行的操作:(OPR)<——(OPR)+1 (4)XADD DST,SRC 格式:XADD 交换并相加指令 执行的操作:TEMP<——(SRC)+(DST) (SRC)<——(DST) (DST)<——TEMP 除 INC 不影响 CF 标志外,本组指令都影响条件标志位 2.2、减法指令 SUB 减法 SBB 带借位减法 DEC 减 1 NEG 求补 CMP 比较 CMPXCHG 比较并交换 CMPXCHG8B 比较并交换 8 字节 (1)SUB 减法指令 格式:SUB DST,SRC 执行的操作:(DST)<——(DST)-(SRC) (2)SBB 带借位减法 格式:SBB DST,SRC 执行的操作:(DST)<——(DST)-(SRC)-CF (3)DEC 减一指令 格式:DEC OPR 执行的操作:(OPR)<——(OPR)-1 (4)NEG 求补指令 格式:NEG OPR 执行的操作:(OPR)<——0FFFFH-(OPR)+1 (5)CMP 比较指令 格式:CMP OPR1,OPR2 执行的操作:(OPR1)-(OPR2) 该指令与 SUB 指令一样执行减法,但它不保存结果,只是根据结果设置条件标志位。

      CMP 指令后往往跟着一条条件转移指令,根据比较结果产生不同的程序分支2.3、乘法指令 MUL 无符号数乘法 IMUL 带符号数乘法 (1)MUL 无符号数乘法指令 格式:MUL SRC 执行的操作: 字节操作数:(AX)<——(AL)*(SRC) 字操作数:(DX,AX)<——(AX)*(SRC) 双字操作数:(EDX,EAX)<——(EAX)*(SRC) (1)IMUL 带符号数乘法指令 格式:IMUL SRC 执行的操作:与 MUL 相同,但必须是带符号数,而 MUL 是无符号数 在乘法指令里,目的操作数必须是累加器,字运算为 AX,字节运算为 AL对于 MUL 指令, 如果乘积的高一半为 0,即字节操作的(AH)或字操作的(DX)或双字操作的(EDX)为 0,则 CF 位和 OF 位均为 0;否则,则 CF 位和 OF 位均为 1这样的条件码设置可以用来检 查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字,双字相乘的 结果是双字还是 4 字对于 IMUL 指令,如果乘积的高一半是低一半的符号扩展,则 CF 位 和 OF 位均为 0;否则,则 CF 位和 OF 位均为 1 2.4、除法指令 DIV 无符号数除法 IDIV 带符号数除法 (1)DIV 无符号数除法 格式:DIV SRC 执行的操作: 字节操作:16 位被除数在 AX 中,8 位除数为源操作数,结果的 8 位商在 AL 中,8 位余数 在 AH 中。

      表示为: (AL)<——(AX)/(SRC)的商 (AH)<——(AX)/(SRC)的余数 字操作:32 位被除数在 DX,AX 中其中,DX 为高位字,16 位除数为源操作数,结果的 16 位商在 AX 中,16 位余数在 DX 中表示为: (AX)<——(DX,AX)/(SRC)的商 (DX)<——(DX,AX)/(SRC)的余数 双字操作:64 位被除数在 EDX,EAX 中其中,EDX 为高位字,32 位除数为源操作数,结 果的 32 位商在 EAX 中,32 位余数在 EDX 中表示为: (EAX)<——(EDX,EAX)/(SRC)的商 (EDX)<——(EDX,EAX)/(SRC)的余数 商和余数均为无符号数 (2)IDIV 带符号数除法 格式:IDIV SRC 执行的操作:与 DIV 相同,但操作数必须是带符号数,商和余数也是带符号数 2.5、十进制运算指令二-十进制(BCD)是一种用二进制编码的十进制数它是用 4 位 2 进制数表示一个十 进制数码的,由于这 4 位二进制数的权为 8421,所以 BCD 码又成为 8421 码可以用压缩 的 BCD 码和非压缩的 BCD 两种格式来表示一个十进制数。

      压缩的 BCD 码用 4 位二进制数表示一个十进制数位,整个十进制数形成为一个顺序的以 4 位为一组的数串非压缩的 BCD 码则以 8 位表示一个十进制数位,8 位中的低 4 位是以 8421 码表示的十进制数位,而 高 4 位则没有意义 3、逻辑指令 3.1、逻辑运算指令 AND 逻辑与 OR 逻辑或 NOT 逻辑非 XOR 异或 TEST 测试 (1)AND 逻辑与指令 格式:AND DST,SRC 执行的操作:(DST)<——(DST)与(SRC) (2)OR 逻辑或指令 格式:OR DST,SRC 执行的操作:(DST)<——(DST)或(SRC) (3)NOT 逻辑非指令 格式:NOT OPR 执行的操作:(OPR)<——非(OPR) (4)XOR 异或指令 格式:XOR DST,SRC 执行的操作:(DST)<——(DST)异或(SRC) (5)TEST 测试指令 格式:TEST OPR1,OPR2 执行的操作:(OPR1)与(OPR2) 两个操作数相与的结果不保存,只根据其条件置条件码 NOT 指令不影响标志位,其他 4 种指令将使 CF 和 OF 位为 0,AF 位无定义,而 SF、ZF、PF 位则根据运算结果设置 3.2、位测试 BT 位测试 BTS 位测试并置 1 BTR 位测试并置 0 BTC 位测试并变反 (1)BT 位测试指令 格式:BT DST,SRC 执行的操作:把目的操作中由源操作数所指定的值送往标志位 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.