DJ12-1 8086 系列指令系统(第二节课)

目录

1. 通用数据传送指令

(1)MOV 一般数据传送指令

(2)堆栈操作指令

(3)XCHG 交换指令

(4)XLAT 查表指令

(5)CBW 和 CWD 字位扩展指令

2. 输入输出指令

3. LEA 取偏移地址指令

4. 其它传送类指令

(1)LDS 和 LES 装入地址指针指令

(2)标志传送指令


后续所用的符号说明:


数据传送指令 按功能可以分为:

  1. 通用数据传送指令
  2. 输入输出指令
  3. 目的地址传送指令
  4. 标志传送指令

FLAGS 不能作操作数。虽然不能直接对其进行操作,但是可以间接对其进行操作。

如:SAHF 把 AH 写入 FLAGS,CAHF 把 FLAGS 写入 AH 。

1. 通用数据传送指令

(1)MOV 一般数据传送指令

格式:MOV  Dest,Src

执行:Src → Dest

举例:MOV  AL,BL

对操作数的要求:

① 两操作数长度必须相同;

MOV  AX,BL(×)

MOV  AX,09H(√)

在可识别的情况下,编译器会自动把 09H 转换为 0009H 。实际上还是满足要求的。

MOV  AX,[SI]

根据 AX 是 16 位,会从 M 取出 16 位。

② 存储单元之间不能直接传送;

③ 段寄存器 CS 只能作源操作数,段寄存器之间不能直接传送;

④ 当源操作数是立即数时,目的操作数不能是段寄存器;

MOV  DS,1000H(×)应该修正为:

MOV  DX,1000H

MOV  DS,DX

⑤ FLAGS 一般不作为操作数在指令中出现。

(重点记背)MOV 传送指令的操作数:

应用举例:

例、判断下列指令的正确性。

例、将 * 的 ASCII 码 2AH 送入内存数据段 1010H 开始的 100 个单元中。

(2)堆栈操作指令

压栈指令格式:PUSH  OPRD

出栈指令格式:POP  OPRD

对操作数的要求:

① 指令的操作数必须是 16 位。

② 操作数可以是寄存器或存储器字单元,但不能是立即数。

这里的寄存器包括段寄存器和通用寄存器。

因为立即数无法作目的操作数,所以不适用于单操作数指令。

③ 不能从栈顶弹出一个字给 CS 。

原则上只有 MOV 中可以使用 CS,其它的都不让用。

④ PUSH 和 POP 指令在程序中一般成对出现。

⑤ PUSH 指令的操作方向是从高地址向低地址,而 POP 指令的操作正好相反。

应用举例:

PUSH 指令 执行过程:

POP 指令 执行过程:

PUSH 和 POP 指令在程序中一般成对出现,但有时候我们故意不按顺序,以实现交换的效果。例如交换 AX 和 BX 中的内容:

(3)XCHG 交换指令

格式:XCHG  OPRD1,OPRD2

执行:OPRD1 ←→ OPRD2

效果:交换源地址中的内容和目的地址中的内容。

对操作数的要求:

  • 操作数中至少有一个是通用寄存器,即不能同时为存储器。(可以同时为通用寄存器)
  • 段寄存器不能作操作数。(段寄存器主要适用于一般传送指令和堆栈操作指令)
  • 两个操作数的字长必须相同。

应用举例:

        XCHG  AX,BX

        XCHG  [2000],CL

(4)XLAT 查表指令

格式:XLAT

执行:[ BX + AL ] → AL

XLAT 查表指令的特点:

  • 指令为零操作数指令,采用隐含寻址。
  • BX 的内容为表格首地址,AL 的内容为表内位移量,  BX + AL 得到要查找元素的偏移地址。
  • 表格的最大长度不超过 256 字节

应用举例:

例、假设数据段中存放有一张 ASCII 码转换表,若首地址为 2000H,现欲查出表中第 11 个代码的 ASCII 码。

(5)CBW 和 CWD 字位扩展指令

功能:将带符号数的符号位扩展到高位。

注:默认将无符号数和带符号数一概视为带符号数。

指令为零操作数指令,采用隐含寻址,隐含的操作数为 AX 或 AX 和 DX 。

① CBW

        将 AL 的符号位扩展到 AH。

        若 AL 的最高位 = 1,则执行后 AH = 0FFH;

        若 AL 的最高位 = 0,则执行后 AH = 00H。

② CWD

        将 AX 的符号位扩展到 DX。

        若 AX 的最高位 = 1,则执行后 DX = 0FFFFH;

        若 AX 的最高位 = 0,则执行后 DX = 0000H。

例、判断下列指令的执行结果。

2. 输入输出指令

输入输出指令是专门面向 I/O 端口进行读写的指令,共有两条:IN 和 OUT 。输入指令 IN 用于从 I/O 端口读数据到累加器 AL 或 AX 中,而输出指令 OUT 用于把累加器 AL 或 AX 的内容写到 I/O 端口,即从 CPU 方面看,只有累加器 AL 或 AX 才能与 I/O 端口进行数据传送,所以输入输出指令又称累加器专用传送指令。

格式:

  • 输入指令:IN  Acc,Port
  • 输出指令:OUT  Port,Acc

Port 为端口地址,Acc 为累加器 AL 或 AX 。

注意:若端口号为 0 ~ 0FFH,那么我们可以直接使用端口号;否则,需要把端口号送入 DX,以 DX 内容去访问端口。

根据端口地址码的长度,指令具有两种不同的寻址方式。

① 直接寻址:端口地址为 8 位时,指令中直接给出 8 位端口地址;可寻址256个端口。

② 间接寻址:端口地址为 16 位时,指令中的端口地址必须由 DX 指定;可寻址 64K 个端口。

应用举例:

3. LEA 取偏移地址指令

格式:LEA  Reg16,Mem

LOAD EA,这里的 EA 指偏移地址。

效果:LEA 指令将存储器操作数的 16 位偏移地址送到指定的通用寄存器。

对操作数的要求:

  • 源操作数必须是存储器操作数;
  • 目的操作数必须是 16 位通用寄存器,而且最好是 间址寄存器

间址寄存器:BX、BP、SI、DI 。

应用举例:

4. 其它传送类指令

(1)LDS 和 LES 装入地址指针指令

格式:

  • LDS  Reg16,Mem32
  • LES  Reg16,Mem32

要求:Reg16 是任意一个 16 位通用寄存器,Mem32 必须是一个存储器操作数。

作用:低字单元内容为偏移量送入通用寄存器,高字单元内容为段基址送入 DS 或 ES。即把 Mem32 存储单元开始的 4 个字节单元的内容送入通用寄存器 Reg16 和段寄存器 DS(LDS指令)或 ES(LES指令)。

(2)标志传送指令

① LAHF:将 FLAGS 低 8 位的内容装入 AH 。

② SAHF:将 AH 的内容送给 FLAGS 的低 8 位。

③ PUSHF:将 FLAGS 的内容压栈保存。

④ POPF:将当前的栈顶内容送给 FLAGS 。

LAHF = Load AH FLAGS、SAHF = Save AH FLAGS

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值