微机原理与接口技术-第三章(8086/8088指令系统)

第三章

3.1指令格式

  • 操作码 [目标地址],[源操作数]

3.2寻址方式

1. 立即寻址: 对立即数进行的操作

  • 如:MOV AX,1200H

2. 寄存器寻址: 数据存放在指令规定的寄存器中.目标一般为通用寄存器.

  • 如:MOV AX,BX

3. 直接寻址: 段内偏移地址在指令码中,默认段地址在DS

  • 如: MOV AX, [1200H] ;其中1200H:十六位段内偏移地址,[]表示取地址

4. 寄存器间接寻址

  • 如:MOV AX,[BX];把BX作为偏移地址,以DS作为基地址,将计算得到得物理地址放到AX寄存器中.
  • 如: MOV [BP],AX;AX的值放入以BP为偏移地址,以SS为段地址通过计算得到的物理地址中.
    • 注意: 1. 寄存器间接寻址只针对BXSIDI, BP
    • 2. BX,SI,DI的默认地段寄存器为DS;BP的默认地段寄存器为SS.

5.寄存器相对寻址 :有效地址是一个8位或16位的位移量与一个基址寄存器或变址寄存器的内容之和.

  • 如:MOV [SI + 10H],AX;把AX的内容放到以DS为段地址,以SI+10H为偏移地址计算出来的物理地址中

6.基址变址寻址 : 有效地址是一个基址寄存器和一个变址寄存器内容之和.

  • 如: MOV [BX + DI ],AX; 将AX的内容放到以DS为段地址,以BX+DI为偏移地址计算出的物理地址中.

7. 基址变址且相对寻址:有效地址是一个8位或16位的位移量,一个基址寄存器,和一个变址寄存器内容三部分之和.

8. 隐含寻址: 隐藏操作数地址的部分,字符串操作类就属于这种寻址.

3.3指令系统

3.3.1数据传输指令

1. 通用数据传输指令:

  • MOV :
    • 格式: MOV DST,SRC;
    • 注意:
      • DST,SRC不能同时为存储器操作
      • DST,SRC数据类型须一致
      • DST,SRC不能同时为段寄存器
      • SRC为立即数时,DST不许为段寄存器
    • 总结:MOV指令可类似C语言中的赋值命令“=”
    • 交换指令XCHG:
      • 格式:XCHG DST,SRC;
      • 注意:
        • DST,SRC不能同时为存储器操作数;
        • 操作数数据类型必须一致;
      • 总结:数据的交换发生在通用寄存器和存储器里
    • 堆栈操作指令:(单操作数指令)
      • 格式:
        • 压栈:PUSH SRC;
        • 出栈指令:POP DST;
          在这里插入图片描述

2.地址传送指令

  • 取有效地址指令LEA
    • 格式:LEA REG,SRC;将SRC的有效地址传送到通用寄存器,REG为16位通用寄存器。
  • 指针送寄存器DS指令LDS
    • 格式:LDS REG,SRC;根据SRC操作的偏移地址,在数据段中取出段地址和偏移地址作为地址指针分别送到DSDST

3.累加器专用传送

  • 输入指令IN
    • 格式:
      • 直接寻址IN Acc,Port.经输入端口送入累加器中
      • 间接寻址IN Acc,DX
  • 输出指令OUT
    • 格式:
      • 直接寻址OUT Port, Acc;将累加器中的数据输出到指定的端口
      • 间接寻址OUT DX, Port
  • 查表指令XLAT
    • 格式:XLAT
    • (AL)<----((BX)+(AL)),以DS的内容为段基址,以BXAL内容之和为有效地址,取出表中的一个字节内容送入AL中。(BX:表头;AL:相对距离)

4.标志寄存器传送指令

  • 标志送AH指令:LAHF
    • 格式:LAHF;将PSW中的低八位送AH中,不影响标志位
  • AH送标志寄存器指令SAHF
    • 格式:SAHF;(PSW)低八位<——(AH)
  • 标志进栈指令PUSHF
    • 格式:PUSHF;将PSW压栈
  • 标志出栈指令
    • 格式:POPF;将当前栈顶的一个字传送到PSW中,影响标志位。

5.算术运算指令

  • 加法指令:ADD DST,SRC;(DST)<—(DST)+(SRC)
    • 注意:DST和SRC都不能为段寄存器
  • 带进位加法指令:ADC DST,SRC;(DST)<—(DST)+(SRC)+CF
    • 注意:DST和SRC都不能为段寄存器
  • 减法指令: SUB DST,SRC;(DST)<—(DST)-(SRC)
    • 注意:DST和SRC都不能为段寄存器
  • 带借位减法指令: SBB DST,SRC;(DST)<—(DST)-(SRC)-CF
    • 注意:DST和SRC都不能为段寄存器
  • 增量指令: INC DST;(DST)<—(DST)+1
    • 注意:DST不能为立即数和段寄存器
  • 减量指令: DEC DST;(DST)<—(DST)-1
    • 注意:DST不能为立即数和段寄存器
  • 比较指令: CMP DST,SRC;(DST)- (SRC)
    • 不返回结果,影响标志位
    • 注意:
      • 两个无符号数比较,看CF位,CF=0,A-B>0;CF=1,A-B<0;
      • 两个有符号数比较,看OF位
  • 求补指令: NEG DST;(DST)<—0-(DST)
    • DST不能为立即数和段寄存器,该指令可影响标志位
  • 无符号数乘法指令: MUL SRC;BYTE: (AX)<—(AL)X(SRC); WORD: (DX:AX)<—(AX)X(SRC)
  • 有符号数乘法指令: IMUL SRC;BYTE:(AX)<—(AL)X(SRC);WORD:(DX:AX)<—(AX)X(SRC)
    • 乘法指令的积采用补码表示,指令执行后,CF=OF=0 乘积高位无效;CF=OF=1 乘积高位有效
  • 无符号数除法指令: DIV SRC;BYTE: (AL)<—(AX/SRC) 商; (AH)<—余数
    WORD:(AX)<—(DX:AX/SRC) 商; (DX)<—余数
  • 有符号数除法指令: IDIV SRC;(同上)
    • 除法指令的商和余数采用补码表示,余数与被除数同符号

