Day_01 从计算机结构到汇编程序入门

发布于 2021-03-27  96 次阅读


如何开发操作系统

  1. 在Windows(或其他)系统上编写源代码
  2. 用C语言编译器编译源代码,生成机器语言文件
  3. 对机器语言文件惊醒加工,生成软盘映像文件
  4. 将映像文件写入磁盘,作成含操作系统的启动盘
    开发操作系统,就是想办法制作一张含有操作系统的,能够自动启动的磁盘
    映像文件:软盘的备份数据。软盘的总容量是1440KB.

    世界上第一个操作系统,由于没有任何现成的操作系统可供利用,对照着CPU的命令代码表,将0和1排列起来,然后再把这些数据写入磁盘(or其他存储设备)。大概是先写一个功能简略的,再在此基础上开发其他功能,,以此类推。
    开发操作系统不会受到限制的语言大概只有汇编语言了~(所以我选C语言哈哈哈)

操作

二进制编辑器(Binary Editor)(or十六进制编辑器)
下载地址:Bz161.lzh

从计算机结构到汇编程序入门

“二进制编辑器”( Binary Editor),是一种能够直接对二进制数进行编辑的软件。
Bz1621.lzh
输入:
file
01F0,0200,1400这三个位置注意
file
file
其他都是0.一直输到168000行之前。
查看文件属性,发现文件大小正好是1474560字节(1024×1440字节)
注意:别一次删除太多。Bz1621.lzh
保存格式为helloos.img
file

//run.bat
copy helloos.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe -C ../z_tools/qemu
//install.bat
..\z_tools\imgtol.com w a: helloos.img

用!cons_nt.bat打开命令行窗口输入run

QUMU这个模拟器软件就自动运行了,运行结果
file

究竟做了什么

电脑的处理中心是CPU(central process unit)的缩写,中央处理单元,处理中心。CPU除了与别的电路进行电信号交换以外什么都不会了,对电信号,只能理解(ON)和(OFF)这两种状态。
CPU有计算指令,所以可以进行整数的加减乘除,也可以处理负数、计算小数以及次方,,等等。
CPU是一个集成电路板,忠诚的执行电信号给它的指令,输出相应的电信号。
file
file

初次体验汇编程序

使用汇编语言编写上面编写的二进制代码~
使用工具由《30天资质自制操作系统》作者开发名为nask。模仿自享有盛名的汇编编辑器“NASM”,在前者基础上提高了自动优化能力。

    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
//!cons_9x.bat
command
//!cons_nt.bat
cmd.exe
//asm.bat
..\z_tools\nask.exe helloos.nas helloos.img

DB指令是"data byte"的缩写,往文件里直接写入1个字节的指令。(大小写都可以,汇编语言不区分大小写)

DB:
在这里B是byte的缩写,即字节,所以,该伪操作所定义的每个操作数占有1个字节(8位)。
如:MESSAGE DB 'HELLO'
此时,字符串“HELLO”中每个字符会占用1个字节
51单片机中,用于定义字节的内容。
DB 指令以表达式的值的字节形式初始化代码空间。
格式与注意
[标号:] DB 表达式表
表达式中可包含符号、字符串、或表达式等项,
各个项之间用逗号隔开,字符串应用引号括起来。
括号内的标号是可选项,如果使用了标号,
则标号的值将是表达式表中第一字节的地址。
DB 指令必须位于 数据段之内,否则将会发生错误。

RESB:
reserve byte的缩写,从现在的地址开始空出来10个字节来,就可以写成RESB10。nask不仅仅是把指定的地址空出来,还
会在空出来的低智商自动填入0x00,

加工润色

; hello-os
; TAB=4

; 以下这段是标准FAT12格式软盘专用的代码

        DB      0xeb, 0x4e, 0x90
        DB      "HELLOIPL"        ; 启动区的名称可以是任意是字符串(8字节)
        DW      512             ; 每个扇区(sector)的大小(必须为512字节)
        DB      1               ; 簇(cluster)的大小(必须为1个扇区)
        DW      1               ; FAT的起试位置(一般从第一个扇区开始)
        DB      2               ; FAT的个数(必须为2)
        DW      224             ; 根目录的大小(一般设置成224项)
        DW      2880            ; 该磁盘的大小(必须是2880扇区)
        DB      0xf0            ; 磁盘的种类(必须是0xf0)
        DW      9               ; FAT的长度(必须是9扇区)
        DW      18              ; 1个磁道(track)有几个扇区(必须是18)
        DW      2               ; 磁头数(必须是2)
        DD      0               ; 不使用分区,必须是0
        DD      2880            ; 重写一次磁盘的大小
        DB      0,0,0x29        ; 固定
        DD      0xffffffff      ; (可能是)卷标号码
        DB      "HELLO-OS   " ; 磁盘的名称(11字节)
        DB      "FAT12   "        ; 磁盘格式化名称(8字节)
        RESB    18              ; 空出18字节

; 程序主体

        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

; 信息显示部分

        DB      0x0a, 0x0a      ; 2个换行
        DB      "hello, world"
        DB      0x0a            ; 换行
        DB      0

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

        DB      0x55, 0xaa

; 以下是启动区以外部分的输出

        DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    4600
        DB      0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
        RESB    1469432

在汇编中“;”是注释命令
DW指令和DD指令,它们分别是“data word”和“data double-word”在汇编力word是“16位”“double-word”是“32位”的意思————4个字节。

RESB 0x1fe-$:
其中美元符号是一个变量,可以告诉这一行现在的字数。比如在上面程序中,在前面已经输入了132字节,故$=132.nask先用0x1fe减去132,得出378结果,然后连续输出378个字节的0x00.
用$原因:因为如果将显示信息变了的化,中间输出0x00的字节数也会随之改变。必须保证软盘的第510字节(即0x1fe字节)开始的地方是55AA.如果在程序中使用$的话,汇编语言会自动计算需要输出多少个00,可以随意修改输出信息。

汇编术语:
TAB=4......TAB键位宽度设置位4,让源程序更容易读。
FAT12格式......(FAT12 Format)用windows或MS-DOS格式出来的软盘就是这种格式。兼容性好,在Windows上也可以用
启动区......(boot sector)软盘的第一个扇区称为启动区。计算机读写软盘的时候不是一个字节一个字节地读,而是以512字节位一个单位进行读写。512字节称为一个扇区。软盘一共1440KB也就是1474560字节,除512得2880故软盘共有2880个扇区。因为计算机首先从最初第一个扇区开始读软盘,然后去检查这个扇区最后两个字节的内容。如果最后2个字节不是55AA,计算机会认为这个盘上没有所需的启动程序。就会报一个不能启动的错误。如果确认第一山区最后两个字节55AA那它就认为这个扇区的开头是启动程序,并开始执行这个程序。
IPL........initial program loader.启动程序加载器。启动区只有512字节,实际的操作系统不想这么小,根本装不进去。所以几乎所有操作系统,都是把加载操作系统本身的程序放在启动区里的。故有时也将启动区叫位IPL.
启动........(boot)boot操作系统自动启动机制,bootstrap方式。


擦肩而过的概率