[084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!

编程:实现从软盘启动进入自己写的超迷你“操作系统”

  • 超迷你“操作系统”,功能:在屏幕中间显示 hello world!
    [084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!_第1张图片
    hello world!.png
[084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!_第2张图片
从软盘启动操作系统.png

运行:编译、连接、调试源代码

  进入 虚拟机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

测试:从软盘启动操作系统(图解)

  • 结合 运行:编译、连接、调试源代码部分的说明来看
[084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!_第3张图片
1 开机 遇到提示请插入软盘 向虚拟机XP插入软盘.png
[084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!_第4张图片
2 软盘使用之前需要进行格式化.png
[084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!_第5张图片
3 关机 对软盘 勾选 启动时连接 虚拟机XP将从软盘启动操作系统.png
[084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!_第6张图片
4 勾选好 软盘 启动时连接后,再开机,点击开启此虚拟机.png
[084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!_第7张图片
5 再次开机后 进入我们自己写的操作系统.png
[084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!_第8张图片
6 如何回到虚拟机XP.png

你可能感兴趣的:([084][汇编语言]编程:实现从软盘启动进入自己写的超迷你“操作系统”: 显示 hello world!)