首页 > 其他分享 >操作系统:内核的基本实现(一)屏幕输出与C语言支持

操作系统:内核的基本实现(一)屏幕输出与C语言支持

时间:2024-10-10 15:49:06浏览次数:1  
标签:__ 操作系统 al ebx mov C语言 内核 dx bx

使用 C 语言

cdecl 约定

HimuOS Kernel 遵守 cdecl 约定,在32位操作系统上,

  • 函数实参在线程栈上按照从右至左的顺序依次压栈 (x86 cdecl 的参数总是在栈上)
  • 函数结果保存在寄存器EAX/AX/AL中
  • 浮点型结果存放在寄存器ST0中
  • 编译后的函数名前缀以一个下划线字符
  • 调用者负责清栈
  • 8比特或者16比特长的整形实参提升为32比特长
  • 受到函数调用影响的寄存器:EAX, ECX, EDX, ST0 - ST7, ES, GS

x86_64 的约定
在64位机器上约定有所不同,MSVC和GNU/GCC都有不同的约定。MSVC使用__fastcall,前四个整数或指针参数通过寄存器RCX, RDX, R8, R9传递,其余通过栈传递。GNU/GCC则使用System V ABI,前六个整数或指针参数通过RDI, RSI, RDX, RCX, R8, R9传递,返回值通过RAX

打印函数的实现

在保护模式中,一般使用 in/out 操作显卡有关I/O 端口完成图形操作(更新硬件光标位置等)

  1. 保存所有通用寄存器的值,以便函数结束时能够恢复原状态。
  2. 调用0x03d4/0x03d5 I/O 端口获取/更新硬件光标位置
  3. 检查是否是回车 (0x0d),换行 (0x0a),或退格 (0x08):
    • 回车和换行被视为相同的情况,跳转到 .key_lf 处理。
    • 退格字符减少光标位置并清除相应的字符。
  4. 若是普通字符,将光标位置乘以2(因为视频内存中每个字符占用2字节),把字符写入显存,并设置字符的颜色为 0x07(通常表示白色字符,黑色背景)。
  5. 若光标位置超出2000(超出屏幕区域),则跳转到滚动屏幕部分 .roll_screen
  6. 如果字符是回车或换行,计算新光标位置,换行后光标移动到下一行。
  7. 屏幕滚动:将前1-24行的缓存区全部向上到0-23行复制,最后一行用空格覆盖,并将光标置于最后一行的起始处。
;
; HIMU OPERATING SYSTEM
;
; File: krnlio.asm
; Kernel I/O functions
; Copyright (C) 2024 HimuOS Project, all rights reserved.

; All builtin functions has __himuos__ prefix to avoid conflicts with other functions

%include "osbase32.inc"

[bits 32]
section .text

; Function: getcrpos
; get current cursor position
; - return ax: cursor position
; ---------------------------------------------------------
global __himuos__getcrpos
__himuos__getcrpos:
    push edx
    mov dx, 0x03D4
    mov al, 0x0E
    out dx, al
    mov dx, 0x03D5
    in al, dx
    mov ah, al
    mov dx, 0x03D4
    mov al, 0x0F
    out dx, al
    mov dx, 0x03D5
    in al, dx
    pop edx
    ret

; Function: printc
; write a character in stack to the screen
; ---------------------------------------------------------
global __himuos__printc
__himuos__printc:
    pushad
    mov ax, SELECTOR_VIDEO
    mov gs, ax

    call __himuos__getcrpos
    mov bx, ax
    mov ecx, [esp + 36]

    cmp cl, 0xd
    jz .key_cr
    cmp cl, 0xa
    jz .key_lf
    cmp cl, 0x8
    jz .key_backspace
    jmp .key_other
.key_backspace:
    dec bx
    shl bx, 1
    mov byte [gs:bx], 0
    inc bx
    mov byte [gs:bx], 0x07
    shr bx, 1
    jmp .set_cursor
.key_other:
    shl bx, 1
    mov byte [gs:bx], cl
    inc bx
    mov byte [gs:bx], 0x07
    shr bx, 1
    inc bx
    cmp bx, 2000
    jl .set_cursor
; we consider carriage returns and line breaks as the same situation (CRLF)
.key_lf:
.key_cr:
    xor dx, dx
    mov ax, bx
    mov si, 80
    div si
    sub bx, dx
    add bx, 80
    cmp bx, 2000
    jl .set_cursor
.roll_screeen:
    cld 
    mov ecx, 960

    mov esi, 0xc00b80a0
    mov edi, 0xc00b8000
    rep movsd

    mov ebx, 3840
    mov ecx, 80

.cls:
    mov word [gs:ebx], 0x0720
    add ebx, 2
    loop .cls
    mov bx, 1920

.set_cursor:
    mov dx, 0x03d4
    mov al, 0x0e
    out dx, al
    mov dx, 0x03d5
    mov al, bh
    out dx, al

    mov dx, 0x03d4
    mov al, 0x0f
    out dx, al
    mov dx, 0x03d5
    mov al, bl
    out dx, al
