[英]Using BIOS interrupts in x86
我正在嘗試以實模式在QEmu上實現字符串操作。 這是我所做的讀取和打印功能:
int readString(char* line)
{
int i = 0;
char in = 0x0;
while (in != 0xd)
{
in = interrupt(0x16, 0x0, 0x0, 0x0, 0x0);
*(line + i) = in;
interrupt(0x10,0xe*0x100+in,0x0,0x0,0x0);
i++;
}
*(line + i) = 0x0;
return i;
}
int printString(char* string)
{
int i = 0;
while (*(string + i) != '\0')
{
char al = *(string + i);
char ah = 0xe;
int ax = ah * 256 + al;
interrupt(0x10,ax,0,0,0);
i++;
}
return i;
}
這些功能在以下主程序中調用:
void main()
{
char* line;
printString("Reading from input:\n\r");
readString(line);
printString("Line read is:\n\r");
printString(line);
}
readString函數從鍵盤獲取輸入,在我們輸入輸入字符串時將其打印到屏幕上(在QEmu上),並將結果存儲在傳遞的參數中(這是指向char的指針)。 但是光標在readString函數之后似乎並沒有移動。 之后調用printString函數(在主函數中)將導致字符串被覆蓋。 例如,如果我寫“ Hello”,那么我期望輸出為:
Reading from input:
Hello Line read is:
Hello _
這里的“ _”是光標。 但是實際輸出的是:
Reading from input:
Line read is:
Hello
光標在上方Hello的“ H”下(在實際輸出中),並且預期輸出第二行中的初始“ Hello”將被覆蓋。 為什么在打印字符串時光標不移動?
當用戶按下Enter鍵時,您將獲得CR
字符(代碼13, \\r
)。 但是,BIOS輸出函數將其嚴格解釋為回車符,即它將光標移回行的開頭。 您需要自己添加LF
(代碼10, \\n
)。 例如:
int readString(char* line)
{
int i = 0;
char in = 0x0;
while (in != 0xd)
{
in = interrupt(0x16, 0x0, 0x0, 0x0, 0x0);
*(line + i) = in;
interrupt(0x10,0xe*0x100+in,0x0,0x0,0x0);
/* add LF to CR */
if (in == 13) interrupt(0x10,0xe*0x100+10,0x0,0x0,0x0);
i++;
}
*(line + i) = 0x0;
return i;
}
int printString(char* string)
{
int i = 0;
while (*(string + i) != '\0')
{
char al = *(string + i);
char ah = 0xe;
int ax = ah * 256 + al;
interrupt(0x10,ax,0,0,0);
/* add LF to CR */
if (al == 13) interrupt(0x10,0xe*0x100+10,0x0,0x0,0x0);
i++;
}
return i;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.