Gcc C获得一个没有标准数据库的原始按键

Gcc C获得一个没有标准数据库的原始按键,gcc,assembly,x86,nasm,osdev,Gcc,Assembly,X86,Nasm,Osdev,我正在使用一个非常基本的操作系统来获得学习经验,我试图从按键开始。我正在制作一个独立的可执行文件,因此没有标准库。我如何从键盘获取输入?我已经知道如何通过视频存储器打印到屏幕上 /* * kernel.c * */ void cls(int line) { // clear the screen char *vidptr = (char*) 0xb8000; /* 25 lines each of 80 columns; each element takes 2 bytes *

我正在使用一个非常基本的操作系统来获得学习经验,我试图从按键开始。我正在制作一个独立的可执行文件,因此没有标准库。我如何从键盘获取输入?我已经知道如何通过视频存储器打印到屏幕上

/*
* kernel.c
* */

void cls(int line) { // clear the screen
    char *vidptr = (char*) 0xb8000;
    /* 25 lines each of 80 columns; each element takes 2 bytes */
    unsigned int x = 0;
    while (x < 80 * 25 * 2) {
        // blank character
        vidptr[x] = ' ';
        // attribute-byte - light grey on black screen
        x += 1;
        vidptr[x] = 0x07;
        x += 1;
    }
    line = 0;
}

void printf(const char *str, int line, char attr) { // write a string to             video memory
    char *vidptr = (char*) 0xb8000;
    unsigned int y =0, x = 0;
    while (str[y] != '\0') {
        // the character's ascii
        vidptr[x] = str[y];
        x++;
        // attribute byte - give character black bg and light gray fg
        vidptr[x+1] = attr;
        x++;
        y++;
    }
}

void kmain(void) {
    unsigned int line = 0;
    cls(line);
    printf("Testing the Kernel", line, 0x0a);
}

您必须轮询键盘上的击键,或者在输入字符时使用IRQ从键盘端口(0x60)读取字符。IRQ方法是首选方法,但中断处理程序涉及设置自己的GDT、IDT和编写键盘处理程序(可能有某种环形缓冲区实现)。必须处理键转换,中断处理程序也必须处理中断结束)。如果你正在编写一个严肃的操作系统,我建议你现在就看中断处理,而不是以后。你是在问如何在基于x86的裸机PC上读取键盘吗?我之前为一个与内核相关的问题编写了一些测试代码(使用multiboot)在这个SO答案中:。这是一个非常基本和不完整的测试,因为它没有任何环形缓冲区,中断直接打印到显示器上。我使用了原始海报的代码,现在意识到键盘例程进行不必要的端口0x64访问(不会损害任何东西,但会降低性能)而且它没有设置GDT。如果使用QEMU
-kernel
选项,这不是问题。我觉得我现在应该回去修改代码。代码只是为了演示如何进行中断以及如何获得击键和进行一些最小的键盘映射。它没有成为一个真正的键盘处理程序,但这个示例可能会给出一些提示我知道了。我以为你的意思是使用BIOS服务访问键盘。你必须轮询键盘上的击键或使用IRQ从键盘端口(0x60)读取字符IRQ方法是首选,但中断处理程序包括设置自己的GDT、IDT和编写键盘处理程序(可能有某种环形缓冲区实现)。必须处理键转换,中断处理程序还必须处理中断结束)。如果您正在编写一个严肃的操作系统,我建议您现在就开始研究中断处理,而不是以后。您是否在询问如何在基于x86的裸机PC上读取键盘?我之前在本SO答案中为一个与内核相关的问题(使用multiboot)编写了一些测试代码:。这是一个非常基本和不完整的测试,因为它没有任何环形缓冲区,中断直接打印到显示器上。我使用的是原始海报的代码,现在意识到键盘例程执行不必要的端口0x64访问(不会损害任何东西,但会降低性能),并且不会设置GDT。如果使用QEMU
-kernel
选项,这不是问题。我觉得我现在应该回去修改代码了。代码只是用来演示如何让中断继续,如何击键,以及如何进行一些最小的键盘映射。它还不是一个真正的键盘处理程序,但这个例子可能会给你一些想法。@MichaelPetch我明白了。我以为你的意思是使用BIOS服务进行键盘访问。
    ;; entry point
bits 32                          ; nasm directive - 32 bit
global entry
extern _kmain                    ; kmain is defined in the c file

section .text
entry:  jmp start

    ;multiboot spec
    align 4
    dd 0x1BADB002            ; black magic
    dd 0x00                  ; flags
    dd -(0x1BADB002 + 0x00)  ; checksum. m+f+c should be zero

start:
    cli                      ; block interrupts
    mov esp, stack_space     ; set stack pointer
    call _kmain
    hlt                      ; halt the CPU

section .bss
resb 8192                        ; 8KB for stack
stack_space: