我还以为马大哈的作者忘记解释之前那段好长的汇编代码了,留下这么多疑惑!
第二天作者就交代了:以后再讲,第二天我们先来谈谈程序核心部分的内容吧!
好吧,刚准备欢喜的等着作者解释,没想到他就扔了一大串代码(什么鬼?)
; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址,这个指令是和nask编译器说的(伪指令)告诉nask,开始执行的时候,把代码放到0x7c00的地方。
;为什么是0x7c00呢,因为规定了0x7c00-0x7dff是启动区的装载地址。 ; 以下用于标准的FAT12格式的软盘 JMP entry DB 0x90 __略___ ; 程序核心 entry: MOV AX,0 ; 初始化寄存器 ;此时ax = 0 MOV SS,AX ;SS堆栈段寄存器也等于0 MOV SP,0x7c00 ;SP堆栈寄存器SP(stack pointer)存放栈的偏移地址 等于0x7c00 MOV DS,AX ;DS——数据段寄存器=0 MOV ES,AX ;ES——附加段寄存器=0 MOV SI,msg ;msg其实就是地址啦。 nask计算出msg里程序开始差了几个字节然后相差的字节+0x7c00 就是msg的地址了。 putloop: MOV AL,[SI] ;讲寄存器SI所代表的的地址的值赋给AL ADD SI,1 ; 给S1加一 CMP AL,0 ;把AL和0对比 JE fin ;如果AL为零那就跳转到fin执行 MOV AH,0x0e ; 显示一个文字 MOV BX,15 ; 指定字符颜色 INT 0x10 ; 调用显卡BIOS,调用BIOS时,AH,BX里的值就是BIOS程序将要用到的参数 JMP putloop ;前面看到SI不断加一,就是总有一次会读完msg保存的数据,这时候AL就是0了,然后就会执行jE指令让CPU待机。 fin: HLT ; 让CPU停止,等待命令 JMP fin ; 无限循环
;保存要打印输出的数据 msg: DB 0x0a, 0x0a ; 换行2次 DB "hello, world" DB 0x0a ; 换行 DB 0
(⊙v⊙)嗯。。上面的注释我就算解释了代码了。。 (总算补了一点昨天的东西)
但是吧,把启动区和操作系统写在一个文件里然后nask编译之后,重命名为img,现在看起来貌似还方便。但是以后如果操作系统写的越来越大呢?以后如果要修改或者管理呢?
那就蛋疼了。
所以作者决定只写IPL然后其他的文件写好之后再用磁盘管理文件将它们合并进去。
然后作者果断删了代码,并把helloos.nas改名为了ipl.nas,顺便也就修改了asm.bat这个批处理文件.
呵呵呵。作者顺便输出了ipl.lst 用来记录每个指令是如何翻译成机器语言的。
哦,另外还增加了一个makeimg.bat.内容如下:
..z_toolsedimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
这句话什么意思呢,大概意思就是先读入一个空白的磁盘映像文件fdimg0at.tek,然后在开头写入ipl.bin的内容,最后将结果输出名为helloos.img的磁盘映像文件。
Makefile入门:
MakeFile 的基本格式如下:
宏定义 源文件之间的相互依赖关系
任意可执行的Shell命令
作者给出了如下的代码:
# デフォルト動作 default : ../z_tools/make.exe img # ファイル生成規則 ipl.bin : ipl.nas Makefile ../z_tools/nask.exe ipl.nas ipl.bin ipl.lst helloos.img : ipl.bin Makefile ../z_tools/edimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img # コマンド asm : ../z_tools/make.exe -r ipl.bin img : ../z_tools/make.exe -r helloos.img run : ../z_tools/make.exe img copy helloos.img ..z_toolsqemufdimage0.bin ../z_tools/make.exe -C ../z_tools/qemu install : ../z_tools/make.exe img ../z_tools/imgtol.com w a: helloos.img clean : -del ipl.bin -del ipl.lst src_only : ../z_tools/make.exe clean -del helloos.img
作者还给了一个make.bat
..z_toolsmake.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
其中后面的%1,%2,%3表示传递的参数。
好了偷懒工作完成了。。今天就到这吧。
那,能不能稍微解释下makefile文件呢?
额,,,自己看看吧,一定看得懂的.