.printc_end:
    popad
    ret

; Function: clscr
; clear the screen and set the cursor to the top left corner
; ---------------------------------------------------------
global __himuos__clscr
__himuos__clscr:
    pushad
    mov ax, SELECTOR_VIDEO
    mov gs, ax
    xor ebx, ebx
    mov ecx, 2000
.clscr_loop:
    mov word [gs:bx], 0x0720
    add ebx, 2
    loop .clscr_loop
    mov bx, 0
    mov dx, 0x03d4
    mov al, 0x0e
    out dx, al
    mov dx, 0x03d5
    mov al, bh
    out dx, al
    mov dx, 0x03d4
    mov al, 0x0f
    out dx, al
    mov dx, 0x03d5
    mov al, bl
    out dx, al
    popad
    ret

; Function: printstr
; print a string to the screen
; ---------------------------------------------------------
global __himuos__printstr
__himuos__printstr:
    push ebx
    push ecx
    mov ecx, 0
    mov ebx, [esp + 12]
.printstr_loop:
    mov cl, [ebx]
    cmp cl, 0
    jz .printstr_end
    push ecx
    call __himuos__printc
    add esp, 4
    inc ebx
    jmp .printstr_loop
.printstr_end:
    pop ecx
    pop ebx
    ret

标签:__,操作系统,al,ebx,mov,C语言,内核,dx,bx
From: https://www.cnblogs.com/himu-qaq/p/18456530

相关文章

  • C语言函数栈帧的创建与销毁(32)
    文章目录前言一、什么是函数栈帧?二、理解函数栈帧能解决什么问题?三、函数栈帧的创建和销毁解析什么是栈?认识相关寄存器和汇编指令四、解析函数栈帧的创建和销毁预备知识函数的调用堆栈准备环境转到反汇编函数栈帧的创建函数栈帧的销毁五、回答开篇总结前言应该是......
  • 实验二 C语言分支与循环基础应用编程-1
    task1.c #include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1397#defineN2476#defineN321intmain(){intcnt;intrandom_major,random_no;srand(time(NULL));//以当前系统时间作为随机种子cnt=0;while(cnt<N){rando......
  • arm imx6ull docker启动失败问题查找与解决 内核配置相关
    1、增加POSIXMessageqeue:couldnotgetinitialnamespace:nosuchfileordirectory CONFIG_POSIX_MQUEUE=y2、增加namespacefailedtosettoinitialnamespaceCONFIG_NAMESPACES=y3、创建网络失败,veth配置:dockercreateendpointquirky_shternonnetworkbridge......
  • 【C】C语言常见概念~
    C语言常见概念转义字符转义字符,顾名思义,转变原来意思的字符比如#include<stdio.h>intmain(){ printf("abcndef"); return0;}输出的结果为:将代码修改一下:#include<stdio.h>intmain(){ printf("abc\ndef"); return0;}输出的结果变为:\n就是一个......
  • 基于C语言编程实现发票四要素查验-医疗票真伪查验API
    发票四要素查验是指通过发票代码、发票号码、开票日期和校验码/金额这四个关键信息来验证发票的真实性。这些要素是每张发票独有的,伪造者很难复制出完全一样的发票。而发票查验接口、医疗票真伪查验API正是基于这一原理,为用户提供了一种便捷、高效的查验方式。首先,发票查......
  • 内核编译 设备驱动 驱动程序
    内核编译一、内核编译的步骤编译步骤:(linux内核源码的顶层目录下操作)1.拷贝默认配置到.config       cpconfig_mini2440_td35.config2.makemenuconfig内核配置    makemenuconfig3.makeuImage          ......
  • 2个日期之间相差天数C语言实现。
    2个日期之间相差天数Description时光匆匆,日子一天天的过去,一个百岁老人,所活天数也不过36500多天。现在,小明突然想知道自己已经活了几天。已知小明的出生日期和现在的日期,请你帮助小明计算出他已活的天数。如,出生日期为2011-10-01,现在是2011-10-27,则已活的天数为26天。Inpu......
  • 部署若依项目到Linux操作系统(包含所有遇到的坑)
    1.安装redis(1)进入要下载的文件夹cd/usr/local/(2)在linux命令行中下载redis(.tar.gz)wgethttps://download.redis.io/releases/redis-7.2.0.tar.gz(3)解压redis-7.2.0.tar.gz文件tar-zxvfredis-7.2.0.tar.gz(4)进入redis安装目录cdredis-7.2.0(5)编译安装make&&ma......
  • 基于C语言的排序
    排序的概念:排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]......
  • 【读书笔记-《30天自制操作系统》-26】Day27
    本篇内容不多,主要是一些优化的工作。首先优化了应用程序,然后引入对应用程序的保护功能,最后引入库的概念。1.应用程序优化首先来解决上一篇中遗留的一个bug:使用ncst命令运行的应用程序,按下Shift+F1或者点击x按钮都无法关闭。分析上一篇新增的代码,没有发现问题,因此这个......