目录
后续所用的符号说明:
数据传送指令 按功能可以分为:
FLAGS 不能作操作数。虽然不能直接对其进行操作,但是可以间接对其进行操作。
如:SAHF 把 AH 写入 FLAGS,CAHF 把 FLAGS 写入 AH 。
格式: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 个单元中。
压栈指令格式:PUSH OPRD
出栈指令格式:POP OPRD
对操作数的要求:
① 指令的操作数必须是 16 位。
② 操作数可以是寄存器或存储器字单元,但不能是立即数。
这里的寄存器包括段寄存器和通用寄存器。
因为立即数无法作目的操作数,所以不适用于单操作数指令。
③ 不能从栈顶弹出一个字给 CS 。
原则上只有 MOV 中可以使用 CS,其它的都不让用。
④ PUSH 和 POP 指令在程序中一般成对出现。
⑤ PUSH 指令的操作方向是从高地址向低地址,而 POP 指令的操作正好相反。
应用举例:
PUSH 指令 执行过程:
POP 指令 执行过程:
PUSH 和 POP 指令在程序中一般成对出现,但有时候我们故意不按顺序,以实现交换的效果。例如交换 AX 和 BX 中的内容:
格式:XCHG OPRD1,OPRD2
执行:OPRD1 ←→ OPRD2
效果:交换源地址中的内容和目的地址中的内容。
对操作数的要求:
应用举例:
XCHG AX,BX
XCHG [2000],CL
格式:XLAT
执行:[ BX + AL ] → AL
XLAT 查表指令的特点:
应用举例:
例、假设数据段中存放有一张 ASCII 码转换表,若首地址为 2000H,现欲查出表中第 11 个代码的 ASCII 码。
功能:将带符号数的符号位扩展到高位。
注:默认将无符号数和带符号数一概视为带符号数。
指令为零操作数指令,采用隐含寻址,隐含的操作数为 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。
例、判断下列指令的执行结果。
输入输出指令是专门面向 I/O 端口进行读写的指令,共有两条:IN 和 OUT 。输入指令 IN 用于从 I/O 端口读数据到累加器 AL 或 AX 中,而输出指令 OUT 用于把累加器 AL 或 AX 的内容写到 I/O 端口,即从 CPU 方面看,只有累加器 AL 或 AX 才能与 I/O 端口进行数据传送,所以输入输出指令又称累加器专用传送指令。
格式:
Port 为端口地址,Acc 为累加器 AL 或 AX 。
注意:若端口号为 0 ~ 0FFH,那么我们可以直接使用端口号;否则,需要把端口号送入 DX,以 DX 内容去访问端口。
根据端口地址码的长度,指令具有两种不同的寻址方式。
① 直接寻址:端口地址为 8 位时,指令中直接给出 8 位端口地址;可寻址256个端口。
② 间接寻址:端口地址为 16 位时,指令中的端口地址必须由 DX 指定;可寻址 64K 个端口。
应用举例:
格式:LEA Reg16,Mem
LOAD EA,这里的 EA 指偏移地址。
效果:LEA 指令将存储器操作数的 16 位偏移地址送到指定的通用寄存器。
对操作数的要求:
间址寄存器:BX、BP、SI、DI 。
应用举例:
格式:
要求:Reg16 是任意一个 16 位通用寄存器,Mem32 必须是一个存储器操作数。
作用:低字单元内容为偏移量送入通用寄存器,高字单元内容为段基址送入 DS 或 ES。即把 Mem32 存储单元开始的 4 个字节单元的内容送入通用寄存器 Reg16 和段寄存器 DS(LDS指令)或 ES(LES指令)。
① LAHF:将 FLAGS 低 8 位的内容装入 AH 。
② SAHF:将 AH 的内容送给 FLAGS 的低 8 位。
③ PUSHF:将 FLAGS 的内容压栈保存。
④ POPF:将当前的栈顶内容送给 FLAGS 。
LAHF = Load AH FLAGS、SAHF = Save AH FLAGS