MENU

「8088/8086指令型语句」

2021 年 03 月 29 日 • 编程

双操作数指令大部分与 MOV指令一样,单操作数指令不可使用立即数,并且储存器寻址需要附带 PTR

数据传输指令

  • CBW字位扩展指令 8位到16位,将AL扩展到AX

    • AL最高位置位,AH=FFH
    • AL最高位复位,AH=00H
    • 无符号数,AH=00H
  • CWD字位扩展指令 16位到32位,将AX扩展到 DX AX

    • AX最高位置位,DX=FFFFH
    • AX最高位复位,DX=0000H
    • 无符号数,DX=0000H
  • MOV数据传送指令

    • MOV AX,1234H立即寻址
    • MOV AL,AH 寄存器寻址
    • MOV AX,[1234H]直接寻址
    • MOV AX,[SI]寄存器间接寻址
    • MOV AX,36H[BX]基址/变址寻址
    • MOV AX,36H[BX][SI]基址 + 变址寻址
  • PUSH POP堆栈操作指令,操作数需为寄存器或内存单元,不可以使用立即数,并且需声明字长
  • XCHG REG/MEM,REG/MEM交换指令,不允许操作数为立即数,并且至少有一个操作数是寄存器
  • IN OUT输入输出指令

    • IN AL/AX,PORT/DX输入指令,从端口地址读取数据到累加器 AL/AX
    • OUT PORT/DX,AL/AX输出指令,将累加器 AL/AX 的数据写入到端口
    • 直接寻址,当端口地址为 8 位时,可以直接在指令中给出,寻址范围是 256
    • 间接寻址,当端口地址为 16 位时,端口地址必须由DX寄存器给出,寻址范围是 64K
  • XLAT查表指令,BX为表首地址,AL为表内位移量,相加得到查找元素的偏移地址,读取传送给AL
  • LEA LEA REG,MEM地址传送指令,用于近地址传送,将 16 位偏移地址写入目标寄存器
  • LDS地址传送指令,和LEA一样,另外将原操作数的段地址传送给DS
  • LES地址传送指令,和LEA一样,另外将原操作数的段地址传送给ES
  • LAHF标志传送指令,将FLAGS的低 8 位传送到AH
  • SAHF标志传送指令,将AH传送到FLAGS的低 8 位
  • PUSHFFLAGS压入到堆栈
  • POPF将 栈顶数据弹出到FLAGS

算术运算指令

  • INC自增指令,不影响CF标志位
  • DEC自减指令,不影响CF标志位
  • ADD加法指令,影响 6 个标志位
  • ADC加法指令,附带CF的加法,多数用于 32 位计算
  • SUB减法指令,影响六个标志位
  • SBB减法指令,附带CF的减法,多数用于 32 位计算
  • NEG 0-OPRD 求补指令,影响六个标志位,操作数为 0 的时候不影响CF
  • CMP比较指令

    • CMP AX,BX两个无符号数比较

      • AX≥BX那么 CF=0
      • AX<BX那么 CF=1
      • AX=BX那么 CF=0 ZF=1
    • CMP AX,BX两个有符号数比较

      • AX≥BX那么 OF==SF
      • AX<BX那么 OF!=SF
  • MUL IMUL乘法指令

    • AL AX被乘数
    • AX DX计算结果
    • MUL OPRD操作数不能为立即数
    • 有符号数,用两个操作数的补码做乘法运算,然后取结果的 补码
  • DIV IDIV除法指令

    • 被除数一定是除数的双倍字长

      • 若操作数为 8 位,AX/OPRD=AL余数为AH
      • 若操作数为 16 位,DXAX/OPRD=AX余数为DX
  • 以上算术运算类指令,双操作数指令对操作数的要求与 MOV一样,对单操作数指令要求操作数不能为立即数

逻辑运算指令

NOT指令,其他位运算指令都会影响除 AF 外的标志位,无论计算结果,OFCF都会清零

  • AND位与指令,两个操作数按位相与,结果送入目标操作数
  • OR位或指令,两个操作数按位相或,结果送入目标操作数
  • XOR异或指令,两个操作数按位相或,结果送入目标操作数
  • TEST测试指令,两个操作数按位相与,没有结果,效果与 CMP相似
  • NOT非指令,操作数不可以是立即数,将操作数按位取反,然后送回源地址

非循环位移指令

位移指令是双操作数格式,但是本质是单操作数,当位移次数为 1 时,可以使用立即数,否则必须使用 CL

  • 算术位移指令

    • SAL左移,针对的有符号数,将最高位移到 CF,最低位补 0
    • SAR右移,针对的有符号数,将最低位移到 CF,最高位补 符号位
  • 逻辑位移指令

    • SHL左移,针对的无符号数,将最高位移到 CF,最低位补 0
    • SHR右移,针对的无符号数,将最低位移到 CF,最高位补 0
  • 左移指令可以实现乘法,右移指令可以实现除法

