30_OS 第1天 从计算机结构到汇编程序入门
第1天 从计算机结构到汇编程序入门
2019.12.27
1. 二进制编辑器
-
下载Bz1621.zip
-
编写helloos.img
其大小为147560字节(92160*16字节)。
2. tolset文件夹
-
./tolset/z_new_w文件夹下!cons_9x.bat
command
注:对于win10,个人认为,此文件没用。
-
./toolset/z_new_w文件下!cons_nt.bat
cmd.exe
此文件的作用是打开命令提示符(终端)。
注:个人认为此文件也没什么用
3. helloos0文件夹
-
文件列表
注:!cons_9x.bat和!cons_nt.bat完全可以删除。
-
install.bat
..\z_tools\imgtol.com:调用工具imgtol.com,w和a是参数,helloos.img文件输入。..\z_tools\imgtol.com w a: helloos.img
注:此文件是用于将软件安装到软盘上的。我们使用虚拟机,因而此文件也没什么用。
-
run.bat
这个使用QEMU启动helloos.img的。copy helloos.img ..\z_tools\qemu\fdimage0.bin ..\z_tools\make.exe -C ../z_tools/qemu
4. 使用VMware打开helloos.img
打开VMware->新建虚拟机
5. 无论CPU如何发展,CPU只能处理电信号。
6. 汇编程序
-
编写汇编程序,用它来生成和helloos.img完全一样的helloos.img。使用的汇编语言编译器是nask(模仿著名汇编器NASM,并在此基础上优化)。
-
编写helloos.nas汇编文件
DB 0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00 DB 0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00 DB 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00 DB 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff DB 0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f DB 0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41 DB 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00 RESB 16 DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09 DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb DB 0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65 DB 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72 DB 0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 368 DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
-
DB指令:是data byte的缩写,也就是往文件里面直接写入1个字节的指令。DB(小写db也行)可以做出任何数据。
汇编语言可以做出来任何文件。 -
RESB指令:是reserve byte的缩写,如果想要从现在的地址开始空出10个字节来,可以写成RESB 10,意思是我们预约了10个字节。nask不仅仅是把指定的地址空出来,它还会在空出来的地址上自动填入0x00。
7. helloos1文件夹下的asm.bat
-
asm.bat
..\z_tools\nask.exe helloos.nas helloos.img
使用nask.exe汇编语言工具,将helloos.nas源文件编译成helloos.img文件。
8. helloos2下经过加工润色的helloos.nas文件
-
helloos.nas
- ; 注释命令
- DB命令的新用法:直接写字符串。在写字符串的时候,汇编语言会自动地查找字符串中每一个字符对应的编码,然后把它们一个字节一个字节地排列起来。这个功能非常方便,也就是说,当我们想要变更输出信息的时候,就再也不用自己去查字符编码表了。
- DW指令:data word的缩写,word在汇编里面表示16位,也就是2字节。
- DD指令:data double-word的缩写,double_word表示32位,也就是4字节。DW和DD是DB指令的“堂兄弟”。
- RESB 0x1fe-$:$表示一个变量,可以告诉我们这一行现在的字节数。在此程序中,我们已经在前面输出了132字节,所以这里的$就是132。因此nask先用0x1fe减去132,得到378这一结果,然后连续输出378个字节的0x00。为什么不直接写378,而非要用$呢?这是因为如果将显示信息从“hello world”改成“hello histranger”的话,中间输出0x00的字节数也会相应发生变化。我们必须保证软盘中的第510字节(即0x1fe字节)开始的地方是
55 AA
。在程序中使用$可以自动计算需要多少个字节的0x00。不过,现在显示的信息不能支持汉字。
9. 几个专业术语
-
TAB=4
设置TAB键的宽度为4。 -
FAT12格式
软盘的个数 -
启动区
Boot sector。软盘第一个的扇区为启动区。计算机读写软盘的时候,以512字节为一个单位进行读写,因此,软盘的512字节就成为1个扇区。一张软盘的空间共有1440KB,也就是1474560字节,即共有2880个(1474560/512),即一张软盘有2880个扇区。
计算机首先从最初的第一个扇区开始读软盘,然后检查这个扇区最后的2个字节的内容。如果最后这2个字节不是55 AA
,计算机会认为这张盘上没有所需的启动程序,就会报告一个不能启动的错误。至于为什么是55 AA
,这是当初设计者设计的,原因和1+1=2的原因差不多。如果计算机确认了第一个扇区的最后两个字节正好是55 AA
,那么它就认为这个扇区的开头是启动程序,并开始执行这个程序。 -
IPL
Initial program loader的缩写。启动程序加载器。启动区只有区区的512字节,实际的操作系统不可能像helloos这样小。几乎所有的操作系统,都是把加载操作系统本身的程序放在启动区中。有鉴于此,有时,启动区也被叫做IPL。IPL的名字长度必须是8字节,不够8字节需要补上空格。 -
启动
boot。bootstrap的缩写。
10. 不是10
二零一九即将过去
像是结束一段还未开始的爱情
去年的今天的现在
我又在做什么呢
黑夜穷困潦倒
流浪时遇见了长在树上的月亮
月亮说她自己是天上的麋鹿
黑夜深信不疑
二零二零即将到来
像是开始一段已经结束的爱情
明年的今天的现在
我又在做什么呢
当黑夜触摸到那些麋鹿
树的魅影以及月亮的娇小
都变得
让黑夜毫无兴致
2019.12.27 23:31
上一篇: 计算n的阶乘
下一篇: 操作系统--进程管理