如何读取密钥并将该密钥的值存储到ASM中的变量中?

时间:2014-11-26 19:55:22

标签: assembly nasm cosmos

我正在研究一种类似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");
            }

那么......我如何将该键实际输入字符串然后打印该字符串?

1 个答案:

答案 0 :(得分:0)

一些想法:
您使用的是stosb,但未设置ES。你确定它已经好了吗? line.Substring 使用基于0或基于1的索引吗?