30天自制操作系统-day4
这一次我们使用简单的汇编语言进行操作,上节中我们还是使用DB/DW/DD指令直接操作的二进制数,其实相应的指令在汇编语言中都有对应的助记符如MOV/ADD等,这一次我们使用助记符帮我们完成启动区的制作。
这一节还有一个地方需要注意那就是这次我们将我们的启动区放置到内存的0x7c00处,至于为什么放在这里,网上有很多说明,大家可以自行查看
; hello-os
; TAB=4
ORG 0x7c00 ; 程序从内存地址0x7c00处开始执行
start: JMP entry
DB 0x90
DB "HELLOIPL" ; 启动区名称
DW 512 ; 每个扇区的大小,必须是512字节
DB 1 ; 簇的大小,为一个扇区
DW 1 ; FAT的起始位置
DB 2 ; FAT的个数,必须为2
DW 224 ; 根目录的大小,一般设立为224项
DW 2880 ; 磁盘大小,必须为2880个扇区
DB 0xf0 ; 磁盘的种类,必须是0xf0
DW 9 ; FAT的长度,一般为9扇区
DW 18 ; 1个磁道
DW 2 ; 2个磁道
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一遍磁盘大小
DB 0,0,0x29 ; 意义不明,固定这样写
DD 0xffffffff ; 卷码编号
DB "HELLO-OS " ; 磁盘名称,11个字节
DB "FAT12 " ; 磁盘格式名称,18字节
RESB 18 ; 空出18字节
entry:
MOV AX,0 ; AX初始化
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 myOS4"
DB 0x0a ; 换行
DB 0
marker: RESB 0x01fe-(marker-start)
DB 0x55, 0xaa
上述代码我们保存为os.asm,下面我们制作img文件
nasm os.asm -o os.bin
dd if=os.bin of=os.img bs=512 count=1
dd命令的意思就是 if=os.bin 这个文件,往 of=os.img 这个文件拷贝数据,以 bs=512 字节大小作为单位,拷贝 count=1 这么多单位的数据
效果如下:
注意
如果大家在调试asm过程中,书写RESB 0x7dfe-$
遇到问题(error: invalid operand type
),可参考如下文章:
https://stackoverflow.com/questions/14785964/invalid-operand-type-error