Java程序员应该掌握的底层知识】 09 汇编实现引导程序

系统启动过程

在这里插入图片描述

编写汇编码


; 文件名 boot.asm
 
org 7c00h                     ; BIOS读入MBR后,从0x7c00h处开始执行
 
; 下面部分和10h有关中断,10h中断用来显示字符
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表示页号,BL=0fh表示颜色
mov dl, 0                     ;int 10h
  
msg: db "hello world, welcome to OS!"
msgLen: equ $ - msg           ; 字符串长度
times 510 - ($ - $$) db 0     ; 填充剩余部分
dw 0aa55h                     ; 魔数,必须有这两个字节BIOS才确认是MBR

编译
nasm boot.asm -o boot.bin
制作启动软盘

1、dd if=/dev/zero of=floppy.img bs=1474560 count=1 生成空白软盘镜像,(软盘大小必须为1.44M,因此bs=1474560 )
2、dd if=boot.bin of=myos.img bs=512 count=1 制作包含主引导记录boot.bin的启动镜像文件(引导程序占512byte)
3、dd if=floppy.img of=myos.img skip=1 seek=1 bs=512 count=2879 在 bin 生成的镜像文件后补上空白,成为合适大小的软盘镜像,一共2880个扇区,略过第一个

用软盘启动系统

1、将myos.img下载到windows
2、VMWare创建空的虚拟机
1、文件 - 创建新的虚拟机 - 典型
2、稍后安装操作系统
3、其他
4、一路next 完成
5、虚拟机设置,去掉CD/DVD选项中“启动时连接”
6、网络,选择“仅主机模式”,勾选“启动时连接”(好像无所谓)
7、添加软盘驱动器 使用软盘映像 找到myos.img
3、启动虚拟机
4、显示结果
在这里插入图片描述

为什么是0x7C00?

简单来说,IBM最初约定的是在07C00H,但后续为了兼容性,就都统一都放在这个地方了。
参考:https://www.glamenv-septzen.net/en/view/6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值