我正在研究一种类似C#的语言,它直接编译为x86 NASM代码。我编写了一个类似于Console.ReadKey()的函数。它应该等待一个键,然后将它的值存储在一个字符串中。以下是ASM功能的代码:
os_input_char:
pusha
mov di, ax ; DI is where we'll store input (buffer)
call os_wait_for_key ; Moves the next char into al
stosb ; Store character in designated buffer
mov al, 0 ; 0-terminate it
stosb ; ^^
popa
ret
然后我在我的代码中调用该函数。这是:
type [kernel]
:start
string key = "a";
graphicsmode;
nasm{
mov bl, 0001b ;blue
call os_clear_graphics ;clear
}nasm
movecursor(#0#, #0#);
print(" ");
print(" Welcome to LightningOS! ");
print(" ");
:main1
readkey -> key;
//I put the key code into the variable "key"
println("you pressed: "+%key%);
//Now print the variable key
goto(main1);
//now loop back to main
它只是保持打印' a。现在我确信我正在正确调用该函数。我的编译器是用C#编写的,所以它并不难以理解。 '追加'指令只是将ASM代码添加到文件中。呼叫方法:
else if (line.StartsWith("readkey -> ") && line.EndsWith(";"))
{
append("mov ax, " + line.Substring(11, line.Substring(11).Length - 1));
append("call os_input_char");
}
那么......我如何将该键实际输入字符串然后打印该字符串?
答案 0 :(得分:0)
一些想法:
您使用的是stosb
,但未设置ES。你确定它已经好了吗?
line.Substring 使用基于0或基于1的索引吗?