引言

之前我们讨论的都是CPU对指令的执行。我们知道CPU在计算机系统中,除了能够执行指令外,还能进行运算,还应该能够对外部设备进行控制,接受它们的输入,向他们输出

也就是说:CPU除了运算能力外,还有I/O(input/output)能力

1.接口芯片和端口

在PC系统的接口卡和主板上,装有各种接口芯片。这些外设接口芯片的内部有若干寄存器,CPU将这些寄存器当作端口来访问。

外设的输入和CPU的输出都不是直接的,而是通过送入相关的接口芯片的端口中。

1
每一个外部设备都有一个小小的,类似于内存一样的端口
1
CPU通过端口和外部设备进行联系

2.外中断信息

由CPU的自己产生的中断信息叫内中断,非CPU由外部中断的叫外中断

外中断一共有2种

1
2
1.可屏蔽中断【要看IF位的设置】
2.不可屏蔽中断【少】

当CPU检测到可屏蔽信息的时候

1
2
3
4
如果IF=1,则CPU在执行完当前指令后,响应中断
如果IF=0,则不响应中断

所以在进入某个中断的时候,就会自动的把IF设置为0

内中断的过程

1
2
3
4
5
6
7
1.取得中断类型码N
2.pushf
3.TF = 0,IF = 0
4.push CS
5.push IP
6.(IP)=(N*4),(CS)=(N*4+2)
转去执行

外中断信息

1
2
3
可屏蔽中断所引发的中断的过程和内中断基本一样,除了第一个
取得中断信息,由于中断信息是来自CPU外部,中断类型码是通过数据总线送入CPU的
而内中断的中断类型码是在CPU内部产生的

8086CPU提供了设置IF的指令

1
2
sti	。将IF设置为1
cli ,将IF设置为0

不可屏蔽中断的中断过程

1
2
3
4
标志寄存器入栈,IF=0,TF=0
CS,IP入栈
(IP)=(8),(CS)=(0AH)
这是一个固定的地址

3.PC键盘的处理过程

1
2
3
1.键盘输入
2.引发9号中断
3.执行int 9 中断例程

键盘上每一个健相当于一个开关,键盘中由一个芯片对减半上的每一个健的开关状态进行扫描

按下一个健的时候,就会产生一个扫描码,这个扫描码就会被送入接口芯片的寄存器中,改寄存器的端口地址就是60H

,松开的时候也会产生一个扫描码

按下的码【通码】,松开【断码】

扫描长度是一个字节,通码的第七位为0,断码的第七位为1

1
断码 = 通码 + 80H

bios提供了 int 9 中断例程

1
2
3
1.读取60H端口的扫描码
2.如果是字符集键的扫描码,改扫描码和它所对应的字符吗(ASCII)送入内存中的BIOS键盘缓冲区
3.如果是控件健和切换键的扫描码,则将其转变为状态字节(用二进制记录控制键和切换键状态的字节)写入内存中粗存状态字节的单元

一般情况下,CPU在执行当前指令后,如果检测到中断信息,就响应中断,引发中断过程

可是在有些情况下,CPU在执行当前指令后,即便是发生中断,也不会响应

该内存区可以存储15个键盘输入,因为int 9 中断例程除了接收扫描码外,还要产生 字符吗,所以BIOS键盘缓冲区中,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码

0040:17单元控制着键盘键的状态字节

4.编写int 9 中断例程

过程

1
2
3
4
1.键盘产生扫描码
2.扫描码送入60H端口
3.一旦检测到60H端口有动静,引发9号中断
4.CPU执行int 9 中断例程处理键盘输入【只能控制这里】

啦啦啦

1
2
3
4
5
6
7
s1:
sub ax,1 ;当ax=0减去1的时候会变成FFFF,然后会借位,所以CF会变成1
sbb dx,0 ;只有在CF中为1的时候,dx才会被减1
cmp ax,0
jne s1
cmp dx,0
jne s1

这个代码和c语言中的

1
2
3
4
5
6
for(i=0; i<100; i++){
for(j=0;j<10000;j++){
***
}
}
是一模一样的

实现IF和TF=0的操作

1
2
3
4
5
6
7
pushf 
pop ax
and ah,11111100B
;if和tf是标志寄存器的9 和 8 位

push ax
popf

5.总结一下啦

8086CPU提供一下几个大类的指令

1.数据传送指令

1
2
mov push pop pushf popf xchg
都是数据传送指令,这些指令实现寄存器和内存,寄存器和寄存器之间的单个数据传送

2.算数运算指令

1
2
3
4
add sub adc sbb inc dec cmp imul idiv aaa
都是算术运算指令,这些指令实现寄存器和内存中的数据的算数运算
它们的执行结果会影响标志寄存器:
sf zf of cf pf af

3.逻辑指令

1
2
and or not xor test shl shr sal sar rol ror rcl rcr
除了not,它们的执行结果都会影响标志寄存器的相关标志位

4.转移指令

1
2
3
4
5
6
可以修改IP,或者CS和IP
1.无条件转移指令:jmp
2.条件转移指令:jcxz je jb ja jnb jna
3.循环指令:loop
4.过程:call ret retf
5.中断:int iret

5.处理机控制指令

1
2
对标志寄存器或者其他处理机状态进行设置
cld std cli sti nop clc cmc stc hlf wait essc lock

6.串处理指令

1
2
3
4
5
6
对内存中的批量数据进行处理
movsb movsw cmps scas lods stos
一般需要和rep repe repne前缀指令配合使用

cld
rep movsb