OSASK学习第1天:从计算机结构到汇编程序入门

发布时间:2026/8/10 9:21:49
OSASK学习第1天:从计算机结构到汇编程序入门 1. 先动手做起来首先按照书中的要求下载一个二进制编辑器BZ下载地址如下http://www.vcraft.jp/soft/bz.html然后输入下图所示的 16 进制数据并保存为名为helloos.img的软盘映像文件。写入 16 进制数据0000-0082 的内容Note原文这里缺少一部分内容不过紧接着后面的章节就有介绍。01E0-0202 的内容1400-1402 的内容剩下的地址直到168000全部为 0正好是1474560 1440 × 1024字节。创建工程目录与批处理文件在之前第 0 节下载的工具中有一个tolset文件夹在里面新建helloos0作为工作目录然后把z_new_w\!cons_nt.bat复制到当前目录并新建run.bat和install.bat两个批处理文件。右键编辑两个文件的内容run.batcopy helloos.img ..\z_tools\qemu\fdimage0.bin ..\z_tools\make.exe -C ../z_tools/qemuinstall.bat..\z_tools\imgtol.com w a: helloos.img接下来只需要启动这个操作系统就可以了。启动方式方式一QEMU 启动双击!cons_nt.bat在打开的命令行中输入run会启动 QEMU 窗口进行显示QEMU 已经包含在 tolset 中不用安装。方式二VMware 启动可以参考这个博客链接VMware 虚拟机启动 img 文件启动失败时遇到的问题我第一次用 QEMU 的方式启动时没有启动成功后来检查发现是因为在编辑run.bat文件时把../z_tools/qemu中的斜杠方向写反了写成了..\z_tools\qemu导致启动失败。2. 究竟做了什么这部分主要介绍的是CPU只能处理电信号用电信号表示0和1以及二进制和十六进制等比较基础的问题3. 初次体验汇编程序本节使用作者川合秀实基于自由软件汇编器 “NASM” 自制的汇编语言编译器 “NASK” 把一个汇编程序编译为二进制img文件。首先新建一个hellooos1文件夹并在里面创建一个名helloos.nas的文件DB0xeb,0x4e,0x90,0x48,0x45,0x4c,0x4c,0x4fDB0x49,0x50,0x4c,0x00,0x02,0x01,0x01,0x00DB0x02,0xe0,0x00,0x40,0x0b,0xf0,0x09,0x00DB0x12,0x00,0x02,0x00,0x00,0x00,0x00,0x00DB0x40,0x0b,0x00,0x00,0x00,0x00,0x29,0xffDB0xff,0xff,0xff,0x48,0x45,0x4c,0x4c,0x4fDB0x2d,0x4f,0x53,0x20,0x20,0x20,0x46,0x41DB0x54,0x31,0x32,0x20,0x20,0x20,0x00,0x00RESB16DB0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7cDB0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8aDB0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09DB0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xebDB0xee,0xf4,0xeb,0xfd,0x0a,0x0a,0x68,0x65DB0x6c,0x6c,0x6f,0x2c,0x20,0x77,0x6f,0x72DB0x6c,0x64,0x0a,0x00,0x00,0x00,0x00,0x00RESB368DB0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xaaDB0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00RESB4600DB0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00RESB1469432DB指令是“define byte”的缩写也就是往文件里直接写入1个字节的指令。RESB指令是“reserve byte”的略写如果想要从现在的地址开始空出10个字节来就可以写成RESB 10意思是我们预约了这10个字节。数字的前面加上0x就成了十六进制数不加0x就是十进制数。这一点跟C语言是一样的。然后做一个批处理文件asm.bat里面命令如下..\z_tools\nask.exe hello.nas hello.img可以看到这个指令调用nask把nas汇编文件编译为了img文件4. 加工润色这一节就是对 nas 汇编文件做了一些注释并介绍了几种操作系统的专业术语;hello-os;TAB4;以下这段是标准FAT12格式软盘专用的代码 DB0xeb,0x4e,0x90DBHELLOIPL;启动区的名称可以是任意的字符串8字节 DW512;每个扇区sector的大小必须为512字节 DB1;簇cluster的大小必须为1个扇区 DW1;FAT的起始位置一般从第一个扇区开始 DB2;FAT的个数必须为2 DW224;根目录的大小一般设成224项 DW2880;该磁盘的大小必须是2880扇区 DB0xf0;磁盘的种类必须是0xf0 DW9;FAT的长度必须是9扇区 DW18;1个磁道track有几个扇区必须是18 DW2;磁头数必须是2 DD0;不使用分区必须是0DD2880;重写一次磁盘大小 DB0,0,0x29;意义不明固定 DD0xffffffff;可能是卷标号码 DBHELLO-OS ;磁盘的名称11字节 DBFAT12 ;磁盘格式名称8字节 RESB18;先空出18字节;程序主体 DB0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7cDB0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8aDB0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09DB0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xebDB0xee,0xf4,0xeb,0xfd;信息显示部分 DB0x0a,0x0a;2个换行 DBhello, worldDB0x0a;换行 DB0RESB0x1fe-$;填写0x00直到0x001feDB0x55,0xaa;以下是启动区以外部分的输出 DB0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00RESB4600DB0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00RESB1469432“ ; ”这是个注释命令相当于C语言或是C中的“//”​。DB指令的新用法可以直接用它写字符串。“ $ ”这个美元符号是一个变量可以告诉我们这一行现在的字节数。通过0x1fe-$这句汇编语言可以自动计算需要输出多少个00。专业术语TAB4FAT12格式软盘经典文件系统这个格式兼容性好在Windows上也能用。启动区软盘第一个的扇区称为启动区。因为计算机首先从最初一个扇区开始读软盘然后去检查这个扇区最后2个字节的内容。如果这最后2个字节不是0x55 AA计算机会认为这张盘上没有所需的启动程序就会报一个不能启动的错误IPLinitial program loader启动程序加载器:启动扇区、簇、软盘容量三者简明关系1. 扇区磁盘最小物理读写单位软盘硬件层面最小读写单元1 扇区 512 字节BIOS、磁盘硬件只能按整扇区读写不能只读写半个扇区。2. 簇文件系统最小分配单位逻辑单位操作系统不会直接按扇区给文件分配空间而是把连续多个扇区打包成 1 簇。1 簇 N 个连续扇区经典 1.44MB 软盘 FAT121 簇 1 个扇区512 字节文件占用空间永远按整簇分配哪怕文件只有 1 字节也要占一整个簇。3. 三者计算公式总容量总字节数 总扇区数 × 每扇区字节数 (512B)簇总数总簇数 数据区总扇区数 ÷ 每簇扇区数FAT12 名字由来 用12 位二进制记录每一个簇的状态空闲、被占用、文件末尾、下一簇编号所以叫 FAT12。4. 以 1.44MB 标准软盘举例演算硬件参数80 磁道、2 个磁头、每道 18 扇区总扇区 80×2×18 2880 扇区总容量 2880 × 512 1474560 B 1440KB ≈ 1.44MB空间拆分总扇区 2880 引导扇区 两份 FAT 表 根目录区 数据区只有数据区的扇区才会被打包成簇存放文件。