一维数组的定义
数组本质上就是多个数据的集合,在内存中按照一定顺序排列,角标即为每个数据的偏移值,如果使用db
进行数据的定义那么两个数据之间的偏移值为1个字节,如果使用dw
指令定义数据,则偏移值为2个字节
data segment
db 3 dup(1) ;批量定义三个连续的数据 每个数据的偏移量为1 在内存中的排列为 111
data ends
data segment
db 3 dup(1,2,3) ;批量定义三个连续的数据 每个数据的偏移量为1 在内存中的排列为 123123123
data ends
数组的打印
data segment
array db 128 dup(0)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov array[0],1
mov array[1],2
mov array[2],3
code ends
end start
外中断
外中断 (硬中断):由外部设备(比如网卡,或者硬盘 键盘 鼠标)引发的中断,比如当网卡收到数据包的时候,就会发出一个中断
中断屏蔽:
cpu监听到外部中断时,第一步需要先判断IF标志位的值,如果为1则执行,如果为0则屏蔽
为什么还有中断屏蔽这么一说? 因为有些重复的外部中断并不需要响应,或者cpu正在在执行非常重要的一段指令,这些指令不能中断,一旦中途调开可能会造成系统崩溃,那么在这种情况下需要先将IF标志位置为0,屏蔽所有可屏蔽的外部信号,等这段指令执行完后,再讲IF还原回1, 这个IF标志位相当于是一个监听外部信号的开关
为了方便IF标志位的修改,8086提供了相应的指令方面我们使用
cli ;相当于IF=0
sti ;相当于IF=1
键盘中断
当我们按下键盘中的一个键,那么键盘会向cpu发出一个中断信号,cpu接收到信号后判断标志位IF是否为1,如果为1,则执行这个中断
当松开按键时,同样会发出一个中断信号,也就是说点击一个键实际产生了两个中断信号
以上这一系列过程涉及到几个问题:
-
键盘是一个外部设备,电信号发出时,cpu怎么知道这个信号是来自键盘而不是鼠标的呢?
-
cpu又如何知道你按下的是哪一个键?
解答1:
cpu除了可以对寄存器 和内存进行数据读写之外,还可以读写端口的数据,电脑上一共有65535个端口,每个端口相当于是一个数据通道,当外部键盘借助USB接口接入电脑被驱动识别后,势必有一个端口与其相连进行数据通信, 在8086中这个端口号为60H
那么如何使用汇编读写端口中的数据呢?
in al,60H ; 使用in指令 从60h这个端口读取一个字节到al寄存器中去
out 60h,al ; 使用out指令 al寄存器中的数据写入60H端口
从端口读写数据必须使用ax或者al寄存器进行交互
解答2:
键盘每个键位所对应的字符都有与之对应的扫描码一一映射,不同厂商键盘硬件对应的扫描码可能不一致,它们最终都会转成相应的ASCII码
键位扫描码参考表可网上查询
如果是控制键ctrl shift 则将其转变成状态字节, 记录到0040:0017这个内存空间中,也就是说当我们按下控制键 这个位置的数据会发生相应的改变
磁盘读写
-
概念
磁盘构造:
一面 = 80个磁道 一个磁道 = 18个扇区 一个扇区 = 512byte
-
中断
使用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