04day C语言与画面显示的练习
来源:互联网 发布:公务员网络培训学院 编辑:程序博客网 时间:2024/05/16 08:55
为了向VRAM里写入一些东西显示出来,所以需要写一个有写入内存功能的函数.
_write_mem8: ; void write_mem8(int addr, int data); MOV ECX,[ESP+4] ; [ESP+4] MOV AL,[ESP+8] ; [ESP+8] MOV [ECX],AL RET
void write_mem8(int addr, int data); 我们向addr地址写入内容data
修改C语言部分为
void io_hlt(void);void write_mem8(int addr, int data);void HariMain(void){ int i; /* */ for (i = 0xa0000; i <= 0xaffff; i++) { write_mem8(i, 15); /* MOV BYTE [i],15 */ }//15 表示白色 for (;;) { io_hlt(); }}
挑战指针 其实write_mem8函数执行的赋值功能使用c语言的指针就可以做到。
//最好我们同时注意一下类型转换void io_hlt(void);void HariMain(void){ int i; char *p; p = (char *) 0xa0000; for (i = 0; i <= 0xffff; i++) { *(p + i) = i & 0x0f; } for (;;) { io_hlt(); }}
接下来我们要来进行色号设定,不是写着玩玩。
void io_hlt(void);void io_cli(void);void io_out8(int port, int data);int io_load_eflags(void);void io_store_eflags(int eflags);/* */void init_palette(void);void set_palette(int start, int end, unsigned char *rgb);void HariMain(void){ int i; /* */ char *p; /* [...] */ init_palette(); /* 设定调色板 */ p = (char *) 0xa0000; /* 指定地址 */ for (i = 0; i <= 0xffff; i++) { p[i] = i & 0x0f; } for (;;) { io_hlt(); }}void init_palette(void){ static unsigned char table_rgb[16 * 3] = { 0x00, 0x00, 0x00, /* 0:黑 */ 0xff, 0x00, 0x00, /* 1:亮红 */ 0x00, 0xff, 0x00, /* 2:亮绿 */ 0xff, 0xff, 0x00, /* 3:亮黄 */ 0x00, 0x00, 0xff, /* 4:亮蓝 */ 0xff, 0x00, 0xff, /* 5:亮紫 */ 0x00, 0xff, 0xff, /* 6:浅亮蓝 */ 0xff, 0xff, 0xff, /* 7:白 */ 0xc6, 0xc6, 0xc6, /* 8:亮灰色 */ 0x84, 0x00, 0x00, /* 9:暗红 */ 0x00, 0x84, 0x00, /* 10:暗绿 */ 0x84, 0x84, 0x00, /* 11:暗黄 */ 0x00, 0x00, 0x84, /* 12:暗青 */ 0x84, 0x00, 0x84, /* 13:暗紫 */ 0x00, 0x84, 0x84, /* 14:浅暗蓝 */ 0x84, 0x84, 0x84 /* 15:暗灰色 */ }; set_palette(0, 15, table_rgb); return;}void set_palette(int start, int end, unsigned char *rgb){ int i, eflags; eflags = io_load_eflags(); /* 记录中断许可标示的值 */ io_cli(); /* 将中断许可置为0 禁止中断*/ io_out8(0x03c8, start); for (i = start; i <= end; i++) { io_out8(0x03c9, rgb[0] / 4); io_out8(0x03c9, rgb[1] / 4); io_out8(0x03c9, rgb[2] / 4); rgb += 3; } io_store_eflags(eflags); /* 复原中断许可的标志 */ return;}// io_out8 为输出函数 因为c语言不能实现 所以我们用汇编实现。。
这里附上 naskfunc.nas 里面有我们和io有关函数的汇编实现
; naskfunc; TAB=4[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
make run 运行 颜色变了。
现在我们来画一个矩形吧、
画面是320*200=64000 对于像素坐标(x,y)对应的VRAM地址为
0xa0000+x+y*320
所以画矩形的核心函数如下;
void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)// vram地址,xsize位横向宽度,c为颜色,x0y0为起始点坐标,x1y1为右下角点坐标{ int x, y; for (y = y0; y <= y1; y++) { for (x = x0; x <= x1; x++) vram[y * xsize + x] = c; } return;}
主函数如下
void HariMain(void){ char *p; /* p偲偄偆曄悢偼丄BYTE [...]梡偺斣抧 */ 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(); }}
流程: 先初始化调色板 然后绘制三个矩形
效果如下:
0 0
- 04day C语言与画面显示的练习
- 四、C语言与画面显示练习
- 第4天 C语言与画面显示的练习
- 4、C语言与画面显示的练习
- [读书笔记]30 天自制操作系统 day4 C语言与画面显示的练习
- c语言练习 11-1. 通讯录的录入与显示(10)
- 练习shell与C语言
- 急需解决C语言的一个画面编程
- C语言指针的练习
- c 语言的一个练习
- c语言的改错练习
- c语言数据结构的练习
- 《数据结构与算法分析》C语言描述 Day One
- C语言的赋值兼容与AD采集显示
- Day-1:C语言基本知识:
- C语言之练习1-10制表符回退符显示输出
- 写的一些c语言练习
- 我的C语言队列练习
- Android NDK开发入门
- 我的编程之路(C++)
- hibernate与jdbc
- Java中的split函数
- org.dom4j.DocumentException: null Nested exception: null
- 04day C语言与画面显示的练习
- CKEditor图片上传实现详细步骤
- cocos2d-js使用plist执行自身动作
- ace treeview 的动态请求json数据返回格式
- 重拾编程之路--jeetcode(java)--Remove Linked List Elements
- gnuradio之flowgraph和top_block
- android - Android的线程和进程
- PHP 学习之我的第一份PHP代码
- poj 1664 放苹果