30天自制操作系统-day4

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

原文地址:https://www.cnblogs.com/wangdongfang/p/14244251.html