zoukankan      html  css  js  c++  java
  • 30天自制操作系统读书笔记(二)

    我还以为马大哈的作者忘记解释之前那段好长的汇编代码了,留下这么多疑惑!

    第二天作者就交代了:以后再讲,第二天我们先来谈谈程序核心部分的内容吧!

    好吧,刚准备欢喜的等着作者解释,没想到他就扔了一大串代码(什么鬼?)

    ; 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文件呢?

    额,,,自己看看吧,一定看得懂的.

  • 相关阅读:
    【MySQL】若sql语句中order by指定了多个字段,则怎么排序?
    【golang】golang中结构体的初始化方法(new方法)
    【feign】拦截输出日志
    【Feign】Feign ,OpenFeign以及Ribbon之间的区别?
    没有安装插件:node-sass , sass-loader@6.0.7 导致在style标签中使用 lang="scss" 报错
    解决:'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    解决:flex弹性布局和溢出隐藏使用ellipsis省略号提示的冲突
    缺少标签template抱歉的包裹报错:[Vue warn]: Failed to mount component: template or render function not defined.
    两个(div)元素使用了display:inline-block后出现错位问题解决
    块级标签使用 display:inline-block;显示一行,存在多余的边距的bug解决办法
  • 原文地址:https://www.cnblogs.com/You0/p/4431788.html
Copyright © 2011-2022 走看看