指令系统按功能分为
数据传送类,算术运算类,逻辑运算与移位类,串操作类,控制转移类,处理机控制(不用在意这个),输入输出,中断等
数据传送类指令
实现CPU内部寄存器之间,CPU与存储器之间,CPU与I/O端口之间的数据传送.
1.通用数据传送指令
①一般数据传送指令MOV(8/16位)
格式: MOV OP目, OP源
要求:
OP目 可以是寄存器(除CS外),存储器
OP源 可以是寄存器,存储器和立即数
例:
MOV AL, BL; BL寄存的内容送AL
MOV SP, 2AC0H; 立即数2AC0H送SP
MOV [DI], AX; AX中的16位数送DI和DI+1单元
MOV SI, ES:[BP]; 附加段中BP所指向的两个单元的内容送SI寄存器.
MOV WORD PTR [SI], 6070H; 立即数6070H送到SI字单元
WORD PTR是什么? 一个声明 字声明(16位)
还有BYTE声明(8位)
若有寄存器参与寻址无需声明,若没有则需声明类型
注意:
MOV指令的两个操作数(源,目的)均可采用不同的寻址方式.
源操作数和目的操作数的类型必须一致.
不允许把立即数作目的操作数,也不允许向段寄存器送立即数.
不允许在段寄存器之间,存储器单元之间传送数据.
CS,IP寄存器不能用作目的操作数.
一般传送指令不影响标志位.
②堆栈操作指令
堆栈:是按"后进先出"原则工作的一段存储器区域.
堆栈寄存器SS--段地址.
堆栈指针SP--始终当前栈顶所在的存储单元地址,即最新入栈数据所在的存储单元的地址.
压栈操作: PUSH OP
功能:把OP字数据压入栈中,结果SP-2->SP (SP指针 每次自减) (一次只能压16位)
所以从高向低
原则:高字节压在高地址,低字节压在低地址.
例:
PUSSH AX
SP-1 → SP, 压AH
SP-1 → SP, 压AL
执行过程:
SP⬅SP-1: [SP]⬅OPH
SP⬅SP-1: [SP⬅OPL
出栈操作: POP OP
功能:从栈中弹出数据→OP, 结果SP+2→SP
执行过程:
OPL⬅[SP]; SP⬅SP+1
OPH⬅[SP]; SP⬅SP+1
例: POP DX
弹出AL→DL, SP+1→SP
弹出AH→DH,SP+1→SP
注意:
·堆栈操作总是按字(16位)进行的.
·压入指令,SP-2,数据在栈顶.弹出指令正好相反.
·操作数可以是存储器,寄存器或段寄存器操作数(CS不能用于POP),不能是立即数.
PUSH CS POP CS ×
PUSH 1200H × POP 2300H √
·这两条指令主要用来进行现场保护和恢复,以保证子程序调用或中断程序的正常返回.
③数据交换指令(8/16位)
格式: XCHG OP1, OP2
功能: 实现OP1和OP2内容的相互交换.
操作数:通用寄存器或存储器,但不能同为内存单元.
注意:段寄存器和IP不能作为交换指令的操作数.
例:
XCHG AX, BX √
XCHG BH, BL √
XCHG AX, 1122H ×
XCHG DS, AX ×
XCHG [SI], BP √
XCHG [SI], [DI] ×
④换码指令(查表指令,翻译指令)
格式:XLAT
BX存基地址,AL存偏移量
个人理解:BX和AL相加,其指向的内容放进AL.
2.目标地址传送指令
此类指令的功能是将操作数所在存储器的地址送入目标寄存器.
注意:
1.OP源必须是存储器操作数,OP目必须是16位的通用寄存器.
2.地址传送指令不影响状态标志位
①取有效地址EA指令:
格式:LEA OP目, OP源
功能:将源操作数的有效地址EA送到目的操作数.
例:
LEA AX, [5678H]; AX⬅5678H
LEA AX, [BP+SI]; BX⬅BP + SI
②指针送寄存器和DS指令
格式:LDS OP目, OP源
功能:把OP源指定的四个字节内容(32位)取出,低地址的两字节→OP目,高地址的两字节→DS.
例:
LDS DI, [2130H]; 2130H和2131H单元中的内容→DI; 2132H和2133H单元中的内容→DS.
③指针送寄存器和ES指令
格式: LES OP目, OP源
功能:本指令与LDS指令的操作基本相同,所不同的是将OP源4个字节中高地址的两字节→ES
例:
LDS DI, [2130H]; 2130H和2131H单元中的内容→DI; 2132H和2133H单元中的内容→ES.
3.标志寄存器传送指令
①读取标志指令
②设置标志指令
③对标志寄存器的堆栈操作指令