如何使用汇编在C语言中实现输入功能

时间:2018-08-15 09:57:22

标签: c inline-assembly

我正在使用OSDEV制作操作系统,并且想制作一个控制台,但是使用scanf时我无法使用。使用此代码将导致无法输入文本。输出为:

KironOS Console - v0.0.1 PRE-ALPHA 键入help作为命令列表。

> Some weird characters

> Some weird characters

> Some weird characters

而且还在继续

kernel.c

typedef int bool;
#define true 1
#define false 0

#include <stdio.h>

const char* input();
void execute(const char* cmd);
void output(const char* s, bool ln);
void _puts(const char* s);
void _putchar(char c);

char* newline = "\n\r";
char* version = "0.0.1 PRE-ALPHA";

void main(void) {
    output("KironOS Console - v",0); output(version,1);
    output("Type 'help' for a list of commands.",1);
    output("",1);
    while(1==1) {
        output("> ",0);
        execute(input());
        output("",1);
    }
}

void execute(const char* cmd) {
    output(cmd,1);
}

const char* input() {
    // This doesn't work
    const char* inpt = "Hi";
    scanf("%c",&inpt);
    return inpt;
}

void output(const char* s, bool ln) {
    _puts(s);
    if (ln==1) {
        _puts(newline);
    }
}

void _puts(const char* s) {
    while(*s != 0) {
        _putchar(*s);
        s++;
    }
}

void _putchar(char c) {
    __asm {
        mov ah, 0Eh
        mov al, [c]
        mov bh, 0
        mov bl, 0Fh
        int 10h
    }
}

2 个答案:

答案 0 :(得分:0)

正如您在评论中指出的那样,您的输入例程无效。有几个问题。

const char* inpt = "Hi";
scanf("%c",&inpt);

这段代码看起来像是要创建一个可以接受字符串的缓冲区-但是,如果这样,该缓冲区只够容纳两个字符串。 (实际上有3个字符,“ H”,“ i”和0。)

快速浏览scanf的文档会告诉我们,在格式说明符需要与指定的类型匹配之后,您传递的参数。在您的情况下,这是一个字符。因此,您应该传递一个字符的地址,即char*。但是实际上您正在传递char*的地址,但我不知道为什么您的编译器没有警告您(甚至会产生错误)。我不会让我犯这样的错误。

这应该可行

char inpt[2] = {0,0};
scanf("%c",inpt);

...假设您只希望一次只能输入一个字符,并且希望将其视为字符串。 但是,从input函数返回局部变量的地址并不安全。您可以返回单个字符,也可以将缓冲区的地址传递给函数,然后它可以写入缓冲区。

如果您打算输入整个字符串并对其进行操作,则可能需要这样的内容:

char str [80];
scanf ("%79s",str);

答案 1 :(得分:-1)

编辑: 根据评论

在C语言中,您的selected_position = forms.ModelChoiceField(queryset=Vacancy.objects.all(), empty_label='(Nothing)') 函数将是:

putchar

这是假设您使用的是80 * 25文本模式。