0

我有一个在屏幕上打印字符的功能,如下所示:

void print(int colour, int y, int x, const char *string)
{
   volatile char *video=(volatile char*)0xB8000 + y*160 + x*2;
   while(*string != 0)
   {
      *video=*string;
      string++;
      video++;
      *video=colour;
      video++;
   }
}

我想以十进制打印字符 254,但我需要使用存储在const char*. 我不能尝试print(0x0F, 0, 0, 0xFE);,因为这会在没有强制转换的情况下引发指针错误,那么我该怎么做呢?

4

2 回答 2

3

使用 C 的十六进制表示法将字符嵌入到字符串中:

print(0x0f, 0, 0, "\xfe");

正如人们所指出的那样,您可能想要稍微修饰一下代码,也许通过为VGA 帧缓冲区基地址添加一个符号名称。

于 2010-01-26T15:00:30.160 回答
1

这是题外话,对此的记忆,但挖掘我发现的代码:

/* 全局变量 */
静态字远 *ScrPtr;

/* 局部变量 */
静态词 VidSeg;
...

诠释 WinScreenHeight(无效)
{
    return (*(unsigned char far *) 0x484) + 1;
}

诠释 WinScreenWidth(无效)
{
    return (*(unsigned int far *) 0x44A);
}

无效 WinInit(){
   设置模式(适配器类型());
   ScrPtr = (Word far *) CreateFarPtr(VidSeg, 0x0000);
}

静态无效 SetMode(int VideoAddress)
{
    开关(视频地址)
    {
        案例 VGA:
        案例 MCGA:
        案例 EGA:
        案例 CGA:(字)VidSeg = 0xB800;
                    休息;
        案例 MDA:(字)VidSeg = 0xB000;
                    休息;
        案子 '?' : fprintf(stderr, "对不起,未知的视频适配器。\n");
                    fprintf(stderr, "这个程序需要 C/E/MC/VGA, Mono Adapter\n");
                    退出(1);
    }
}
静态整数适配器类型(无效)
{
    字符远 *VidMode;
    char blreg, alreg;
    VidMode = (char far *) 0x00000449L;
    asm 移动斧头,0x1a00;
    asm推bp;
    asm int 0x10;
    asm 弹出 bp;
    asm mov blreg, bl;
    asm mov alreg, 人;
    如果(alreg == 0x1a && blreg >= 9)返回(MCGA);
    if (alreg == 0x1a && blreg >= 7 && blreg <= 9) 返回(VGA);
    if (blreg == 4 || blreg == 5) 返回(EGA);
    if (*VidMode == 3) 返回(CGA);
    if (*VidMode == 7) 返回(MDA);
    返回('?');
}

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-26T15:18:05.317 回答