-1

我正在制作一种类似 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# 制作的,所以并不难理解。'append' 指令只是将 ASM 代码添加到文件中。调用方法:

            else if (line.StartsWith("readkey -> ") && line.EndsWith(";"))
            {
                append("mov ax, " + line.Substring(11, line.Substring(11).Length - 1));
                append("call os_input_char");
            }

所以......我如何真正将那个键放入字符串然后打印那个字符串?

4

1 回答 1

0

一些想法:
你正在使用stosb但你没有设置 ES。你确定已经好了?line.Substring
是否使用基于 0 或 1 的索引?

于 2014-11-30T15:53:29.333 回答