编辑:只有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,因为可变参数确实可以节省我的屁股。
谢谢你们!
答案 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