30天自制操作系统 pdf_day02——汇编语言和Makefile入门【专栏】30天自制操作系统...

【专栏】30天自制操作系统系列——目录

白羽:day00——前言&&目录【专栏】30天自制操作系统

1.继续开发

新建文件夹helloos3,包含以下文件

fe01f6f35adb36f87bd027b2f8de0e72.png

重写helloos.nas文件

新指令介绍

ORG:“origin”,源头,起点。该指令告诉汇编器nask,程序从指定的地方开始,即将程序装载到内存的哪个地址。
JMP:跳转,相当于C语言的goto。
entry:标签的声明,用于指定JMP指令的跳转目的地。entry是入口的意思。
MOV:赋值,MOV AX, 0,相当于AX=0, MOV SS AX,相当于SS=AX。在源数据和目的数据位数相同的是可以省略数据大小,不然要加上数据大小,BYTE,WORD, DWORD
ADD:累加,ADD SI, 1,给SI加1
CMP:比较指令
JE:跳转指令,和CMP连用时表示如果相等就跳转
INT:软件中断指令,中断理解比较复杂,暂且理解为函数调用,来源于英文“interrupt”,中途打断
HLT:让CPU停止动作的指令,并不是彻底的停止,而是让CPU进入待机指令。如果没有HLT指令,CPU就会全力执行JMP fin指令,使CPU的复合达到100%,非常费电。来源于英文“halt”,停止。
; hello-os

打开cons执行run

1212dd2a3e2e58d9503cec1b4add333b.png

2.AX和SS是什么?

在CPU中,使用寄存器来保存计算需要的数据以及计算后得到的数据。非常有代表性的寄存器有8个。

AX——累加寄存器

CX——计数寄存器

DX——数据寄存器

BX——基址寄存器

SP——栈指针寄存器

BP——基址指针寄存器

SI——源变址寄存器

DI——目的变址寄存器

以上这些寄存器都是16位寄存器,可以存储16位的二进制数。前四个寄存器后缀都是X来源于extend,拓展,表示将8位的寄存器拓展了一倍。

另外,还有一些其他的寄存器。

AL——累加寄存器低位

CL——计数寄存器低位

DL——数据寄存器低位

BL——基址寄存器低位

AH——累加寄存器高位

CH——计数寄存器高位

DH——数据寄存器高位

BH——基址寄存器高位

这8个寄存器是8位寄存器。看起来和16位AX,CX,DX,BX有些像,这是因为AX寄存器一共有16位,其中0到7位的低8位称为AL,而8到15位的高8位称为AH。

然而BP,SP,SI,DL却没有区分L和H。如果要取这几个寄存器的高位或者低位的数据,就必须先把SI的值赋给AX(MOV AX, SI),然后再用AL和AH来进行取值。

ES——附加段寄存器

CS——代码段寄存器

SS——栈段寄存器

DS——数据段寄存器

FS——没有名称

GS——没有名称

这些都是16位的段寄存器。

16位的CPU已经离我们很远了,现在常见的的是32位和64位,这里不使用64位,就不介绍了。

EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。这里的前缀E同样来源于extend。

3.制作启动区

新建文件夹helloos4

ed896ef0ac09b6b7fcc6b916c62dd400.png

首先把helloos.nas的后半部分截掉,因为我们只制作启动区。并将文件改名为ipl.nas。

ipl.nas

; hello-os
; TAB=4
 ORG 0x7c00  ; 指明程序的装载地址

; 以下的记述用于标记标准FAT12的软盘

 JMP entry
 DB 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字节

; 程序核心

 entry:
 MOV AX, 0  ; 初始化寄存器
 MOV SS, AX
 MOV SP, 0x7c00
 MOV DS, AX
 MOV ES, AX
 MOV SI, msg

putloop:
 MOV AL, [SI]
 ADD SI, 1  ; 给SI加1
 CMP AL, 0
 JE fin
 MOV AH, 0x0e  ; 显示一个文字
 MOV BX, 15  ; 指定字符颜色
 INT 0x10  ; 调用显卡BIOS
 JMP putloop

fin:
 HLT  ; 让CPU停止,等待指令
 JMP fin  ; 无限循环

msg:
 DB 0x0a, 0x0a  ; 换行2次
 DB "hello, world! by BaiYu"
 DB 0x0a  ; 换行
 DB 0

 RESB 0x7dfe-$        ; 填写0x00,直到0x7dfe

 DB 0x55, 0xaa

然后改造asm.bat,生成ipl.bin,ipl.lst

asm.bat
..z_toolsnask.exe ipl.nas ipl.bin ipl.lst

增加makeimg.bat。利用磁盘镜像管理工具edimg.exe,限度如一个空白的磁盘映像文件,然后在开头写入ipl.bin的内容,最后将结果输出为helloos.img的磁盘映像文件。

makeimg.bat
..z_toolsedimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img

打开cons运行asm->makeimg->run

235c3b6a32c2bd165dda0ccf7c6b6dcd.png

4.Makefile入门

新建helloos5文件夹,make.bat在tolsetz_new_w中,复制过来即可。

dcddf75cc90d4e2bbe304bef1a62336c.png


每次新写一个文件,就要增加一条批处理指令,非常麻烦。所以借助Makefile来简化操作。

首先生成一个不带拓展名的Makefile,然后用文本编辑器写入以下内容。

# 默认操作

打开cons运行make run

55c5e0f57110c6610de1b4166f9288bd.png


如果本文对你有用,点个赞再走吧!或者关注我,我会带来更多优质的内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值