赞
踩
软盘是一种传统的可移动存储介质,通常用于存储和传输小型数据文件。下面是关于软盘存储介质的详细介绍:
总容量计算: 280 × 18 × 512 = 1474560 ( 字节 ) 280 \times 18 \times 512=1474560(字节) 280×18×512=1474560(字节)
BIOS 中的 INT 13h 功能是用于磁盘操作的中断服务例程。它提供了一系列功能,允许程序对磁盘进行读取和写入操作。下面是 INT 13h 中一些常见的功能:
读取扇区:
写入扇区:
获取驱动器参数:
磁盘重置:
磁盘类型检测:
检测扩展功能:
这些功能允许操作系统或引导加载程序与硬盘进行交互,执行读取、写入、初始化等操作,以便加载操作系统内核、文件系统或其他必要的数据。
INT 13h 功能是 BIOS 中的一个重要功能,为硬盘操作提供了底层接口,使得软件可以直接与硬盘进行通信。
es:bx 指向接收从扇区读入数据的内存区/指向将写入磁盘的数据
返回参数:
读屏幕到软盘上,1屏4000Byte,使用8个扇区,使用磁盘的0面0道1~8扇区存储。
assume cs:code code segment start: mov ax,0B800h mov es,ax mov bx,0 mov al,8 mov ch,0 mov cl,1 mov dl,0 mov dh,0 mov ah,3 int 13h mov 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,200H mov al,1 mov ch,0 mov cl,1 mov dl,0 mov dh,0 mov ah,2 int 13h mov ax,4c00h int 21H code ends end start
0x0820
处。;%define _BOOT_DEBUG_ ; 做Boot Sector时把这行注释掉 ; 启用这行就用nasm Boot.asm -o Boot.com生成.com文件用于调试 %ifdef _BOOT_DEBUG_ org 0100h %else org 07c00h %endif CYLS EQU 10 init: 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 ; 扇区 2 readloop: MOV SI,0 ; 记录失败次数 retry: MOV AH,0x02 ; 0x02 读磁盘 MOV AL,1 ; 读1个扇区 MOV BX,0 MOV DL,0x00 ; A驱动器 INT 0x13 ; BIOS 读磁盘功能 JNC next ; 成功跳转 ADD SI,1 ; 失败加一次 CMP SI,5 ; 到5次就跳到error JAE error MOV AH,0x00 ; 复位磁盘功能 MOV DL,0x00 INT 0x13 ; 重置磁盘驱动器 JMP retry ; 重试 next: MOV AX,ES ; 内存地址向后移动0x0020, ; 通常在实模式下,段地址(Segment Address)与物理地址(Physical Address)的计算方式是将段地址左移 4 位(相当于乘以 16),然后加上偏移地址(Offset Address)。 ; 这里 ES 寄存器的值是一个段地址,移动 0x0020 实际上移动了 0x20 * 16 = 0x200 即 512 个字节。 ADD AX,0x0020 MOV ES,AX ; 通过AX给ES加0x0020 ADD CL,1 ; 扇区+1 CMP CL,18 ; 有没有到18个扇区 JBE readloop ; CL<=18,就跳到 readloop MOV CL,1 ADD DH,1 CMP DH,2 JB readloop ; 如果 DH < 2 ,则跳到readloop MOV DH,0 ADD CH,1 CMP CH,CYLS JB readloop ; 如果CH<CYLS , 则跳到readloop JMP success print: ; 字符串显示到屏幕 MOV AL, [SI] ; 将 SI 寄存器指向的内存地址处的值(即字符串中的一个字符)加载到 AL 寄存器 ADD SI, 1 ; 将 SI 寄存器的值增加 1,指向字符串中的下一个字符 CMP AL, 0 JE end ; 如果 AL 寄存器中的值为 0,说明字符串结束,跳转到标签 end MOV AH, 0x0e ; 指示 BIOS 以特定的文本模式显示字符 MOV BX, 15 ; 特定的显示模式,这里表示白色前景和黑色背景的属性值 INT 0x10 JMP print end: HLT JMP end ; 无限循环 error: ; 打印错误信息 MOV SI, error_msg JMP print success: MOV SI, success_msg JMP print BootMessage: DB "Hello, MY OS!" ; 想要开机后在屏幕上显示的字符串 DB 0 success_msg: DB "Success" ; 成功 DB 0 error_msg: DB "Error" ; 失败 DB 0 times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节 $$表示一个section的开始处汇编后地址 DW 0xaa55 ; 结束标志
使用前文方式加载程序:
nasm boot.asm -o boot.bin
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。