目录
1. 通用数据传送指令
(1)MOV 一般数据传送指令
(2)堆栈操作指令
(3)XCHG 交换指令
(4)XLAT 查表指令
(5)CBW 和 CWD 字位扩展指令
2. 输入输出指令
3. LEA 取偏移地址指令
4. 其它传送类指令
(1)LDS 和 LES 装入地址指针指令
(2)标志传送指令
符号说明:
Acc 隐含规定使用 AL、AX(一般不用 AH)。
数据传送指令按功能可以分为:通用数据传送指令、输入输出指令、目的地址传送指令、标志传送指令。
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 个单元中。
CX 作计数器。
(2)堆栈操作指令
压栈指令格式:PUSH OPRD
出栈指令格式:POP OPRD
要求:
① 指令的操作数必须是 16 位。
② 操作数可以是寄存器或存储器字单元,但不能是立即数。
这里的寄存器包括段寄存器和通用寄存器。
因为立即数无法作目的操作数,所以不适用于单操作数指令。
③ 不能从栈顶弹出一个字给 CS。
原则上只有 MOV 中可以使用 CS,其它的都不让用。
④ PUSH 和 POP 指令在程序中一般成对出现。
⑤ PUSH 指令的操作方向是从高地址向低地址,而 POP 指令的操作正好相反。
PUSH 指令执行过程:
POP 指令执行过程:
PUSH 和 POP 指令在程序中一般成对出现,但有时候我们故意不按顺序,以实现交换的效果。
(3)XCHG 交换指令
格式:XCHG OPRD1,OPRD2
执行:OPRD1 ←→ OPRD2
效果:交换源地址中的内容和目的地址中的内容。
要求:
- 操作数中至少有一个是通用寄存器,即不能同时为存储器。
- 段寄存器不能作操作数。(段寄存器主要适用于一般传送和堆栈操作)
- 两个操作数的字长必须相同。
举例:
XCHG AX,BX
XCHG [2000],CL
(4)XLAT 查表指令
格式:XLAT
执行:[ BX + AL ] → AL
特点:
- 指令为零操作数指令,采用隐含寻址。
- 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 Acc,Port
- 输出指令:OUT Port,Acc
Port 为端口地址,Acc 为累加器 AL 或 AX。
若端口号为 0 ~ 0FFH,那么我们可以直接使用端口号;否则,需要把端口号送入 DX,以 DX 内容去访问端口。
根据端口地址码的长度,指令具有两种不同的寻址方式。
① 直接寻址
端口地址为 8 位时,指令中直接给出 8 位端口地址;可寻址256个端口。
② 间接寻址
端口地址为 16 位时,指令中的端口地址必须由 DX 指定;可寻址 64K 个端口。
举例:
IN AX,80H
MOV DX,2400H
IN AL,DX
OUT 35H,AX
OUT DX,AX
3. LEA 取偏移地址指令
格式:LEA Reg16,Mem
LOAD EA,这里的 EA 指偏移地址。
效果:LEA 指令将存储器操作数的 16 位偏移地址送到指定的通用寄存器。
要求:
- 源操作数必须是存储器操作数;
- 目标操作数必须是 16 位通用寄存器,而且最好是间址寄存器。
例题、
4. 其它传送类指令
(1)LDS 和 LES 装入地址指针指令
格式:
- LDS Reg16,Mem32
- LES Reg16,Mem32
要求:REG16 任意一个 16 位通用寄存器,Mem32 必须是一个存储器操作数。
作用:
- 把 Mem32 存储单元开始的 4 个字节单元的内容送入通用寄存器和段寄存器 DS(LDS指令)或ES(LES指令)。
- 低字单元内容为偏移量送通用寄存器,高字单元内容为段基值送 DS 或 ES。
(2)标志传送指令
(1)LAHF:将 FLAGS 低 8 位的内容装入 AH。
(2)SAHF:将 AH 的内容送给 FLAGS 的低 8 位。
(3)PUSHF:将 FLAGS 的内容压栈保存。
(4)POPF:将当前的栈顶内容送给 FLAGS。