1、ret指令
ret指令用栈中的数据,修改IP的内容,从而实现近转移!
CPU执行ret指令时,进行2步操作:i>、(IP) = ((ss)*16 + (sp))、ii>、(sp) = (sp)+2
CPU执行ret指令,相当于:pop IP;
CPU执行retf指令,相当于pop IP pop CS;
2、call 标号
CPU执行call指令时,进行如下的2步操作:
(1)、(sp) = (sp)-2 ((ss)*16+(sp)) = (IP):
(2)、(IP) = (IP) + 16位位移;
3、mul指令
mul是乘法指令,相乘的2个数,要么都是8位的,要么都是16位的;
一般都是对AX寄存器来进行操作;
4、标志寄存器
flag(就是标志寄存器)是将要学到的最后一个寄存器;
8086CPU的标志寄存器都是16位的,其中存储的信息通常被称为程序状态字(PSW);
8086CPU的指令集中,add、sub、mul、div、inc、or、and等都是运算指令,影响标志寄存器;
mov、push、pop等,大都是传送指令,对标志寄存器没有影响;
flag是按位起作用的,它的每一个位都有专门的含义,记录特定的信息;
其结构模型图:
flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何意义,而0、2、4、6、7、8、9、10、11位都具有特殊的含义.
(1)、ZF:零标志位,它记录相关指令执行后,结果为0,ZF=1,结果不为0,ZF=0;
例:
mov ax, 1 sub ax, 1
指令执行后,结果为0,则ZF=1;
(2)、PF:奇偶标志位,记录指令执行后,结果的所有二进制位中1的个数;为偶数个,PF=1;为奇数个,PF=0;
(3)、SF:符号标志位,记录指令执行后,结果为负,SF=1,结果为正,SF=0;
(4)、CF:进位标志位,向最高位的进位,就放到这个寄存器中;
(5)、OF:溢出标志位,对有符号运算数而言,溢出位就保留在这里;
CF和OF的区别:
CF是对无符号数运算有意义的标志位,OF是对有符号运算而言的标志位;
(6)、DF:方向标志位;
pushf:将标志寄存器的值压栈;
popf:从栈中弹出数据,送入标志寄存器中;
5、中断
中断是CPU处理外部突发事件的一个重要技术;
中断向量表:CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址;
从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表;
单步中断:CPU在执行一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程,单步中断的中断类型码为1;
6、int
int:内中断,int n,n是中断类型码,n就是引发中断过程,中断向量表里面放的是地址;通过n这个序号索引到这个地址,执行中断规定的格式---->中断过程;
BIOS和DOS提供的中断,都用ah来传递内部子程序的编号;
DOS编程中,默认以"$"结尾("$"本身并不显示,只起到边界作用);
7、端口
CPU可以直接读写3个地方的数据:i>、CPU内部的寄存器;ii>、内存单元;iii>、端口;
通过端口,计算机才可以直接访问硬件;通过端口,计算机才可以和网络互相的传输数据;
端口的读写指令只有2个:in和out分别用于从端口读取数据和往端口写入数据;
shl:逻辑左移指令,将最后一位写入CF中,最低位用0补充;
shr:逻辑右移指令,将最后一位写入CF中,最高位用0补充;
8、外中断
外中短信息:可屏蔽中断和不可屏蔽中断;跟标志寄存器IF密切相关;
端口和中断机制,是CPU进行I/O的基础;
9、指令系统总结
(1)、数据传送指令:mov、push、pop、pushf、popf....实现的是寄存器与内存/寄存器之间的单个数据传送;
(2)、算术运算指令:add、sub、adc、sbb、inc、dec、cmp....实现寄存器和内存数据的算数运算;
他们的执行结果影响标志寄存器:sf、zf、sf、pf、af....
(3)、逻辑指令:and、or、not、shl、shr...
计算结果(除not)都影响标志寄存器;
(4)、转移指令:可以修改IP,CS;
i>、无条件转移指令:jmp
ii>、条件转移指令:jcxz、je、jb、ja....
iii>、循环指令:loop;
iv>、过程:call、ret、retf;
v>、中断:int、iret
(5)、处理机控制指令........
(6)、串处理指令:movsb、cmps....
10、直接定址表
思路:建立一张表,在表中存入要查找的数据即可;为了加快运算速度而采用查表的方法;
根据存储的地址不同,方便实现不同子程序的调用;