第三章后部分:
1、逻辑指令:逻辑运算指令(AND、OR、NOT、XOR、TEST)+移位指令(SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR)
(a)逻辑运算指令
注意:TEST指令的相与结果不保存,只设置标志位;
NOT指令的OPR不能为立即数,不影响标志位
除NOT以外的对标志位的影响:
(b)移位指令
OPR用除立即数外的任何寻址方式。循环次数由CNT决定。对于8086,CNT>1时,将循环次数放入CL中
算术逻辑指令适用于带符号数运算,SAL表示乘2,SAR表示除以2
逻辑移位指令用于无符号运算,SHL用来乘以2,SHR用来除以2
例题:
2、串处理指令
MOVS串传送指令、
CLD(clear direction flag):该指令使DF=0,在执行串处理指令时可使地址自动增量。
STD(set direction flag):该指令使DF=1,在执行串处理指令时可使地址自动减量。
注意:
LODS指令一般不与REP联用
源串一般在数据段中(允许使用段跨越前缀来修改)
目的串必须在附加段中
不影响条件标志位
与 REPE / REPZ(REPNE / REPNZ)配合工作的
CMPS 和 SCAS
REPE/REPZ:相等/为0则重复
REPNE/REPNZ:不相等/不为零则重复
过程:(1) 如 (CX)=0 或 ZF=0 (ZF=1) 则退出串操作,
否则转(2)
- (CX)←(CX) -1
- 执行 CMPS / SCAS
- 重复 (1) ~ (3)
SCAS指令把AL、AX、EAX内的内容与DI中内容比较,不保存结果,而是根据结果设置相应条件码
3、控制转移指令:无条件转移指令(JMP)、条件转移指令(JZ/JNZ、JE/JNE、JS/JNS、JO/JNO、JP/JNP、JB/JNB、JL/JNL、JBE/JNBE、JLE/JNLE、JCXZ)、循环指令(LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE)、子程序调用和返回指令(CALL、RET)、中断与中断返回指令(INT、INTO、IRET)
条件转移指令:
注意:只能使用段内直接寻址的8位位移量
PS:(JB:Jump if below;JA:Jump if above)
循环指令:
注意:CX中存放循环次数
只能使用段内直接寻址的8位位移量
4、子程序调用和返回指令(注意堆栈段的变化)
带立即数返回的 RET n
立即数n通常是正偶数。如果汇编格式指令中的n或表达式计算出的值是奇数,汇编时会自动变成n+1。
执行的操作:IP←(SP+1)(SP)
SP←SP+2
SP←SP+n
示意图:
5、中断指令:
INT指令可以指定0---0FFH中任何类型号。
中断向量表:
注意:
INT 隐含的类型号为3
INT指令把IF和TF(单步中断位)置0,但不影响其他标志位
IRET指令执行完,标志位由从堆栈中取出的值确定。
中断向量的设置
把由AL指定的中断类型的中断向量DS:DX放在中断向量表中。
预设:AH=25H;AL=中断类型号;DS:DX=中断向量
执行:INT 21H
取中断向量
把AL指定的中断类型的中断向量从中断向量表中取到ES:BX中
预设:AH=35H;AL=中断类型号
执行:INT 21H
返回时送:ES:BX=中断向量
中断过程:
(1)取中断类型号N;
(2)标志寄存器(FLAGS)内容入栈;
(3)当前代码段寄存器(CS)内容入栈;
(4)当前指令计数器(IP)内容入栈;
(5)禁止硬件中断和单步中断(IF=0,TF=0)
(6)从中断向量表中取4*N的字内容送IP,4*N+2的字内容送CS;
(7)转中断处理程序
例题:使用DOS功能调用存取中断向量
MOV AL,N ;type N interrupt
MOV AH,35H ;get interrput vector
INT 21H
PUSH ES ;save old base and offset of interrput N
PUSH BX
PUSH DS
MOV AX,SEG INTHAND
MOV DS,AX ;base of INTHAND in DS
MOV DX,OFFSET INTHAND ;offset in DX
MOV AL,N
MOV AH,25H
INT 21H
POP.......