" printf的"任何INT 10h中断调用后都无法正常工作

时间:2014-11-26 16:01:14

标签: c printf screen dos interrupt

编辑:只有printf with" \ n"会显示。

int main (int argc, char *argv[])
{
  REGPACK   Regs;
  KEY_DATA  KeyData

  //Set cursor position AH= 02h, BH = Page Number, DH = Row, DL = Column
  Regs.h.ah = 0x02;
  Regs.h.bh = 0;
  Regs.h.dh = 15;
  Regs.h.dl = 40;
  intr(0x10, &Regs);

  printf("Test");

  while (KeyData.Key.ScanCode != SCAN_ESC)  {
   GetKey(&KeyData);
   printf("Key: %c", KeyCode.Key.AsciiChar);
  }
  return 0; 
}

该片段如上:

编码环境:Windows8.1
工具链:打开Watcom(WCL& WASM)v1.9
执行于:DOSBox,真正的DOS 6.22

首先,我发现" printf"不会在屏幕上打印任何内容,不会显示"测试" "键:X" 。然后我开始敲击键盘,大约4~6次击键,字符串会串出来,如:

TestKey: aKey: bKey: cKey: d

每4~6次连续按键发生相同的症状。

另一种情况是,我没有按任何东西,printf无法正常工作,只要按下" ESC"终止此程序,两个字符串将显示在左上方屏幕,就像那里没有错。

所以我开始认为这个片段有问题,而printf仅在DOS程序终止信号发生时起作用(INT 21h AH = 4Ch)

我重写了#34;设置光标位置"在纯粹的装配中,并且接近调用proc,错误仍然发生,并且我已经改变了设置光标位置以从视频模式3 设置视频模式3(INT 10h,AH = 00, AL = 03h)刷新屏幕,也没有运气。

无论我使用什么方法,在INT10h之后,printf在DOS终止信号之前都不会工作。

有谁知道为什么会这样?有没有办法避免这种情况,或者让我使用与INT10h混合的printf?

但在这种情况下, putc puts 可以正常打印在屏幕上, printf仅在有" \ n&#34时才有效;字符(例如" helloworld \ n")。我非常困惑......

我不能放弃INT10h,因为MSDOS没有这种操作的本机支持,并且BIOS调用也有效,我也不能放弃printf,因为可变参数确实可以节省我的屁股。

谢谢你们!

2 个答案:

答案 0 :(得分:0)

谢谢你们!发现我真的缺乏这种知识 无论如何,如果禁用stdout缓冲,那么整个工作

仍然不知道为什么它在INT10h之后表现得如此奇怪,而且我期望在大规模页面打印上有很大的开销,但至少它现在有用。以下是片段。

int main (int argc, char *argv[])
{
  REGPACK   Regs;
  KEY_DATA  KeyData

  //Disable stdout buffer
  setbuf(stdout, NULL);

  //Set cursor position AH= 02h, BH = Page Number, DH = Row, DL = Column
  Regs.h.ah = 0x02;
  Regs.h.bh = 0;
  Regs.h.dh = 15;
  Regs.h.dl = 40;
  intr(0x10, &Regs);

  printf("Test");

  while (KeyData.Key.ScanCode != SCAN_ESC)  {
   GetKey(&KeyData);
   printf("Key: %c", KeyCode.Key.AsciiChar);
  }
  return 0; 
}

答案 1 :(得分:0)

the indicated source would fail to successfully compile 
for several reasons, including:
1) two warnings about unused parameters argc and argv
2) unrecognized function: prtinf()

You can get 'immediate' output from printf calls by ending the 
format string with '\n' 
--or-- 
following the printf with the statement: fflush(stdout);
otherwise, the output is buffered until the OS feels like/has time to 
actually output it. (as for instance, when the program terminates