x86汇编语言之外中断

368 阅读5分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。

外中断

**外中断 (硬中断):**由外部设备(比如网卡,或者硬盘 键盘 鼠标)引发的中断,比如当网卡收到数据包的时候,就会发出一个中断

中断屏蔽:

cpu监听到外部中断时,第一步需要先判断IF标志位的值,如果为1则执行,如果为0则屏蔽

为什么还有中断屏蔽这么一说? 因为有些重复的外部中断并不需要响应,或者cpu正在在执行非常重要的一段指令,这些指令不能中断,一旦中途调开可能会造成系统崩溃,那么在这种情况下需要先将IF标志位置为0,屏蔽所有可屏蔽的外部信号,等这段指令执行完后,再讲IF还原回1, 这个IF标志位相当于是一个监听外部信号的开关

为了方便IF标志位的修改,8086提供了相应的指令方面我们使用

cli  ;相当于IF=0

sti  ;相当于IF=1

键盘中断

当我们按下键盘中的一个键,那么键盘会向cpu发出一个中断信号,cpu接收到信号后判断标志位IF是否为1,如果为1,则执行这个中断

当松开按键时,同样会发出一个中断信号,也就是说点击一个键实际产生了两个中断信号

以上这一系列过程涉及到几个问题:

​ 1. 键盘是一个外部设备,电信号发出时,cpu怎么知道这个信号是来自键盘而不是鼠标的呢?

​ 2. cpu又如何知道你按下的是哪一个键?

解答1:

​ cpu除了可以对寄存器 和内存进行数据读写之外,还可以读写端口的数据,电脑上一共有65535个端口,每个端口相当于是一个数据通道,当外部键盘借助USB接口接入电脑被驱动识别后,势必有一个端口与其相连进行数据通信, 在8086中这个端口号为60H

那么如何使用汇编读写端口中的数据呢?

in al,60H ; 使用in指令 从60h这个端口读取一个字节到al寄存器中去

out 60h,al ; 使用out指令 al寄存器中的数据写入60H端口

从端口读写数据必须使用ax或者al寄存器进行交互

解答2:

​ 键盘每个键位所对应的字符都有与之对应的扫描码一一映射,不同厂商键盘硬件对应的扫描码可能不一致,它们最终都会转成相应的ascii码

键位扫描码参考表如下:

keymark(Hex)按下break(Hex)松开描述
NumLock45c5break = mark + 0x80
/e0 35e0 b5由 e0 引导出 extend scan code
*37b7break = mark + 0x80
-4aca同上
7/Home47c7同上
8/Up48c8同上
9/PgUp49c9同上
4/Left4bcb同上
54ccc同上
6/Right4dcd同上
1/End4fcf同上
2/Down50d0同上
3/PgDn51d1同上
0/Ins52d2同上
./Del53d3同上
+4ece同上
Entere0 1ce0 9c
Scroll Lock46c6同上
Pause/Breake1 1d 45 e1 9d c5*同上
Inserte0 52e0 d2同上
Homee0 47e0 c7同上
Page Upe0 49e0 c9同上
Deletee0 53e0 d3同上
Ende0 4fe0 cf同上
Page Downe0 51e0 d1同上
lefte0 46e0 c6同上
righte0 4de0 cd同上
upe0 48e0 c8同上
downe0 50e0 d0同上
0181scan code
F13bbb同上
F23cbc同上
F33dbd同上
F43ebe同上
F53fbf同上
F640c0同上
F741c1同上
F842c2同上
F943c3同上
F1044c4同上
F1157d7同上
F1258d8同上
~/·29a9
0f8f
3aba
2aaa
!/10282
q1090
a1e9e
z2cac
@/20383
w1191
s1f9f
x2dad
#/30484
e1212
d20a0
c2eae
$/40585
r1393
f21a1
v2faf
%/50686
t1494
g22a2
b30b0
^/60787
y1595
h23a3
n31b1
&/70888
u1696
j24a4
m32b2
*/80989
i1797
k25a5
</,33b3
(/90a8a
o1898
l26a6
>/.34b4
)/00b8b
p1999
:/;27a7
?//35b5
_/-0c8c
{/[1a9a
"/'28a8
36b6
+/=0d8d
}/]1b9b
1c9c
1d9d
|/\2bab
38b8
0e8e
39b9

如果是控制键ctrl shift 则将其转变成状态字节, 记录到0040:0017这个内存空间中,也就是说当我们按下控制键 这个位置的数据会发生相应的改变

磁盘读写

  1. 概念

磁盘构造:

一面=80个磁道

一个磁道=18个扇区

一个扇区=512byte
  1. 中断

    使用13H号中断

    ;读取磁盘中的数据到0:200H这个内存中
    mov ax,0
    mov es,ax
    mov bx,200h
    
    mov al,1 ;读取的扇区数
    mov ch,0 ;磁道号
    mov cl,1 ;扇区号
    mov dl,0 ;驱动器号 软驱a, b
    mov dh,2 ;面号
    mov ah,2 ;2表示读取 3表示写入
    int 13H
    
    
    ;将0:200H这个内存中数据写入软盘
    mov ax,0
    mov es,ax
    mov bx,200h
    
    mov al,1 ;读取的扇区数
    mov ch,0 ;磁道号
    mov cl,1 ;扇区号
    mov dl,0 ;驱动器号 软驱a, b
    mov dh,2 ;面号
    mov ah,3 ;写入
    int 13H