一、串操作类指令
”串“就是内存中一段地址相连的字节或字;
串操作,也叫数据块操作;
可实现存储器数据间的直接传送;
8086有5中基本串操作:
MOVS 串传送指令
CMPS 串比较指令
SCAS 串扫描指令
LODS 取串指令
STOS 存串指令
1.串传送指令 MOVS
串传送有2种格式:
(1)MOVSB
字节传送;把数据段中SI寻址的数据传送到附加段种DI寻址的存储区域中;然后修改SI、DI。
MOVSW 字传送
(ES:DI)<-(DS:SI)
(SI)<-(SI) +/- 1;(DI)<-(DI) +/- 1
当方向标志 D=0 时用 ”+“,D=1时用”-“。
(2)MOVSW
操作;字传送;
(ES:DI)<-(DS:SI)
(SI)<-(SI) +/- 2;(DI)<-(DI) +/- 2
当方向标志 D=0 时用 ”+“,D=1时用”-“。
该指令可以实现从存储器到存储器的数据传送,而且传非常简便。
2、REP 重复串操作执行
过程:
(1)当(CX)!=0, (CX)<-(CX)-1,
执行REP后的串指令。
(2)当(CX)=0,结束REP,
执行下一条指令。
3、从串中取数指令 LODS
有2种格式:
(1)LODSB(字节);
(AL)<-(DS:SI), (SI)<-(SI)+/-1
(2)LODSW(字);
(AL)<-(DS:SI), (SI)<-(SI)+/-2
功能:该指令把由SI指定的数据段中某单元内容赋给AL或AX。
4、存入串指令 STOS
有2种格式:
(1)STOSB(字节);
(ES:DI)<-(AL), (DI)<-(DI)+/-1;
(2)STOSB(字);
(ES:DI)<-(AL), (DI)<-(DI)+/-2;
与REP 联用时,可用来建立一串相同的值,串长度由CX内容决定。
5、串比较指令 CMPS
2种格式:
(1)CMPSB(字节)
(2)CMPSW(字)
执行操作:
(ES:DI)-(DS:SI),结果不存,置标志。
字节操作:(SI)<-(SI)+/-1, (DI)<-(DI)+/-1
字操作:(SI)<-(SI)+/-2, (DI)<-(DI)+/-2
6、传扫描指令 SCAS
有2种格式:
(1)SCASB (字节)
(AL)-(ES:DI)
(DI)<-(DI)+/-1
(2)SCASW(字)
(AX)-(ES:DI)
(DI)<-(DI)+/-2
两数相减,只影响标志,不影响操作数。
CMOS和SCAS可与前缀
REPE/REPZ 和 REPNE/REPNZ 联合工作
①REPE/REPZ
当相等/为零时重复串操作
②REPNE/REPNZ
当不相等/不为零时重复串操作
二、程序控制类指令
控制传送指令包括四种:
转移指令,
循环控制指令,
过程调用指令,
中断指令。
1、转移指令
转移指令控制程序从一处转移到另一处执行。
在CPU内部,转移是通过将目标地址传送给IP来实现的。
转移指令包括两种:无条件转移指令,条件转移指令
(1)无条件转移指令 JMP(Jump)
格式:JMP 语句标号
JMP LP;
(2)条件转移指令
Ⅰ、根据单个条件标志转移
① Z标志
JZ/JNZ
Jump on Zero;Jump on no Zero
② C标志
JC/JNC
Jump if Carry
③ P标志
JP(JPE)/JNP(JPO)
Jump on parity;Jump on Even;Jump on Odd
④ S标志
JS(负号跳转)/JNS
⑤ O标志
JO(溢出跳转)/JNO
Ⅱ、根据两个无符号数大小关系转移
JB(低于跳转)、JNAE;JNB、JAE
JBE(不高于跳转)、JNA;JNBE、JA(高于跳转)
JB: Jump on Below;
JAE:Jump on Above or Equal
Ⅲ、根据两个带符号数比较结果转移
JL(JNGE)/JNL(JGE) : 小于跳转/不小于跳转
JLE(JNG)/JNLE(JG)
L-Less ; G-Greadt; E-Equal
注意:所有条件转移指令都是段内(-128~+127)范围内转移
2、过程(子程序)调用指令
子程序——程序中具有独立功能的部分编写乘独立程序模块。
子程序调用:
CALL 子过程名
返回指令RET(return):
在子程序的结尾,用来返回主程序。
3、循环控制指令
(1)无条件循环
LOOP 语句标号
执行操作:
① (CX)<-(CX)-1
②若CX != 0,转向目标地址去执行;否则 执行LOOP指令之后的指令。
解释:遇到这条指令,首先执行CX = CX-1;
然后判断CX的值,若CX != 0,则转移到Lable处执行程序,否则向下继续执行。
(2)条件循环
Ⅰ、LOOPZ/LOOPE 语句标号
执行操作:
①(CX)<-(CX)-1
②若CX != 0 且Z=1,转向目标地址去执行;否则执行LOOP指令之后的指令。
LOOPZ/LOOPE Lable
解释:遇到这条指令,首先执行CX = CX-1;然后判断,若CX!=0并且同时ZF=1,则转到Lable处执行程序,否则向下继续执行,当进行循环的时候,如果遇到CX=0或者ZF=0,则终止循环。
Ⅱ、LOOPNZ/LOOPNE 语句标号
执行操作:
①(CX)<-(CX)-1
②若CX != 0 且Z=0,转向目标地址去执行;否则执行LOOP指令之后的指令。
注意: 条件循环只允许段内循环;
跳转范围(-128~127)。
LOOPNZ/LOOPNE Lable
解释:遇到这条指令,首先执行CX = CX-1;然后判断,若CX!=0并且同时ZF=0,则转到Lable处执行程序,否则向下继续执行,当进行循环的时候,如果遇到CX=0或者ZF=1,则终止循环。
4、中断指令
(1)中断调用:INT n
n-中断号,0~255
(2)中断返回:IRET
三、处理器控制类指令
1、标志处理指令
清除指令/设置指令
CLC 清C标志
STC 置C标志
CMC 对C求反
CLD 清D标志
STD 置D标志
CLI 清I标志
STI 置I标志
2、其他处理器控制指令
NOP 空操作
HLT CPU暂停状态
WAIT CPU等待状态
ESC 交权
LOCK (Lock bus) 总线锁定
总结
8086/8088CPU指令按其功能可以分为6类,他们是:
(1)数据传送类指令
(2)算数运算类指令
(3)位操作类指令
(4)串操作类指令
(5)程序控制类指令
(6)处理器控制类指令