Я работаю над созданием 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
и он просто продолжает печатать «а». Теперь я уверен, что правильно вызываю функцию. Мой компилятор написан на 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");
}
Итак... Как мне на самом деле получить этот ключ в строке, а затем напечатать эту строку?