Как прочитать ключ и сохранить значение этого ключа в переменной в ASM?

Я работаю над созданием 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");
            }

Итак... Как мне на самом деле получить этот ключ в строке, а затем напечатать эту строку?


person Ryan N.    schedule 26.11.2014    source источник
comment
здесь было бы неплохо почитать.. - stackoverflow.com/questions/8629188/   -  person MethodMan    schedule 26.11.2014


Ответы (1)


Некоторые идеи:
Вы используете stosb, но не настраиваете ES. Вы уверены, что все в порядке?
Использует ли line.Substring индексирование на основе 0 или 1?

person Sep Roland    schedule 30.11.2014