编程:实现从软盘启动进入自己写的超迷你“操作系统”
- 超迷你“操作系统”,功能:在屏幕中间显示 hello world!
运行:编译、连接、调试源代码
进入 虚拟机XP
打开 CMD.EXE
确认软驱插入软盘
将软盘格式化
[插入 软盘 具体步骤参考本文最下方测试部分的图解]
1 开机 遇到提示请插入软盘 向虚拟机XP插入软盘.png
2 软盘使用之前需要进行格式化.png
※※※※※※※※※※※※※※※※※※※※※※※※※※
编译、连接、运行 【引导程序】
masm bootcode.asm
link bootcode.obj
(直接运行)bootcode.exe
(调试模式)debug bootcode.exe
完成后这个步骤后,软盘A: 0面 0道 1扇区,被写入 [操作系统引导程序 boot ];
※※※※※※※※※※※※※※※※※※※※※※※※※※
编译、连接、运行 【任务程序】
masm taskcode.asm
link taskcode.obj
(直接运行)taskcode.exe
(调试模式)debug taskcode.exe
完成这个步骤后,软盘A: 0面 0道 2扇区,被写入[任务程序 task];
※※※※※※※※※※※※※※※※※※※※※※※※※※
关机
关机状态下 设置 虚拟机XP 从 [软盘] 启动
[设置 从软盘启动 具体步骤参考本文最下方测试部分的图解]
3 关机 对软盘 勾选 启动时连接 虚拟机XP将从软盘启动操作系统.png
4 勾选好 软盘 启动时连接后,再开机,点击开启此虚拟机.png
※※※※※※※※※※※※※※※※※※※※※※※※※※
开机
※※※※※※※※※※※※※※※※※※※※※※※※※※
以下都是自动发生的,不需要人的操作了
CPU 自动
将 软盘A: 0面 0道 1扇区 的 [引导程序 boot ]
读到 内存 0000:7C00H ,
并且设置CS:IP = 0000:7C00H,立刻跳转,
相当于 自动 开始执行 [引导程序 boot ]
[引导程序 boot ]
0、它知道 [task] 就放在 0面0道2扇区;
1、会将[任务程序 task ] 放到内存 0000:7E00H 开始;
2、然后 将CS:IP设置为 0000:7E00H,使得CPU在读扇区工作结束之后,
立刻跳转到 CS:IP = 0000:7E00h 开始执行[任务程序]。
[任务程序 task]
完成 hello world! 在屏幕上的显示。
备注:
1个扇区有512个字节(KB),
十进制 512D = 十六进制 200H ,
因此,
0000:7C00H ~ 0000:7DFFH ,这个512个内存单元用来放 boot,
0000:7E00H 开始的内存单元 放 task .
完整源码
引导程序 boot
- 引导程序
bootcode.asm
,包括 :引导程序boot 本体 以及 将其安装到软盘的安装步骤;
- 安装步骤,是先将 boot本体 的机器码 全部复制到
开辟的内存空间data段
中,然后调用 BIOS int 13h
中断完成 写扇区;
assume cs:code
data segment
db 512 dup (0)
data ends
code segment
start: mov ax,cs
mov ds,ax
mov si, offset boot
mov ax,data
mov es,ax
mov di,0
mov cx,offset bootend - offset boot
cld
rep movsb
jmp short write
boot: jmp short bootstart
db 10 dup(0)
; 引导程序 boot 将被安装到内存data开始
; 引导程序的功能: 1.读扇区 将 任务程序task 0面0道2扇区 写到内存 0000:7E00H;
; 2.将CS:IP指向 0000:7E00H
bootstart:
mov ax,cs
mov ss,ax
mov sp,10
mov ax,0
mov es,ax
mov bx,7E00H
mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2
int 13h
mov bx,0
push bx
mov bx,7E00H
push bx
retf
bootend: nop
write:
; 利用 int 13H 中断
; 将内存 data 处的引导程序 boot
; 写入 软盘A 0面 0道 1扇区
mov ax,data
mov es,ax
mov bx,0
mov al,1
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
任务程序 task
- 任务程序
taskcode.asm
,包括 :任务程序task 本体 以及 将其安装到软盘的安装步骤;
- 安装步骤,是先将 task本体 的机器码 全部复制到
开辟的内存空间data段
中,然后调用 BIOS int 13h
中断完成 写扇区;
assume cs:code
data segment
db 512 dup (0)
data ends
code segment
start:
mov ax,cs
mov ds,ax
mov si, offset task
mov ax,data
mov es,ax
mov di,0
mov cx,offset taskend - offset task
cld
rep movsb
jmp short write
task: jmp short taskstart
db "hello world!"
taskstart: mov ax,cs
mov ds,ax
mov si,7E02h
mov ax,0b800H
mov es,ax
mov di,160*12+40*2
mov cx,12
mov ah,02H
hellos: mov al,[si]
mov es:[di],al
mov es:[di+1],ah
inc si
add di,2
loop hellos
taskend: nop
write:
; 利用 int 13H 中断
; 将内存 data 处的任务程序
; 写入 软盘A 0面 0道 2扇区
mov ax,data
mov es,ax
mov bx,0
mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,3
int 13h
mov ax,4c00h
int 21H
code ends
end start
测试:从软盘启动操作系统(图解)
1 开机 遇到提示请插入软盘 向虚拟机XP插入软盘.png
3 关机 对软盘 勾选 启动时连接 虚拟机XP将从软盘启动操作系统.png
4 勾选好 软盘 启动时连接后,再开机,点击开启此虚拟机.png