学习x86汇编语言7 使用INT13读取软盘数据
- 一、本章使用工具
- 二、软盘存储介绍
- 三、BIOS int13功能
- 四、引导程序源代码
一、本章使用工具
- nasm
- FloppyWriter
- bochs
- 1.44M的软盘有2面
- 每面80个柱面
- 一个柱面18个扇区
- 每个扇区有512字节
三、BIOS int13功能 【#|学习x86汇编语言7 使用INT13读取软盘数据】BIOS的int13 中断是扩展的磁盘读取功能。
入口参数:
- ah= int 13H 的功能号(2表示读扇区、3表示写扇区)
- al= 读取/写入的扇区数
- ch= 磁道号
- cl= 扇区号
- dh= 磁头号(对于软盘即面号,对软盘一个面用一个磁头来读写)
- dl= 驱动器号 软驱从0开始,0:软驱A 、 1:软驱B
硬盘从80H开始,80H:硬盘C 、 81H: 硬盘D
返回参数:
- 操作成功,(ah)= 0 ,(al)= 读取/写入的扇区数
- 操作失败,(ah)= 出错代码
读屏幕到软盘上,1屏4000Byte,使用8个扇区,使用磁盘的0面0道1~8扇区存储。
assume cs:code
code segment
start:mov ax,0B800h
mov es,ax
mov bx,0mov al,8
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,3
int 13hmov ax,4c00h
int 21H
code ends
end start
一段读磁盘示例
读0面0道1扇区到 0000:0200H
assume cs:code
code segment
start:mov ax,0
mov es,ax
mov bx,200Hmov al,1
mov ch,0
mov cl,1
mov dl,0
mov dh,0
mov ah,2
int 13hmov ax,4c00h
int 21H
code ends
end start
四、引导程序源代码
- 带读磁盘的功能,把磁盘数据加载到内存的 0x0820处。
- 从第2个扇区开始读,因为第一个扇区给启动程序用了。
;
%define _BOOT_DEBUG_;
做Boot Sector时把这行注释掉
;
启用这行就用nasm Boot.asm -o Boot.com生成.com文件用于调试%ifdef _BOOT_DEBUG_
org0100h
%else
org 07c00h
%endifCYLS EQU 10init:
MOV AX,0
MOV SS,AX
MOV SP,0x7c00;
堆栈空间,从0x7c00向前
MOV DS,AX
MOV AX,0x0820;
把磁盘数据加载到内存0x0820处。 0x8000~0x81ff的512字节给启动区用的,所以从0x0820开始
MOV ES,AX;
初始化磁盘接口
MOV CH,0;
柱面 0
MOV DH,0;
磁头 0
MOV CL,2;
扇区 2readloop:
MOV SI,0;
记录失败次数retry:
MOVAH,0x02;
0x02 读磁盘
MOVAL,1;
读1个扇区
MOVBX,0
MOVDL,0x00;
A驱动器INT0x13;
BIOS 读磁盘功能
JNCnext;
成功跳转ADDSI,1;
失败加一次
CMPSI,5;
到5次就跳到error
JAEerror
MOVAH,0x00;
复位磁盘功能
MOVDL,0x00
INT0x13;
重置磁盘驱动器
JMPretry;
重试next:
MOVAX,ES;
内存地址向后移动0x0020
ADDAX,0x0020
MOVES,AX;
通过AX给ES加0x0020ADDCL,1;
扇区+1
CMPCL,18;
有没有到18个扇区
JBEreadloop;
CL<=18,就跳到 readloopMOVCL,1
ADDDH,1
CMPDH,2
JBreadloop;
如果 DH < 2 ,则跳到readloopMOVDH,0
ADDCH,1
CMPCH,CYLS
JBreadloop;
如果CH