做一个软盘启动镜像-.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 启动虚拟机

  1. 新建虚拟机,系统选择 other;
  2. 不需要磁盘;
  3. 添加软盘,挂载上节生成的 boot.img;
  4. 启动。

结果图:

编写 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 清理生成的文件

部分代码解释:

  1. 通过调用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

  1. 填充

RESB         0x1fe-($-$$)        ; 填写0x00直到0x001fe

这里面的 $ 表示当前指令的地址,$$ 表示程序的起始地址(也就是最开始的 0x7c00),所以$-$$ 就等于本条指令之前的所有字节数。0x1fe-($-$$)的效果就是,填充了这些 0 之后,从程序开始到最后一个0,一共是 510 (0x1fe)个字节。再加上最后的 dw 两个字节(0xaa55是结束标志),整段程序的大小就是512个字节,刚好占满一个扇区。

1. 制作软盘启动镜像.md相关推荐

  1. 制作uefi启动镜像

    转载自https://www.cnblogs.com/haochuang/p/6066532.html 一.安装需要的软件 dosfstools:fat32分区格式化工具 dump:dump & ...

  2. 制作linux启动镜像内核,Linux使用mkisofs制作启动镜像

    1.启动光盘参数 -no-emul-boot Boot image is 'no emulation' image 非模拟模式启动 -b or -eltorito-boot 指定在制作启动光盘时所需的 ...

  3. img文件制作linux启动u盘,如何在Linux系统中制作可启动img/iso镜像文件

    img/iso文件是镜像文件,在Linux系统操作中有时需要制作镜像文件,那么制作镜像文件的方法有哪些呢?下面小编就给大家介绍下如何下Linux下制作可启动img/iso文件. 制作镜像文件有三种方法 ...

  4. linux系统做成iso镜像文件,如何在Linux系统中制作可启动img/iso镜像文件

    img/iso文件是镜像文件,在Linux系统操作中有时需要制作镜像文件,那么制作镜像文件的方法有哪些呢?下面小编就给大家介绍下如何下Linux下制作可启动img/iso文件. 制作镜像文件有三种方法 ...

  5. linux dd目录生成iso文件,Linux下dd + mkisofs 制作可启动 img/iso 映像文件

    总的来说,制作镜像文件有三种方法,cp, cat, dd 和其它专用工具.cp ,cat 和 dd都可以从设备复制文件来创建镜像.而 dd 命令更为强大,可以通过指定块大小,块多少来直接创建镜像. I ...

  6. linux dd命令制作软盘,[Ubuntu]dd 命令,软盘读写实例:二进制文件.bin -镜像文件 .img - 软盘设备 /dev/fd0...

    本文将利用linux的dd命令往软盘的0道0面1扇区(即主引导扇区)写入数据: 实现在屏幕上显示asm这个三个字符的功能: 由于Ubuntu系统以软盘(floppy disk)作为启动盘,当选择系统从 ...

  7. linux+软盘启动程序,制作在软盘上跑的linux引导器详细过程_linux教程

    1. 软盘上安装引导器(grub) 一般制作软盘上跑的Linux引导器都使用sysLinux这个工具(这个工具不支持ext2分区格式,只能支持fat分区格式),因为我对grub比较熟悉,并且我在软盘上 ...

  8. linux dd命令制作软盘,制作Linux启动软盘的四种方法

    Linux的启动软盘有boot盘和boot/root盘之分,所谓的boot盘只能用来启动已经安装在硬盘上的Linux系统,而boot/root盘本身就是一个迷你Linux系统.Linux启动软盘是系统 ...

  9. 制作windows启动盘-大于4GB镜像

    制作windows启动盘-大于4GB镜像 制作一个 Windows 安装 U 盘是很容易的,使用 UltraISO 这样的刻录工具量产一个 iso 镜像文件到 U 盘即可.然而随着 Windows 1 ...

  10. Linux拉取代码启动镜像,基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法...

    基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法总结 熊海泉 内核源代码 下载地址 这里下载的是linux-2.6.38.tar.bz源代码 下载地址 这里下载的是busy ...

最新文章

  1. java young gc_java old GC和young GC
  2. 神秘的中国超算:比肩高铁的世界级领先
  3. Java调用net的webservice问题分享
  4. 用了那么多年的 Master 分支或因种族歧视而成为历史?
  5. JSON数据和Java对象的相互转换
  6. plSQL复制数据的方法
  7. [Design Pattern] 抽象工厂模式
  8. css --- 手机端,留言模块的样式
  9. oracle开放视图,Oracle视图
  10. Spring Boot读取peoperties配置及@Value和@ConfigurationProperties区别和联系
  11. 组件cdn引入_高性能 React UI组件库SHINEOUT
  12. Ubuntu Class ZipArchive not found
  13. ubuntu16.04搭建samba服务器
  14. 个人博客如何申请ICP备案
  15. 博通无线网卡驱动 linux,debian 安装博通无线网卡驱动
  16. PHP的zend引擎
  17. 快递单号如何批量查询呢
  18. 电脑按键坏掉之后的解决办法
  19. 数据太大,记事本打不开怎么办?
  20. python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验

热门文章

  1. Android模拟器读取GPS串口模拟器GPS数据
  2. Python 数学建模算法与应用(持续更新)
  3. CSS引用外部字体的方法
  4. 反编译工具ILSpy的下载与使用
  5. 网络安全:9次实验带你学会网安
  6. 刘意JavaSE 学习笔记 Day12-Day14——字符串API(String/StringBuffer/StringBuilder...)
  7. 移远EC20 R2.0 AT指令拨号流程
  8. java计算机毕业设计ssm+vue高校科研管理系统
  9. 人脸识别精度提升 | 基于Transformer的人脸识别(附源码)
  10. 中国软件服务业政策和形势_赵小凡