| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4597 人关注过本帖
标题:我清空了bios中断向量和数据区还能打印字符吗?
只看楼主 加入收藏
乾坤洞主
Rank: 3Rank: 3
来 自:乾坤洞
等 级:论坛游侠
帖 子:93
专家分:103
注 册:2012-7-18
结帖率:77.78%
收藏
已结贴  问题点数:30 回复次数:6 
我清空了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 编辑 ]
搜索更多相关主题的帖子: 上电 
2015-04-26 16:00
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:10 
不可以吧,只有非常非常老的机器运行在纯dos下的才行的,现在dos都是在虚拟86状态下运行的,你拿不到r0的最高级别,无法在保护模式和实模式下切换。
2015-04-26 16:34
乾坤洞主
Rank: 3Rank: 3
来 自:乾坤洞
等 级:论坛游侠
帖 子:93
专家分:103
注 册:2012-7-18
收藏
得分:0 
回复 2楼 xzlxzlxzl
不是呀 这个 是 引导程序, 可以拿到 特权0 ,并非 在 某个 特定操作系统下实现 打印功能!

和尚我爱四处游,疯疯癫癫有理由    
开开心心是正道,愁愁烦烦不应该
2015-04-26 17:13
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11807
专家分:43421
注 册:2006-5-13
收藏
得分:10 
如果你将中断的入口修改了,当然就无法使用原来的中断啰。如果没有修改原来的中断入口或者保留了原来的中断入口,当然也可以继续使用这个功能。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-04-27 08:02
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
通常自己处理中断会留一个原中断处理的入口的,自己的处理完后会jmp到原中断,这样就不影响其他程序调用处理结果了。

能编个毛线衣吗?
2015-04-27 09:00
乾坤洞主
Rank: 3Rank: 3
来 自:乾坤洞
等 级:论坛游侠
帖 子:93
专家分:103
注 册:2012-7-18
收藏
得分:0 
回复 4楼 hu9jj
能不能不通过 bios 直接操作 VGA 打印字符 , 因为保护 模式 还未构建完成 而且已经关中断了。

[ 本帖最后由 乾坤洞主 于 2015-4-27 09:36 编辑 ]

和尚我爱四处游,疯疯癫癫有理由    
开开心心是正道,愁愁烦烦不应该
2015-04-27 09:31
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11807
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用乾坤洞主在2015-4-27 09:31:09的发言:

能不能不通过 bios 直接操作 VGA 打印字符 , 因为保护 模式 还未构建完成 而且已经关中断了。

应该是可以的。在修改中断入口地址前先保留好这些数据,然后通过中断程序直接跳转到相应的地址。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2015-04-27 21:33
快速回复:我清空了bios中断向量和数据区还能打印字符吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013500 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved