• 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

  • 相关阅读:
    Javascript自动垃圾收集机制
    Javascript深入浅出(二)
    Javascript深入浅出(一)
    递归&循环&迭代&遍历&枚举,知多少
    事件流、事件处理程序和事件对象
    弹性布局学习笔记
    css3 伪元素
    css3伪类选择器nth-of-type,:nth-last-of-type,:first-of-type,:last-of-type,:only-of-type
    css3结构伪类选择器first-child,last-child,nth-child(),nth-last-child(),only-child
    css3状态伪类选择器:checked修改按钮默认样式
  • 原文地址:https://www.cnblogs.com/wangdongfang/p/14244251.html
Copyright © 2020-2023  润新知