图下面的代码,那个sprintf是剽别人的各位还是自己从网上下载吧
kernel.c
#include "sprintf.h"
void myhlt(void);
void setup_page(void);
void change_page(void);
void change0(void);
void fillbox(int color, int x0, int y0, int x1, int y1);
void myfillbox(int color, int x0, int y0, int x1, int y1);
void makefont16 (int color, int x, int y, short *font);
void print_gb2312(int color, int x, int y, unsigned char *str);
void copy_str(char *str, char *mystr);
int mymain(int eax, int ebx) {
int *myfb = (int *)0xe0000000;
fillbox(0x001e90ff, 0, 0, 799, 599);
myfillbox(0x00000000, 0, 0, 799, 599);
unsigned char valuebuf[64];
unsigned char *str = "系统的名字叫做什么呢,暂定为SnailOS吧,真的佩服自己的速度,像蜗牛爬树!";
print_gb2312(0xffffffff, 80 , 0, str);
str = "我的系统开始可以打印中文了,不过还不能换行,屏幕也是越界的,好在还是正确的显示了!";
print_gb2312(0xffffffff, 80, 80, str);
str = "蜗牛(Snial)";
print_gb2312(0xffffffff, 80 , 96, str);
str = "该不该搁下重重的壳";
print_gb2312(0xffffffff, 80 , 112, str);
str = "寻找到底哪里有蓝天";
print_gb2312(0xffffffff, 80 , 128, str);
str = "随着轻轻的风轻轻的飘";
print_gb2312(0xffffffff, 80 , 144, str);
str = "历经的伤都不感觉疼";
print_gb2312(0xffffffff, 80 , 160, str);
str = "我要一步一步往上爬";
print_gb2312(0xffffffff, 80 , 176, str);
str = "等待阳光静静看着它的脸";
print_gb2312(0xffffffff, 80 , 192, str);
str = "小小的天有大大的梦想";
print_gb2312(0xffffffff, 80 , 208, str);
str = "重重的壳裹着轻轻的仰望";
print_gb2312(0xffffffff, 80 , 224, str);
str = "我要一步一步往上爬";
print_gb2312(0xffffffff, 80 , 240, str);
str = "在最高点乘着叶片往前飞";
print_gb2312(0xffffffff, 80 , 256, str);
str = "让风吹干流过的泪和汗";
print_gb2312(0xffffffff, 80 , 272, str);
str = "总有一天我有属于我的天";
print_gb2312(0xffffffff, 80 , 288, str);
str = "Hd#蜗牛先生#¥%……来&)(*_*)})。感谢Internet,感谢CSDN,感谢苍老师^_^^_^";
print_gb2312(0xffffffff, 80 , 336, str);
sprintf (valuebuf, "eax 等于 0x%x", eax);
print_gb2312(0x00ff8c00, 80, 384, valuebuf);
sprintf (valuebuf, "ebx 等于 0x%x", ebx);
print_gb2312(0x00ffffff , 80, 368, valuebuf);
char * addr0 = (char *) 0x7c00;
char *mystr = "在进行分页实验!";
copy_str(addr0, mystr);
fillbox(0x001e90ff, 0, 0, 799, 599);
myfillbox(0x00000000, 0, 0, 799, 599);
str = "又做了一些改动,把第一页映射到第七页,借用小米的一句话,\"永远相信美好的事情即将发生\"";
print_gb2312(0xffffffff, 0, 0, str);
print_gb2312(0xffffffff, 80, 80, addr0);
setup_page();
print_gb2312(0x00ff8c00, 80, 96, addr0);
mystr = "上面弄错了,是把第0页的映射到7页,这次决定把7页映射到0页";
copy_str((char *)0x0, mystr);
change_page();
print_gb2312(0x00ff0000, 80, 112, (char *)0xc00);
char *addr1 = (char *)0xc00;
*addr1 = 0xce;
*(addr1 + 1) = 0xd2;
print_gb2312(0x0000ff00, 80, 128, addr1);
print_gb2312(0xffffffff, 80, 144, addr1);
print_gb2312(0xffffffff, 80, 160, (char *)0x7000);
mystr = "地址变换后改变地址0处的内容,向0x7000写入本段字符,则是向地址0处写入";
copy_str((char *)0x7000, mystr);
change0();
print_gb2312(0xffffffff, 80, 176, (char *)0);
mystr = "再进行一次地址变换则向0x7000写入和向0处写入是一样的";
copy_str((char *)0x7000, mystr);
print_gb2312(0xffffffff, 80, 192, (char *)0);
while(1) {
myhlt();
}
}
void myprintf(char * str) {
return;
}
void fillbox(int color, int x0, int y0, int x1, int y1) {
int *myfb = (int *)0xe0000000;
int xsize = 800;
int x, y;
for (y = 0; y <= y1 - y0; y++) {
for (x = 0; x <= x1 - x0; x++) {
myfb[x0 + x + (y0 + y) * xsize] = color;
}
}
}
void myfillbox(int color, int x0, int y0, int x1, int y1) {
int *myfb = (int *)0xe0000000;
int xsize = 800;
int x, y;
if (x0 < 80 || y0 < 80 || x1 > 719 || y1 > 519) {
x0 = 80;
y0 = 80;
x1 = 719;
y1 = 519;
}
for (y = 0; y <= y1 - y0; y++) {
for (x = 0; x <= x1 - x0; x++) {
myfb[x0 + x + (y0 + y) * xsize] = color;
}
}
}
void print_ascii (int color, int x, int y, char *font) {
int *myfb = (int *)0xe0000000;
int xsize = 800;
char d;
int *p;
int i;
for (i = 0; i < 16; i++){
p = myfb + (y + i) * xsize + x;
d = font[i];
if ((d & 0x80) != 0) {p[0] = color;}
if ((d & 0x40) != 0) {p[1] = color;}
if ((d & 0x20) != 0) {p[2] = color;}
if ((d & 0x10) != 0) {p[3] = color;}
if ((d & 0x08) != 0) {p[4] = color;}
if ((d & 0x04) != 0) {p[5] = color;}
if ((d & 0x02) != 0) {p[6] = color;}
if ((d & 0x01) != 0) {p[7] = color;}
}
return;
}
void makefont16 (int color, int x, int y, short *font) {
int *myfb = (int *)0xe0000000;
int xsize = 800;
short d;
int *p;
int i;
for (i = 0; i < 16; i++){
p = myfb + (y + i) * xsize + x;
d = font[i];
if ((d & 0x80) != 0) {p[0] = color;}
if ((d & 0x40) != 0) {p[1] = color;}
if ((d & 0x20) != 0) {p[2] = color;}
if ((d & 0x10) != 0) {p[3] = color;}
if ((d & 0x08) != 0) {p[4] = color;}
if ((d & 0x04) != 0) {p[5] = color;}
if ((d & 0x02) != 0) {p[6] = color;}
if ((d & 0x01) != 0) {p[7] = color;}
if ((d & 0x8000) != 0) {p[8] = color;}
if ((d & 0x4000) != 0) {p[9] = color;}
if ((d & 0x2000) != 0) {p[10] = color;}
if ((d & 0x1000) != 0) {p[11] = color;}
if ((d & 0x800) != 0) {p[12] = color;}
if ((d & 0x400) != 0) {p[13] = color;}
if ((d & 0x200) != 0) {p[14] = color;}
if ((d & 0x100) != 0) {p[15] = color;}
}
return;
}
void print_gb2312(int color, int x, int y, unsigned char *str) {
extern short font[0x8000];
extern char myfont[0x1000];
int i = 0, j = 0;
unsigned char a, b;
unsigned int offset;
while (str[i] != 0) {
if (str[i] < 0x80) {
a = str[i];
print_ascii (color, x + j, y, myfont + a * 16);
if (str[i + 1] == 0)
break;
i++;
j += 8;
} else {
a = str[i] - 0xa0;
b = str[i + 1] - 0xa0;
offset = ((a - 1) * 94 + (b - 1)) * 16;
makefont16 (color, x + j , y, font + offset);
i += 2;
j += 16;
}
}
return;
}
void copy_str(char *str, char *mystr) {
int i = 0;
for (; i <= strnlen(mystr, 0); i++)
*(str + i) = *(mystr + i);
return;
}
boot.s
MULTIBOOT2_HEADER_MAGIC = 0xe85250d6
GRUB_MULTIBOOT_ARCHITECTURE_I386 = 0x0
MULTIBOOT_HEADER_TAG_ADDRESS = 0x2
MULTIBOOT_HEADER_TAG_OPTIONAL = 0x1
MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS = 0x3
MULTIBOOT_HEADER_TAG_END = 0x0
MULTIBOOT_HEADER_TAG_FRAMEBUFFER = 0x5
.globl _start, _myhlt, _setup_page, _change_page, _change0
.extern _mymain, _myprintf
_start:
jmp multiboot_entry
.align 8
multiboot_header:
.int MULTIBOOT2_HEADER_MAGIC
.int GRUB_MULTIBOOT_ARCHITECTURE_I386
.int multiboot_header_end - multiboot_header
.int -(MULTIBOOT2_HEADER_MAGIC + GRUB_MULTIBOOT_ARCHITECTURE_I386 + (multiboot_header_end - multiboot_header))
.align 8
address_tag_start:
.short MULTIBOOT_HEADER_TAG_ADDRESS
.short MULTIBOOT_HEADER_TAG_OPTIONAL
.int address_tag_end - address_tag_start
.int multiboot_header
.int _start
.int 0x0
.int 0x0
address_tag_end:
.align 8
entry_address_tag_start:
.short MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS
.short MULTIBOOT_HEADER_TAG_OPTIONAL
.int entry_address_tag_end - entry_address_tag_start
.int multiboot_entry
entry_address_tag_end:
.align 8
framebuffer_tag_start:
.short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
.short MULTIBOOT_HEADER_TAG_OPTIONAL
.int framebuffer_tag_end - framebuffer_tag_start
.int 800
.int 600
.int 32
framebuffer_tag_end:
.align 8
undefined_tag:
.short MULTIBOOT_HEADER_TAG_END
.short 0
.int 8
multiboot_header_end:
.align 8
multiboot_entry:
movl $stack, %esp
pushl $0
popf
pushl %ebx
pushl %eax
call _mymain
pushl $str
call _myprintf
1:
hlt
jmp 1b
str:
.string "idealOS is halt!\n"
.align 0x1000
.fill 0xf000, 1, 0
stack:
_gdtr:
.short 3 * 8 - 1
.int _gdt
.align 8
_gdt:
.quad 0x0000000000000000
.quad 0x00c092000000ffff
.quad 0x00c09a000000ffff
_myhlt:
cli
hlt
ret
_load_gdtr: # void load_gdtr (int limit, int addr);
mov 4(%esp), %ax
mov %ax, 6(%esp)
lgdt 6(%esp)
mov $0x08, %eax
mov %eax, %ds
mov %eax, %es
mov %eax, %fs
mov %eax, %gs
jmpl $0x10, $mystart
mystart:
ret
_load_idtr: # void load_idtr (int limit, int addr);
mov 4(%esp), %ax
mov %ax, 6(%esp)
lidt 6(%esp)
ret
.align 8
_setup_page:
movl $0x400, %ecx
movl $0x1000007, %eax
movl $0xfff000, %edi
cld
1:
stosl
addl $0x1000, %eax
loop 1b
movl $0x100000, %ecx
movl $0x7, %eax
movl $0x1000000, %edi
1:
stosl
addl $0x1000, %eax
loop 1b
movl $0xfff000, %eax
movl %eax, %cr3
movl %cr0, %eax
orl $0x80000000, %eax
movl %eax, %cr0
ret
_change_page:
mov $0x7007, %eax
mov $0x1000000, %edi
stosl
mov $0x0007, %eax
mov $(0x1000000 + 7 * 4), %edi
stosl
movl $0xfff000, %eax
movl %eax, %cr3
ret
_change0:
mov $0x0007, %eax
mov $0x1000000, %edi
stosl
movl $0xfff000, %eax
movl %eax, %cr3
ret