首页 > 解决方案 > 击键输入不适用于汇编内核

问题描述

在 64 位 Ubuntu 上,我编写了一个加载内核的引导加载程序,它提供了一个回显程序(输出任何输入的内容):

引导加载程序代码:

    [BITS 16]
    org 0x7C00
    bootdrive db 0
    start:
            mov [bootdrive], dl
            mov ah, 0
            int 13h

            mov dx, 0
            mov ah, 2
            mov al, 0x10
            mov dl, [bootdrive]
            mov ch, 0
            mov dh, 0
            mov cl, 2
            mov bx, 0
            int 13h
            jmp 0x1000:0000
    times 510-($-$$) db 0
    dw 0xAA55

内核代码:

    [BITS 64]
    call _stdin
    jmp $

    _stdin:
            mov ah, 0
            int 16h
            mov ah, 0eh
            mov bx, 0
            int 10h
            ret

int 16h/ah=0 接受输入并将缓冲区放入 al。然后,我尝试通过 int 10h/al=0eh 打印 al,但它没有通过。我什至试着把

    mov al, "!"

介于两者之间

    mov ah, 0eh

    mov bx, 0

但它似乎不喜欢 16h 中断。我还使用 int 21h (ah = 8, ah = 1, ah = 0ah) 尝试了各种其他标准输入命令,但没有一个能够读取击键。我会键入一个键并按 ENTER,但什么也不会发生。更令人困惑的是,即使 int 21h (ah = 02h) 中的输出命令也没有打印任何内容。我尝试将内核切换到实模式(32 位)而不是长模式(64 位),但 int 21h 仍然无法工作。需要明确的是,我希望能够在不等待返回击键的情况下读取键盘输入,这样我就可以在调用输入中断和执行其他进程之间交替。int 21h 似乎没有工作,即使在 32 位模式下,也没有 int 16。我真正开始工作的唯一中断是 int 10h 和 int 13h(显示在代码中),

注意:我使用 nasm bootloader.asm -p kernel.asm 组装了引导加载程序和内核,以创建一个名为 bootloader 的 bin 文件,并使用 qemu-system-x86_64 运行组装后的 bin 文件。

标签: assemblyinputkernelinterrupt

解决方案


[编辑]

这是我编写的包含引导加载程序和内核的程序,在转换为 .iso 文件时可以工作:

    [BITS 16]
    org 0x7C00

    mov ax, 0
    mov es, ax
    mov ah, 2
    mov al, 1
    mov ch, 0
    mov dh, 0
    mov cl, 2
    mov bx, _stage2
    int 0x13
    jmp _stage2
    times 510-($-$$) db 0
    dw 0xAA55

    _stage2:
            call _stdin
            call _stdout
            jmp _stage2
    _stdin:
            mov ah, 1
            mov al, 0
            int 16h
            cmp al, 0
            je _stdin
            mov ah, 0
            int 16h
            ret
    _stdout:
            mov ah, 0eh
            mov bx, 0
            int 10h
            ret

推荐阅读