前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过汇编实现引导程序

通过汇编实现引导程序

作者头像
lovelife110
发布2021-01-14 16:27:48
1.1K0
发布2021-01-14 16:27:48
举报
文章被收录于专栏:爱生活爱编程

启动流程

通电后,主板上BIOS或者UEFI,会加电自检(检查硬件有没错误),加载bootloader(执行程序)到内存 bootloader被写死在磁盘上第一个扇区,启动后被加载到内存的一个固定的位置。BIOS去这个位置执行第一条指令。

在这里插入图片描述
在这里插入图片描述

汇编码

将程序烧到软盘上,用软盘启动,模拟启动过程

代码语言:javascript
复制
; 文件名 boot.asm
 
org 7c00h                     ; BIOS读入MBR后,从固定的0x7c00h处开始执行。因此引导程序一定要放在这个位置才能执行。
 
; 下面部分和10h有关中断,10h中断用来显示字符
; 8086CPU 16位寄存器想用20位寻址,于是加了段寄存器。为了向后兼容,后来一直保留下来。
mov ax, cs					  
mov es, ax
mov ax, msg
mov bp, ax                    ; ES:BP表示显示字符串的地址
mov cx, msgLen                ; CX存字符长度
mov ax, 1301h                 ; AH=13h表示向TTY字符终端显示字符,AL=01h表示显示方式(字符串是否包含显示属性,01h表示不包含)
mov bx, 000fh                 ; BH=00h表示页号第0页,BL=0fh表示颜色白色
mov dl, 0                     ; 表示位于第0列
int 10h						  ; 在上面这些固定的寄存器当中放好数据后,直接调用中断函数即可
  
msg: db "hello world, welcome to OS!"
msgLen: equ $ - msg           ; 字符串长度
times 510 - ($ - $$) db 0     ; 填充剩余部分,到512字节
dw 0aa55h                     ; 魔数,必须有这两个字节BIOS才确认是MBR,即主引导记录(是装有Linux系统的硬盘的第一个扇区)

汇编伪指令ORG,规定程序的起始地址,其作用是告诉汇编程序,以下机器语言加载到内存中的哪个地址。

编译

nasm boot.asm -o boot.bin

制作启动软盘

  1. dd if=/dev/zero of=floppy.img bs=1474560 count=1 生成空白软盘镜像,1474560这个大小是固定的
  2. dd if=boot.bin of=myos.img bs=512 count=1 制作包含主引导记录boot.bin的启动镜像文件,512字节的引导程序
  3. dd if=floppy.img of=myos.img skip=1 seek=1 bs=512 count=2879 引导程序复制到软盘上。在 bin 生成的镜像文件后补上空白,成为合适大小的软盘镜像,一共2880个扇区,略过第一个

用软盘启动系统

  1. 将myos.img下载到windows
  2. VMWare创建空的虚拟机
    • 文件 - 创建新的虚拟机 - 典型
    • 稍后安装操作系统
    • 其他
    • 一路next 完成
    • 虚拟机设置,去掉CD/DVD选项中“启动时连接”
    • 网络,选择“仅主机模式”,勾选“启动时连接”
    • 添加软盘驱动器 使用软盘映像 找到myos.img
  3. 启动虚拟机

为什么是从 0x7C00 开始?

IBM一开始就是这么设定的,后来为了兼容一直延续。 参考:https://www.glamenv-septzen.net/en/view/6

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 启动流程
  • 汇编码
  • 编译
  • 制作启动软盘
  • 用软盘启动系统
  • 为什么是从 0x7C00 开始?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档