• 自制操作系统日记(6):静态桌面初步


    代码仓库地址:https://github.com/freedom-xiao007/operating-system

    简介

    在上篇中我们成功的加载跳转执行了C语言的代码,本篇中将跟随书籍,初步展示了一个系统页面的初步界面,看到桌面那刻还是有点意思的

    最终结果展示

    不多啰嗦,这里先直接展示结果,最终的运行界面如下:

    在这里插入图片描述

    可以看到有点模样了,令人激动啊。当最终到这一步的时候,心里开心极了,哈哈

    相关代码说明

    本篇中的代码修改基本上是抄《30天自制操作系统》中的,但可能是nask和nasm的区别问题,我们需要单独修改的地方也不少,下面我们详细说明下需要修改的地方

    setup.asm文件修改

    这个文件需要添加界面相关的参数设置,我们将其插入到start的下面,如下:

    start:
        ; 画面モードを設定
        MOV		AL,0x13			; VGA显卡,320x200x8bit
        MOV		AH,0x00
        INT		0x10
        MOV		BYTE [VMODE],8	; 屏幕的模式(参考C语言的引用)
        MOV		WORD [SCRNX],320
        MOV		WORD [SCRNY],200
        MOV		DWORD [VRAM],0x000a0000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    func.asm文件修改

    这次新增了比较多的函数,但不复杂,也不多,这个文件的内容如下:

    [BITS 32]                          ; 制作32位模式用的机器语言
            GLOBAL  _io_hlt, _io_cli, _io_sti, io_stihlt
            GLOBAL  _io_in8,  _io_in16,  _io_in32
            GLOBAL  _io_out8, _io_out16, _io_out32
            GLOBAL  _io_load_eflags, _io_store_eflags
    [SECTION .text]
    _io_hlt:     ; void io_hlt(void);
            HLT
            RET
    _io_cli:     ; void io_cli(void);
            CLI
            RET
    _io_sti:     ; void io_sti(void);
            STI
            RET
    _io_stihlt: ; void io_stihlt(void);
            STI
            HLT
            RET
    _io_in8:     ; int io_in8(int port);
            MOV      EDX, [ESP+4]      ; port
            MOV      EAX,0
            IN       AL, DX
            RET
    _io_in16:   ; int io_in16(int port);
    
            MOV      EDX, [ESP+4]      ; port
            MOV      EAX,0
            IN       AX, DX
            RET
    _io_in32:   ; int io_in32(int port);
            MOV      EDX, [ESP+4]      ; port
            IN       EAX, DX
            RET
    _io_out8:   ; void io_out8(int port, int data);
            MOV      EDX, [ESP+4]      ; port
            MOV      AL, [ESP+8]       ; data
            OUT      DX, AL
            RET
    _io_out16:  ; void io_out16(int port, int data);
            MOV      EDX, [ESP+4]      ; port
            MOV      EAX, [ESP+8]      ; data
            OUT      DX, AX
            RET
    _io_out32:  ; void io_out32(int port, int data);
            MOV      EDX, [ESP+4]      ; port
            MOV      EAX, [ESP+8]      ; data
            OUT      DX, EAX
            RET
    _io_load_eflags:     ; int io_load_eflags(void);
            PUSHFD       ; 指PUSH EFLAGS
            PO
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    快递业的最新发展趋势:2023年市场预测
    Android Studio run main()方法报错
    Linux环境下JDK1.8的安装(保姆级教程)
    深入URP之Shader篇5: SimpleLit Shader分析(1)
    解决java:不支持发行版本5报错
    XML解析库的下载和编译
    外贸业务管理有效方法汇总
    医院信息化、数字医学影像、DICOM、PACS源码
    基于安卓Android的酒店预订管理系统设计与实现
    又一家芯片新势力杀入车载领域
  • 原文地址:https://blog.csdn.net/github_35735591/article/details/127877255