第二章 8086的指令系统(下)
写在前面:这一部分开始复习8086指令系统中关于串操作指令和处理机控制类指令的部分。如有错误欢迎指正,感谢!
1.串寻址方式源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:[SI]。
目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]
每执行一次串操作指令,SI和DI将自动修改:
执行CLD指令后,DF=0,对于字节串,地址指针+1,对于字串,地址指针+2;
执行STD指令后,DF=1,对于字节串,地址指针-1,对于字串,地址指针-2。对于字串,DI要为偶数,地址对齐。
2.串传送指令MOVSB/MOVSW
将串从原地址传送到目的地址。字节串传送MOVSB
①ES:[DI]←DS:[SI](一个字节)
②SI←SI±1,DI←DI±1字串传送MOVSW
①ES:[DI]←DS:[SI](两个字节)
②SI←SI±2,DI←DI±2
3.串存储指令STOSB/STOSW
将AL或者AX数据传送到目的地址。字节串存储STOSB
①ES:[DI]←AL
②DI←DI±1字串存储STOSW
①ES:[DI]←AX
②DI←DI±2
4.串读取LODSB/LODSW
把指定主存单元的数据传送给AL或AX。字节串读取LODSB
①AL←DS:[SI]
②SI←SI±1字串读取LODSW
①AL←DS:[SI](两个字节)
②SI←SI±2
4.串比较CMPSB/CMPSW
将主存中源操作数减去目的操作数,以便设置标志,进而比较两操作数之间的关系。字节串比较CMPSB
①DS:[SI]-ES:[DI]
②SI←SI±1,DI←DI±1字串比较CMPSW
①DS:[SI]-ES:[DI](两个字节)
②SI←SI±2,DI←DI±2
5.串扫描SCASB/SCASW
将AL/AX减去目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系。可用于在字符串中查找某个字或字节。字节串扫描SCASB
①AL-ES:[DI]
②DI←DI±1字串扫描SCASW
①AL-ES:[DI](两个字节)
②DI←DI±2
6.重复前缀指令
串操作指令每次只对一个字节或一个字量进行操作,但是串操作指令前可以加一个重复前缀,使得串操作指令重复进行。重复次数是CX寄存器的值。
7.REP重复前缀指令
当CX≠0时,继续进行。一般配合不影响标志位的MOVSB/MOVSW,STOSB/STOSW和LODSB/LODSW使用。
rep movsb
;等价于以下代码
again: movsb
dec cx
jnz again
8.REPZ/REPNZ重复前缀指令
一般配合影响标志位的CMPSB/CMPSW和SCASB/SCASW使用。可用于查找字串是否在主串中。REPZ/REPE:当CX≠0且ZF=1时,继续进行。
REPNZ/REPNE:当CX≠0且ZF=0时,继续进行。
9.空操作指令NOP
不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期。常用于程序调试:在需要预留指令空间时用NOP填充。
代码空间多余时也可以用NIP填充。
还可以用NOP实现软件延时等。
NOP指令和XCHG AX,AX的机器码都是90H。实际上,8086就是将NOP当做XCHG AX,AX处理。并且由于诸如XCHG BX,BX之类都至少占用两个字节,所以当做XCHG AX,AX最合适。在DOSBOX中验证
10*.封锁前缀指令LOCK
这是一个指令前缀,可以放在任何指令前。
在这个指令执行时,8086处理器的封锁输出引脚有效,即把总线封锁,使别的控制器不能控制总线;直到该指令执行完后,总线封锁解除。
11*.暂停指令HLT
暂停指令使CPU进入暂停状态,这时CPU不进行任何操作。当CPU发生复位或来自外部的中断时,CPU脱离暂停状态。
HLT指令可用于程序中等待中断。当程序中必须等待中断时,可用HLT,而不必用软件死循环。然后,中断使CPU脱离暂停状态,返回执行HLT的下一条指令。
12*.交权指令ESC
ESC 6位立即数,reg/mem
把浮点指令交给浮点处理器执行。
浮点协处理器8087指令是与8086的整数指令组合在一起的,当8086发现是一条浮点指令时,就利用ESC指令将浮点指令交给8087执行。
13*.等待指令WAIT
8086利用WAIT指令和测试引脚实现与8087同步运行。
浮点指令经由8086处理发往8087,并与8086本身的整数指令在同一个指令序列;而8087执行浮点指令较慢,所以8086必须与8087保持同步。
感谢阅读!