1. 制作软盘启动镜像.md
做一个软盘启动镜像-.img.md
代码
关于 FAT12 文件系统相关知识看这里
显示 ”hello world!“
; hello-os
; TAB=4ORG 0x7c00 ; 指明程序装载地址,至于为什么是这个地址看 <计算机启动过程>这节; 标准 FAT12 格式软盘专用的代码 Stand FAT12 format floppy codeJMP entryDB 0x90DB "HELLOIPL" ; 启动扇区的名字(8字节)DW 512 ; 每个扇区(sector)大小(必须 512字节)DB 1 ; 簇(cluster)大小(必须为一个扇区)DW 1 ; FAT 起始位置(一般为1号扇区,0号是引导扇区)DB 2 ; FAT表个数(必须为2)DW 224 ; 根目录文件最大数(每个条目占32B,那么根目录区占用 224 * 32 / 512B = 14 扇区:19号~32号)DW 2880 ; 此磁盘扇区数量(必须为2880扇区 1440*1024/512)1.44M * 1024 / 512 byte,80(磁道)x18(扇区)x512 bytes(扇区的大小)x2(双面) = 1440 x1024 bytes = 1440 KB = 1.44MBDB 0xf0 ; 磁盘类型/描述(必须是0xf0,双面、每面80磁道、18扇区)DW 9 ; 每个FAT表占用大小 9个分区DW 18 ; 一个磁道(track)有几个扇区(必须为18)DW 2 ; 磁头数/面数(必2 因为介质描述为 0xf0)DD 0 ; 隐藏扇区数,必须是0DD 2880 ; 重写一次磁盘大小,如果“此磁盘扇区数量=0”,则由这里给出扇区数DB 0,0,0x29 ; INT 13H的驱动器号、保留,未使用、扩展引导标记(29h)DD 0xffffffff ; 卷序列号DB "HELLO-OS " ; 卷标DB "FAT12 " ; 文件系统类型(必8字,不足填空格)RESB 18 ; 声明未初始化的存储空间 18字节; 程序主体entry:MOV AX,0 ; 初始化累加寄存器MOV SS,AXMOV SP,0x7c00MOV DS,AXMOV ES,AXMOV SI,msg
putloop:MOV AL,[SI] ; MOV AL, BYTE [SI] 将 SI 地址中的字符赋值给 AX 低位ADD SI,1 ; 初始化寄存器 SI 加1,指针指向下一个字符CMP AL,0JE finMOV AH,0x0e ; 显示一个文字MOV BX,15 ; 指定字符颜色INT 0x10 ; 调用显卡BIOSJMP putloop
fin:HLT ; 让CPU停止,等待指令JMP fin ; 无限循环msg:DB 0x0a, 0x0a ; 换行两次DB "hello, world!"DB 0x0a ; 换行DB 0RESB 0x1fe-($-$$) ; 0x1fe + 2 是512B即一个扇区; 0x167ffe-($-$$) 0x167ffe + 2 =1.44M 即一个真正的磁盘DB 0x55, 0xaa ; 结束标志0xAA55,第510字节为0x55,第511字节为0xAA
编译
编译环境为 linux:
nasm -o helloos.o helloos.asm
制作启动镜像
dd if=helloos.o of=boot.img
若代码中使用 0x167ffe-($-$$)
的话,dd 后生成的镜像就是一个1.44M的软盘镜像,可以直接挂载并存储文件。
0x167ffe
的这样计算来的:18 x 80 x 512 x 2 = 1474560B = 1.44M = 0x168000
,因为有2B的结束标志所以减2。
使用 VM VirtualBox 启动虚拟机
- 新建虚拟机,系统选择 other;
- 不需要磁盘;
- 添加软盘,挂载上节生成的 boot.img;
- 启动。
结果图:
编写 Makefile
更多关于 makefile 语法问题看:[[make 构建工具 – makefile 文件语法.md]]
helloos.o: helloos.asmnasm -o helloos.o helloos.asmbuild: helloos.odd if=helloos.o of=boot.imgclean:rm -rf ./helloos.orm -rf ./boot.img
make / make helloos.o 编译代码
make build 生成镜像。
make clean 清理生成的文件
部分代码解释:
通过调用BIOS中断显示字符及颜色
BIOS中断INT 0x10有很多不同的功能,各个功能的入口是通过CPU寄存器AH的值来决定的,比如在Teletype模式下显示字符的功能号就是 0E
。
功能号:0EH
功能:在Teletype模式下显示字符
入口参数:
- AH=0EH
- AL=字符
- BH=页码
- BL=前景色(图形模式)
出口参数: 无
使用方法:
使用移位 mov
指令将 16 进制数 0x0E
移至CPU寄存器 AH 上,将要显示的字符移至 CPU 寄存器 AL 上,然后再通过 int 0x10
触发中断输出至屏幕。
MOV BX,15 ; 指定字符颜色 15=1111 白色
https://blog.nowcoder.net/n/25e6184ce87d44e1b2c40a4e8511e487
填充
RESB 0x1fe-($-$$) ; 填写0x00直到0x001fe
这里面的 $
表示当前指令的地址,$$
表示程序的起始地址(也就是最开始的 0x7c00
),所以$-$$
就等于本条指令之前的所有字节数。0x1fe-($-$$)
的效果就是,填充了这些 0 之后,从程序开始到最后一个0,一共是 510 (0x1fe)个字节。再加上最后的 dw 两个字节(0xaa55是结束标志),整段程序的大小就是512个字节,刚好占满一个扇区。
1. 制作软盘启动镜像.md相关推荐
- 制作uefi启动镜像
转载自https://www.cnblogs.com/haochuang/p/6066532.html 一.安装需要的软件 dosfstools:fat32分区格式化工具 dump:dump & ...
- 制作linux启动镜像内核,Linux使用mkisofs制作启动镜像
1.启动光盘参数 -no-emul-boot Boot image is 'no emulation' image 非模拟模式启动 -b or -eltorito-boot 指定在制作启动光盘时所需的 ...
- img文件制作linux启动u盘,如何在Linux系统中制作可启动img/iso镜像文件
img/iso文件是镜像文件,在Linux系统操作中有时需要制作镜像文件,那么制作镜像文件的方法有哪些呢?下面小编就给大家介绍下如何下Linux下制作可启动img/iso文件. 制作镜像文件有三种方法 ...
- linux系统做成iso镜像文件,如何在Linux系统中制作可启动img/iso镜像文件
img/iso文件是镜像文件,在Linux系统操作中有时需要制作镜像文件,那么制作镜像文件的方法有哪些呢?下面小编就给大家介绍下如何下Linux下制作可启动img/iso文件. 制作镜像文件有三种方法 ...
- linux dd目录生成iso文件,Linux下dd + mkisofs 制作可启动 img/iso 映像文件
总的来说,制作镜像文件有三种方法,cp, cat, dd 和其它专用工具.cp ,cat 和 dd都可以从设备复制文件来创建镜像.而 dd 命令更为强大,可以通过指定块大小,块多少来直接创建镜像. I ...
- linux dd命令制作软盘,[Ubuntu]dd 命令,软盘读写实例:二进制文件.bin -镜像文件 .img - 软盘设备 /dev/fd0...
本文将利用linux的dd命令往软盘的0道0面1扇区(即主引导扇区)写入数据: 实现在屏幕上显示asm这个三个字符的功能: 由于Ubuntu系统以软盘(floppy disk)作为启动盘,当选择系统从 ...
- linux+软盘启动程序,制作在软盘上跑的linux引导器详细过程_linux教程
1. 软盘上安装引导器(grub) 一般制作软盘上跑的Linux引导器都使用sysLinux这个工具(这个工具不支持ext2分区格式,只能支持fat分区格式),因为我对grub比较熟悉,并且我在软盘上 ...
- linux dd命令制作软盘,制作Linux启动软盘的四种方法
Linux的启动软盘有boot盘和boot/root盘之分,所谓的boot盘只能用来启动已经安装在硬盘上的Linux系统,而boot/root盘本身就是一个迷你Linux系统.Linux启动软盘是系统 ...
- 制作windows启动盘-大于4GB镜像
制作windows启动盘-大于4GB镜像 制作一个 Windows 安装 U 盘是很容易的,使用 UltraISO 这样的刻录工具量产一个 iso 镜像文件到 U 盘即可.然而随着 Windows 1 ...
- Linux拉取代码启动镜像,基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法...
基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法总结 熊海泉 内核源代码 下载地址 这里下载的是linux-2.6.38.tar.bz源代码 下载地址 这里下载的是busy ...
最新文章
- java young gc_java old GC和young GC
- 神秘的中国超算:比肩高铁的世界级领先
- Java调用net的webservice问题分享
- 用了那么多年的 Master 分支或因种族歧视而成为历史?
- JSON数据和Java对象的相互转换
- plSQL复制数据的方法
- [Design Pattern] 抽象工厂模式
- css --- 手机端,留言模块的样式
- oracle开放视图,Oracle视图
- Spring Boot读取peoperties配置及@Value和@ConfigurationProperties区别和联系
- 组件cdn引入_高性能 React UI组件库SHINEOUT
- Ubuntu Class ZipArchive not found
- ubuntu16.04搭建samba服务器
- 个人博客如何申请ICP备案
- 博通无线网卡驱动 linux,debian 安装博通无线网卡驱动
- PHP的zend引擎
- 快递单号如何批量查询呢
- 电脑按键坏掉之后的解决办法
- 数据太大,记事本打不开怎么办?
- python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验
热门文章
- Android模拟器读取GPS串口模拟器GPS数据
- Python 数学建模算法与应用(持续更新)
- CSS引用外部字体的方法
- 反编译工具ILSpy的下载与使用
- 网络安全:9次实验带你学会网安
- 刘意JavaSE 学习笔记 Day12-Day14——字符串API(String/StringBuffer/StringBuilder...)
- 移远EC20 R2.0 AT指令拨号流程
- java计算机毕业设计ssm+vue高校科研管理系统
- 人脸识别精度提升 | 基于Transformer的人脸识别(附源码)
- 中国软件服务业政策和形势_赵小凡