最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

0x02_My-OS操作系统里的helloworld

来源:博客园

首先配置环境见目录0x00,创建class01文件夹


【资料图】

直接看目录结构

│ main.c(可以调用asm的函数,可以使用最原始的c语言,你要明白基本所有头文件都要用汇编自己造)│ Makefile(make脚本)├─asm│    asmhead.asm(别管)│    ipl10.asm(别管)│    naskfunc.asm(这里用来写asm函数)└─include     head.h(关联asm和c的头文件,c就可以调用asm的函数)

绿色的文件都可以动,我来教你们怎么动

下面我们来实现输出helloworld

naskfunc.asm

; naskfunc; TAB=4[FORMAT "WCOFF"]                ; 制作目标文件的模式    [INSTRSET "i486p"]                ; 使用到486为止的指令[BITS 32]                        ; 3制作32位模式用的机器语言[FILE "naskfunc.asm"]            ; 文件名    GLOBAL    _io_hlt,_write_mem8        [SECTION .text]_io_hlt:    ; void io_hlt(void);    HLT    RET_write_mem8: ; void write_mem8(int addr, int data);    MOV ECX,[ESP+4] ; taking content of add    MOV AL,[ESP+8] ; taking content of data    MOV [ECX],AL ; *ecx=al    RET

GLOBAL 这里 和 两个函数这里是关键,_io_hlt函数就是休眠cpu的,_是必须要的,这个没有链接不到c语言的函数

_write_mem8用来在指定内存地址写内容的,有两个参数,第一个是地址,第二个是数据,都是inthead.h
void io_hlt(void);void write_mem8(int addr, int data);

main.c

#include "include/head.h"void Main(void){    int i;    for (i = 0xa0000; i <= 0xaffff; i++) {        write_mem8(i, 12); /* MOV BYTE [i],15 */    }    for (;;) {        io_hlt();    }}

就是把12(红色)用循环写入显存,每个像素点怎么显示都要看对应的显存地址,比如0xa0000到0xaffff就是每一个像素点的显存

你问为什么12就是红色,这些东西在主板出厂的时候就是规定好的,就是有点调用主板api的味道

makefile

.PHONY:appcationsTOOLPATH = ../z_tools/INCPATH  = ../z_tools/haribote/ASMPATH = ./asm/MAKE     = $(TOOLPATH)make.exe -rNASK     = $(TOOLPATH)nask.exeCC1      = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quietGAS2NASK = $(TOOLPATH)gas2nask.exe -aOBJ2BIM  = $(TOOLPATH)obj2bim.exeOBJS_MAIN = main.obj naskfunc.objFONTPATH = ./font/MAKEFONT = $(TOOLPATH)makefont.exeBIN2OBJ  = $(TOOLPATH)bin2obj.exeBIM2HRB  = $(TOOLPATH)bim2hrb.exeRULEFILE = $(TOOLPATH)haribote/haribote.rulEDIMG    = $(TOOLPATH)edimg.exeIMGTOL   = $(TOOLPATH)imgtol.comCOPY     = copyDEL      = del# 默认动作%.gas : %.c Makefile    $(CC1) -o $*.gas $*.c%.asm : %.gas Makefile    $(GAS2NASK) $*.gas $*.asm%.obj : %.asm Makefile    $(NASK) $*.asm $*.objnaskfunc.obj : $(ASMPATH)naskfunc.asm Makefile    $(NASK) $(ASMPATH)naskfunc.asm naskfunc.objipl10.bin : $(ASMPATH)ipl10.asm Makefile    $(NASK) $(ASMPATH)ipl10.asm ipl10.binasmhead.bin : $(ASMPATH)asmhead.asm Makefile    $(NASK) $(ASMPATH)asmhead.asm asmhead.binfont.bin : $(FONTPATH)font.txt Makefile    $(MAKEFONT) $(FONTPATH)font.txt font.binfont.obj : font.bin Makefile    $(BIN2OBJ) font.bin font.obj _fontmain.bim : $(OBJS_MAIN) Makefile    $(OBJ2BIM) @$(RULEFILE) out:main.bim stack:3136k map:main.map \        $(OBJS_MAIN)# 3MB+64KB=3136KBmain.hrb : main.bim Makefile    $(BIM2HRB) main.bim main.hrb 0system.sys : asmhead.bin main.hrb Makefile    copy /B asmhead.bin+main.hrb system.syssystem.img : ipl10.bin system.sys Makefile    $(EDIMG)   imgin:../z_tools/fdimg0at.tek \        wbinimg src:ipl10.bin len:512 from:0 to:0 \        copy from:system.sys to:@: \        imgout:system.img# 其他指令build :    $(MAKE) system.imgrun :    $(MAKE) build    $(COPY) system.img ..\z_tools\qemu\fdimage0.bin    $(MAKE) -C ../z_tools/qemu# $(MAKE) src_onlyclean :    -$(DEL) *.bin    -$(DEL) *.gas    -$(DEL) *.obj    -$(DEL) graphic.asm    -$(DEL) main.asm    -$(DEL) main.map    -$(DEL) main.bim    -$(DEL) main.hrb    -$(DEL) system.syssrc_only :    $(MAKE) clean    -$(DEL) system.img

绿色的地方我教你,每次添加一个c文件就要写xxx.obj

要做文章的文件就是上面四个,其他的直接到github上面copy

编译运行:

cd class01..\z_tools\make.exe run 
自制操作系统合集原文地址:https://www.cnblogs.com/Frank-dev-blog/category/2249116.html

关键词: 操作系统 机器语言 目标文件