【问题标题】:How To Print ASCII Extended Characters Using a Const Char*?如何使用 Const Char* 打印 ASCII 扩展字符?
【发布时间】:2011-01-09 13:21:51
【问题描述】:

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

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 in decimal,但我需要使用存储在const char* 上。我不能尝试print(0x0F, 0, 0, 0xFE);,因为这会导致没有强制转换的指针错误,那我该怎么做呢?

【问题讨论】:

  • 呃。 0xB8000这个神奇的数字是怎么回事?
  • 嘿,那是 Nathan 操作系统的核心——别拆。
  • Nathan,它不是任何中断的地址,这个术语你显然不知道它的意思。这个问题和你的其他一些经典问题一样好。
  • 操作!这个中断是10h,0xB8000是指向显卡的指针。
  • @GMan:伙计!这让人想起直接写入视频内存的记忆。 0xB800 是可从 BIOS 访问 VGA 视频内存的段。 0xb000 是单色VGA。

标签: c variables bios vga extended-ascii


【解决方案1】:

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

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

正如人们所指出的,您可能想要稍微修饰一下代码,或许可以通过为 VGA framebuffer base address 添加一个符号名称。

【讨论】:

    【解决方案2】:

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

    /* 全局变量 */ 静态字远 *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

    希望这会有所帮助, 最好的祝福, 汤姆。

    【讨论】:

    • 这太有帮助了!我将保存此代码以便更好地查看。非常感谢! :-)
    • @Nathan:我很好奇——为什么? :) 那些老 skool 的东西给了我快乐的回忆... :)
    • @Nathan:如果我能挖掘出更多代码,我可以提供更多代码……在这里写一行吧? :) ;)
    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 2021-07-01
    • 2019-04-22
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多