int 13h

int 13h

有关int 13h中断例程对磁盘进行读写的资料,服务于bootsectorGrownix 2007-01-27 11:18:09 阅读95 评论0 字号:大中小 订阅
背景:学习Linux-0.01时的boot/boot.s时,对其中的使用int 13h中断来读取磁盘块的操作不是很清楚,查了陶工的汇编书,看到这个地方觉得很有启发性。

1. 3.5寸软盘:
3.5寸软盘分为上下两面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区大小为512B
即:2面*80磁道*18扇区*512B=1440KB=1.44MB
对磁盘的访问要通过磁盘控制器来进行,而且只能以扇区来对磁盘进行读写,在读写扇区的时候,要给出面号,磁道号,和扇区号,面号和磁道号从0始,而扇区号从1始.
可以直接通过控制磁盘控制器来访问磁盘,但这样就要涉及许多的硬件细节,如是OS们都借助于BIOS的int 13h中断例程来访问磁盘.

2. int 13h
Examples:读取0面0道1扇区至0: 200
mov ax,0
mov es,ax
mov bx,200h

mov al,1==>要写入的扇区数
mov ch,0==>磁道号
mov cl,1===>扇区号
mov dl,0==>软驱A
mov dh,0==>0号磁头,软盘0面

mov ah,2===>int 13h功能号,写扇区
int 13h

入口参数:
ah=2 int 13h的功能号(2表示读扇区, 3表示写扇区)
al=要读取的扇区数/要写入的扇区数
ch=磁道号
cl=扇区号
dh=磁头号(对于软盘即为面号,因为一个面用一个磁头来进行读写)
dl=驱动器号: 软驱从0开始: ==> 软驱A:0 软驱B:1
硬驱从80h开始: ===> 硬盘C:80h 硬盘D: 81h ....
es:bx 指向接收从扇区读入数据的内存区


返回参数:
操作成功: ah=0 al=读入的扇区数
操作失败: ah=出错代码

=================================
Example:
将0:200中的内容写入0面0道1扇区:
mov ax,0
mov es,ax
mov bx,200h

mov al,1==>要写入的扇区数
mov ch,0==>磁道号
mov cl,1===>扇区号
mov dl,0==>软驱A
mov dh,0==>0号磁头,软盘0面

mov ah,3===>int 13h功能号,写扇区
int 13h

入口参数:
ah=3 int 13h的功能号(2表示读扇区, 3表示写扇区)
al=要读取的扇区数/要写入的扇区数
ch=磁道号
cl=扇区号
dh=磁头号(对于软盘即为面号,因为一个面用一个磁头来进行读写)
dl=驱动器号: 软驱从0开始: ==> 软驱A:0 软驱B:1
硬驱从80h开始: ===> 硬盘C:80h 硬盘D: 81h ....
es:bx 指向将写入扇区的数据的内存区


返回参数:
操作成功: ah=0 al=写入的扇区数
操作失败: ah=出错代码
======================================
Example: 将当前屏幕的内容保存在磁盘上
分析: 1屏内容占4000B,需要8个扇区,我们用0面0道的1-8扇区存储显存中的内容.
25行*80列*2B(1B:ASCII, 1B:Attribute)=4000B
显存地址:
[A0000, AFFFF]: VGA,EGA显示缓冲区
[B0000, B7FFF]: 单色显示缓冲区
[B8000, BFFFF]: CGA显示缓冲区

assume cs:code
code segment
start:
mov

int 13h相关文档

最新文档

返回顶部