循环位移指令

  • 不带进位的循环位移

    • ROL左移,将最高位移到 CF,同时将最高位移动到最低位
    • ROR右移,将最低位移到 CF,同时将最低位移动到最高位
  • 带进位的循环位移

    • RCL左移,首先CF移动到最低位,然后将最高位移动到 CF
    • RCR右移,首先CF移动到最高位,然后将最低位移动到 CF
  • 循环位移指令可以实现对某些位状态的测试
  • 高位部分与低位部分的交换
  • 与非循环位移指令一起组成 32 位或更长的位移

串操作指令

  • 串操作执行必要的条件

    • 串的源地址,一般存放在数据段 DS,偏移地址由 SI决定
    • 串的目标地址,必须存放在附加段 ES,偏移地址由 DI决定
    • 串的长度,由 CX来决定
    • 串的操作方向,由 EFLAH.DF标志位来决定,0 为增,1 为减
  • 指令重复前缀

    • REP无条件重复,当 CX!=0时,指令继续执行
    • ERPE REPZ相等重复,当 CX!=0并且 ZF==1时,指令继续执行
    • ERPNE REPNZ不相等重复,当 CX!=0并且 ZF==0时,指令继续执行
    • 无条件重复前缀通常后面跟串传送和串送存
    • 条件重复前缀通常后面跟串比较和串扫描
    • 重复前缀不影响 ZF标志位
  • 操作指令

    • MOVSB MOVSW串传送指令,将源数据地址的数据传送到目标数据地址
    • CMPSB CMPSW串比较指令,会影响全部标志位
    • SCASB SCASW串扫描指令,扫描串内存中是否有 AX AL中的值
    • LODSB LODSW串装入指令,将操作数的内容装入 AX AL
    • STOSB STOSB串送存指令,将 AX AL 装入操作数储存器中

转移指令

  • 无条件转移指令,范围在 16 位段内偏移或 32 位段间地址

    • JMP近跳转操作数默认为当前段基地址的偏移,可通过 JMP FAR来远跳转
  • 条件转移指令,范围在IP为中心的 -128~127字节

    • JC/JNC前者CF==1的时候转移,后者CF==0的时候转移
    • JZ/JNZ前者ZF==1的时候转移,后者ZF==0的时候转移
    • JO/JNO前者OF==1的时候转移,后者OF==0的时候转移
    • JS/JNS前者SF==1的时候转移,后者SF==0的时候转移
    • [JP JPE]/[JNP JPO]前者PF==1的时候转移,后者PF==0的时候转移
    • JA/JAE/JB/JBE判断CFCF+ZF的状态,常用于无符号数大小的比较
    • JG/JGE/JL/JLE判断 SF+OFSF+OF+ZF的状态,常用于有符号数大小的比较
    • JCXZCX==0的时候转移

循环控制指令

范围在IP为中心的 -128~127字节,次数由 CX指定

  • LOOP无条件循环控制指令,先执行 CX-1,然后判断 CX!=0
  • LOOPZ条件循环控制指令,先执行 CX-1,然后判断CX!=0并且ZF==1
  • LOOPNZ条件循环控制指令,先执行 CX-1,然后判断CX!=0并且ZF==0

过程调用指令

执行结束后需要返回,所以需要保护返回地址

  • CALL调用指令,将返回地址压入栈顶,然后跳转到目标地址
  • RET返回指令,跳转到栈顶数据的地址,并将栈顶的数据弹出

中断指令

中断是由异常事件或者随机事件引起的,中断发生后会保存断点地址和 FLAGS

  • INT中断指令,操作数为中断向量表Index中断向量表位于内存的 0H大小为 0x400,这个区域属于数据段,所以段地址为 DS
  • 中断指令执行流程

    • 按顺序将 FLAGS CS IP压入堆栈
    • 通过 Index得到中断向量表中的 32 位向量的地址
    • 将上一步的向量的地址送入 CS:IP
    • 于是程序会从中断向量开始执行中断处理函数
  • IRET中断返回指令

    • 按顺序将IP CS FLAGS 从堆栈内弹出,恢复到寄存器

处理器控制指令

这一类指令,全部是对处理器进行控制的指令,并且全部没有操作数

  • 标志位操作指令

    • CLC CF=0将进位标志位清零
    • STC CF=1将进位标志位置位
    • CMC ~CF将进位标志位取反
    • CLD DF=0方向标志位清零,串操作由低到高
    • STD DF=1方向标志位置位,串操作由高到低
    • CLI IF=0中断标志位清零,关中断
    • STI IF=1中断标志位置位,开中断
  • 外同步指令

    • HLT暂停指令,暂停处理器的运行
    • WAIT等待指令,让处理器处于等待状态,检测到TEST==0以后,恢复运行
    • ESC换码/交权指令,执行以后,将调用协处理器工作,协处理器可以接收 8086 指令流的指令,并且可以使用 8086 的寻址方式对储存器进行寻址
    • LOCK锁总线指令,LOCK属于一个指令前缀,可以放在任何一条指令前面,可以实现封锁总线,使其他处理器得不到总线控制权
    • NOP空操作指令,不进行任何操作,常用于处理器的延时