自制操作系统(六、完结?这只是开始)

一、成果

来看一下上一次的效果

34fef23c90f943a3ad65bf1c24b38396.jpg

 实现了一个有模有样的操作系统呢!

Σ(゚д゚;)

我的操作系统

3b42be910cd6475a8f635316380359e8.png

 你跟着教程的操作系统

715ea27686bf462a845f5ef033e50b1b.png

 哈哈,不会真有人被骗了吧

开个玩笑(不是吧,这也算标题党?!)

16 位已经几乎被开发到极致了

至于 32 位,咳咳,如果目的只是装x的话,没什么必要

其实作者也没有配置好Windows64位的C语言32位操作系统环境

!!!这里赠送《30天自制操作系统》电子书 由此下载

下一个系列应该是自制编程语言之类的吧

二、操作系统实现32位+C语言+绘制矩形

要问作者放出来的操作系统如何实现,这就是今天的主题(最好的方法是 p 图)

你想装b又不想动脑筋的话由此下载作者自制的绘图软件

汇编代码实现:

[FORMAT "WCOFF"] ; 制作目标文件的模式

[INSTRSET "i486p"] ; 使用到486为止的指令

[BITS 32] ; 制作32位模式用的机器语言

[FILE "naskfunc.nas"] ; 源程序文件名

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

POP EAX

RET

_io_store_eflags: ; void io_store_eflags(int eflags);

MOV EAX,[ESP+4]

PUSH EAX

POPFD ; 指 POP EFLAGS

RET

C 语言代码:

#define COL8_000000 0

#define COL8_FF0000 1

#define COL8_00FF00 2

#define COL8_FFFF00 3

#define COL8_0000FF 4

#define COL8_FF00FF 5

#define COL8_00FFFF 6

#define COL8_FFFFFF 7

#define COL8_C6C6C6 8

#define COL8_840000 9

#define COL8_008400 10

#define COL8_848400 11

#define COL8_000084 12

#define COL8_840084 13

#define COL8_008484 14

#define COL8_848484 15

void main(void)

{

char *p; /* p变量的地址 */

init_palette(); /* 设置调色板 */

p = (char *) 0xa0000; /* 将地址赋值进去 */

boxfill8(p, 320, COL8_FF0000, 20, 20, 120, 120);

boxfill8(p, 320, COL8_00FF00, 70, 50, 170, 150);

boxfill8(p, 320, COL8_0000FF, 120, 80, 220, 180);

for (;;) {

io_hlt();

}

}

void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)

{

int x, y;

for (y = y0; y <= y1; y++) {

for (x = x0; x <= x1; x++)

vram[y * xsize + x] = c;

}

return;

}

照这样,多使用boxfill8函数(看了代码之后不会还有人不会用吧),就能做出图片效果了(我提供的代码只画了3个矩形)

这是nask汇编,跟nasm差不多

C语言代码编译成s文件,汇编代码编译成obj文件,变成sys文件再用cat命令把它和ipl组合成img文件就可以了。很简单是吧我也觉得

根据图片绘制矩形并编译(我给出的代码只是示例),你应该能在虚拟机看到这个画面:

d3daba5313d446a3a26a9ae4145a74ae.jpg

我的矩形好像画小了,也可能是电脑像素太好了,导致画面太小了

想在你自己的操作系统里玩游戏吗?
想在自制操作系统里再自制一个操作系统,实现套娃吗?
想在自制操作系统里编程吗?
持续关注自制操作系统专栏

预告:下一篇实现井字棋

今天爆更了4章

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值