6.符号扩展指令

  • 字节转换字指令CBW: (AL)>>>>(AX)
  • 字转换双字指令CWD: (AX)>>>>>(DX:AX)
    • 对标志位无影响

7.逻辑运算指令

  • 逻辑与AND DST,SRC;(DST)<— (DST)&(SRC),常用于清零。

  • 逻辑或OR DST,SRC;(DST) <— (DST)|(SRC),常用于置一。

  • 逻辑异或XOR DST,SRC;(DST) <— (DST)^(SRC),常用于位取反。

  • 逻辑非NOT DST;(DST) <— (~DST)

  • 测试指令TEST DST,SRC;(DST)&(SRC),常用于检测某位是否为一。注意与比较指令的区别。

  • 算术左移指令: SAL DST,CNT.高位进CF,低位补零。

  • 逻辑左移指令: SHL DST,CNT;同SAL
    在这里插入图片描述

  • 算术右移指令: SAR DST,CNT;
    在这里插入图片描述

  • 逻辑右移指令: SHR DST,CNT;
    在这里插入图片描述

  • 循环左移:ROL DST,CNT;
    在这里插入图片描述

  • 循环右移: ROR DST,CNT;
    在这里插入图片描述

  • 带进位循环左移:RCL DST,CNT;
    在这里插入图片描述

  • 带进位循环右移: RCR DST,CNT;
    在这里插入图片描述

8.控制转移指令:

  • 无条件转移指令JMP
    • 段内直接转移
      • JMP SHORT OPR;段内段转移(IP)<—(IP)+D8
      • JMP NEAR PTR OPR;段内近转移 ( IP) <—(IP)+D16
    • 段内间接转移
      • JMP WORD PTR [REG] ; 转到以DS为段地址,以IP中存放的偏移地址计算出来的物理地址,其中IP中存放的偏移地址由[REG]给出。
    • 段间直接转移JMP FAR PTR OPR, OPR指定的段地址送CS,偏移地址送IP
    • 段间间接转移JMP DWORD PTR [REG]
  • 条件转移指令
    • 单标志条件转移指令
指令名称代表含义
JZZF=0JUMP
JNZZF=1JUMP
JSSF=1JUMP
JNSSF=0JUMP
JOOF=1JUMP
JNOOF=0JUMP
JPPF=1JUMP
JNPPF=0JUMP
JCCF=1JUMP
JNCCF=0JUMP
JB
JNB
JBE
JNBE
JL
JNL
JLE
JNLE
JCXZ

9.循环控制指令

  • LOOP循环指令LOOP OPR;(CX)<—(CX)-1,若CX !=0,则转到OPR。
  • LOOPZ/LOOPE为零/相等循环指令 LOOPZ OPR;(CX)<—(CX)-1,IF CX!=0,ZF=1,则转到OPR。
  • LOOPNZ/LOOPNE不为零/不相等循环指令

10. 过程调用指令

  • 段内直接调用 CALL NEAR OPR;
    • 首先将该指令下面一条指令的IP地址压入堆栈;
    • 其次将当前OPR段内偏移地址放到IP寄存器中;
      在这里插入图片描述
  • 段内间接调用 同上
  • 段间直接调用 CALL FAR PTR OPR;
    • 首先将该指令下一条指令的段地址和偏移地址压栈
    • 其次将OPR指定的段地址写到CS,偏移地址写到IP;
      在这里插入图片描述
  • 段间间接调用 同上
  • 过程返回指令 RET;

11.中断调用指令

  • INT指令
    • 格式:INT n;
      • a)将标志寄存器PSW压栈
      • b)清除TF和IF
      • c)将当前CS和IP压栈
      • d)nX4计算中断矢量表地址
        在这里插入图片描述
  • 溢出中断 OF=1中断
    • INTO 同上
  • 从中断返回指令 IRET
    • 功能: 返回主程序的中断断点处
      在这里插入图片描述

12.串操作指令

  • 重复前缀指令
    • REP: 重复串操作直到CX=0;
    • REPE/REPZ: 当相等CX=0/ZF=0为零时退出
    • REPNE/REPNZ: 重复串操作直到CX=0或ZF=1;
  • 传传送指令 MOVS/MOVSB/MOVSW
    • MOVS DST,SRC; (ES:DI)<—(DS:SI)
      在这里插入图片描述
  • 串储存指令STOS/STOSB/STOSW 将AX/AL的值存进ES:DI中
    在这里插入图片描述
  • 串装入指令 LODS
    • LODS/LODSB/LODSW :将DS:SI所指的源串元素装入寄存器AL或AX中
  • 串比较指令
    • CMPS/CMPSB/CMPSW DST,SEC; (DS:DI)-(ES:DI),影响标志位
  • 串扫描指令
    • SCAS/SCASB/SCASW DST;(AX/AL)-(ES:DI),影响标志位
  • 方向标指令
    • CLD: DF=0(递增方向);清除方向位
    • STD: DF=1(递减方向);置一方向位

13.处理器指令

  • 标志处理指令
指令名称指令描述
CLCCF=0
CMCCF=~CF
STCCD=1
CLDDF=0
STDDF=1
CLIIF=0
STIIF=1
  • 空操作指令NOP,占用三个机器周期
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The-Rich

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值