8086 CPU 中寄存器总共为 14 个,且均为 16 位 。
数据寄存器:
AX (Accumulator):累加寄存器,也称之为累加器;
BX (Base):基地址寄存器;
CX (Count):计数器寄存器;
DX (Data):数据寄存器;
指针寄存器:
SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;
变址寄存器:
SI (Source Index):源变址寄存器;
DI (Destination Index):目的变址寄存器;
控制寄存器
IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器;
段寄存器
CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;
任何时间CS IP 指向CPU当前要读取指令的地方.CSx16+IP.
mov指令不能用于设置CS/IP的值。
执行loop指令时的两步操作:
1.(cx)=(cx)-1;
2.判断cx中的值,不为0则中转至loop标号处执行程序,如果为0则向下执行。
当时cpu是16位的,但是内存64k有点小就扩容到1M,也就是20根地址线。为了兼容之前的架构,就设计出了通过段寄存器左移4位+偏移地址的寻址方式。
地址总线有20根,但是数据总线只有16根。所以需要用两个16进制表示20进制的地址。
段地址(16位)×16+偏移地址(16位)=地址(20位)。
如:(ax)=((ds)*16 + (bx)+200)
更灵活的寻址方式:
[bx/si/di + idata]
[bx + si/di]
[bx + si/di + idata]
cmp指令:cmp ax,bx
zf=1 说明 (ax)=(bx)
zf=0 说明 (ax)!=(bx)
cf=1 说明 (ax)<(bx)
cf=0 说明 (ax)>(bx)
cf=0 并且 zf=0 说明 (ax)>(bx)
cf=1 并且 zf=1 说明 (ax)<=(bx)
中断向量表,中断例程,类似于call ret
Interrupt主要用来调用BIOS和操作系统提供的一些中断
主板上各种芯片的RAM。
都有一组供CPU读写的寄存器。
CPU可以直接读写的地方:
1.CPU内部的寄存器。
2.内存单元
3.端口。
cmos芯片:
地址端口70h.
数据端口71h.
shl是逻辑左移指令,功能:
1.将一个寄存器或内存单元中的数据向左移位。
2.将最后移出的一位写入CF中。
3.最低位用0补充。
将X逻辑左移一位,相当于执行X=X*2.
将X逻辑右移一位,相当于执行X=X/2.
中断的产生原因:比如,外设的输入到达。
CPU与外设的交互,都是将数据送入到端口中。
即CPU通过端口与外部设备进行联系。
1.可屏蔽中断
内中断设置IF=0,TF=0. 可屏蔽中断会判断IF=1才执行中断。
因此,内中断执行时,会禁用可屏蔽中断。
2.不可屏蔽中断(类型码固定为2)
几乎所有由外设引发的中断都是外中断,都是中屏蔽中断。
键盘的输入到达时,引发9号中断。
在后面加有”:”的地址标号,只能在代码段中使用,不能在其它段中使用。
seg操作符,功能为取得某一标号的段地址。
将通过给出的数据进行计算或比较而得到结果的问题,转化为用给出的数据作为查表的依据,通过查表得到结果的问题。具体的查表方法,是用查表的依据数据,直接计算出所要查找的元素在表中的位置。像这种可以通过依据数据,直接计算出所要找的元素的位置的表,叫做直接定址表。
键盘输入引发的中断:int 9h
读取键盘缓冲区中断:int 16h
ah=扫描码,al=ASCII码.
硬盘读写中断:int 13h
ah=2/3(2表示读扇区,3表示写扇区)
用C语言编程可以不用变量吗?
用C语言编程可以不用main函数吗?
我们能写一个printf函数吗?(可以接受不定数量的参数)
8080,8086/8088,80186,80286,80386,80486,Pentium,Pentium II,Pentium III,Pentium4.
80386是划时代的产品,可以在3个模式下工作:实模式,保护模式,虚拟8086模式。
反码,0 -> 1, 1 -> 0.
补码,按位取反码,加1。
由调用者将需要传递给子程序的参数压入栈中,子程序从栈中取得参数。
子程序返回时要使用ret n。
ret n的含意:
pop ip
add sp,n