我清空了bios中断向量和数据区还能打印字符吗?
/*感谢各位大神的的解答,我自己的代码有问题,在读取磁盘忽略了,预留IDT表占据的空间,导致无法正常打印,即使没用 bios 也可以 利用 VGA 打印东西,bios的10H中断 2号功能 也是源于读 VGA的操作吧。*/pc上电以后 利用 bios 10H中断 2号功能调用设置显示模式 80 * 25 16色 文本,然后 需要跳转到 保护 模式,我把中断 关了,然后 0x0000~0x1400用作他用 ,于是 我就把 这段内存 0 填充了,可是后面 代码 我还需要答应 字符 ,直接利用 IO端口指令操作 VGA 来显示 字符 可以吗?
程序代码:
movw $0x02, %ax int $0x10 /*利用bios中断设置了显示模式*/ cli call setpage /*后面还能打印字符么?*/ call main
setpage 的实现如下。
程序代码:
void setpage( ) { long *begin; int i = 0; int j = 0; begin = (long *)0x00000000; for(i = 0; i < 5; i++ ) for(j = 0; j < 1024 ; j++) *(begin++) = 0x00000000; }
main 的实现如下。
程序代码:
void mian() { mc_putc('a'); } /*******************************************/ #define VGA_ADDR 0xb8000 #define VGA_MEM_H 0x0c #define VGA_MEM_L 0x0d #define VGA_CUR_H 0x0e #define VGA_CUR_L 0x0f #define VGA_CMD 0x3d4 #define VGA_DAT 0x3d5 #define VGA_PER_CNT 2000 #define VGA_PER_SIZ 4000 #define VGA_TAB_SIZ 8 #define VGA_COL_SIZ 80 #define VGA_BLACK_WHITE 0x0700 /********************************************/ void mc_putc(char c) { uint pos; outb(VGA_CUR_H, VGA_CMD); pos = inb(VGA_DAT); outb(VGA_CUR_L, VGA_CMD); pos = (pos << 8) | inb(VGA_DAT); switch(c){ case '\n': pos += VGA_COL_SIZ - pos % VGA_COL_SIZ; break; case '\t': pos += VGA_TAB_SIZ - pos % VGA_TAB_SIZ; break; default: term[pos++] = c | VGA_BLACK_WHITE; break; } if(pos == VGA_PER_CNT){ memmove((uchar *)term, (uchar *)(term + VGA_COL_SIZ), (VGA_PER_CNT - VGA_COL_SIZ) * 2); pos -= VGA_COL_SIZ; memset((uchar*)(term + pos), 0, VGA_COL_SIZ * 2); } outb(VGA_CUR_H, VGA_CMD); outb((uchar)(pos >> 8), VGA_DAT); outb(VGA_CUR_L, VGA_CMD); outb((uchar)(pos), VGA_DAT); term[pos] = ' ' | VGA_BLACK_WHITE; } /********************************************/ static inline void outb(uchar val, ushort port) { asm volatile("outb %1, %0" : : "d"(port), "a"(val)); } /********************************************/ static inline uchar inb(ushort port) { uchar val; asm volatile("inb %1, %0" : "=a"(val) : "d"(port)); return val; }
[ 本帖最后由 乾坤洞主 于 2015-4-27 15:36 编辑 ]