击键输入不适用于汇编内核
Keystroke input does not work for assembly kernel
在 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)尝试了各种其他标准输入命令,但其中 none 能够读取击键。我会键入一个键并按 ENTER,但什么也不会发生。更令人困惑的是,即使是 int 21h (ah = 02h) 中的输出命令也没有打印任何内容。我尝试将内核切换到实模式(32 位)而不是长模式(64 位),但 int 21h 仍然无法正常工作。明确地说,我希望能够在不等待 return 击键的情况下读取键盘输入,这样我就可以在调用输入中断和执行其他进程之间交替。 int 21h 似乎不起作用,甚至在 32 位模式下也不行,int 16 也是如此。我真正开始工作的唯一中断是 int 10h 和 int 13h(代码中显示),但其他中断不出于某种原因工作。
注意:
我使用 nasm bootloader.asm -p kernel.asm 组装了引导加载程序和内核以创建一个名为 bootloader 的 bin 文件,我使用 qemu-system-x86_64 到 运行 组装的 bin 文件.
[已编辑]
这是我编写的一个程序,其中包含引导加载程序和内核,在转换为 .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
在 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)尝试了各种其他标准输入命令,但其中 none 能够读取击键。我会键入一个键并按 ENTER,但什么也不会发生。更令人困惑的是,即使是 int 21h (ah = 02h) 中的输出命令也没有打印任何内容。我尝试将内核切换到实模式(32 位)而不是长模式(64 位),但 int 21h 仍然无法正常工作。明确地说,我希望能够在不等待 return 击键的情况下读取键盘输入,这样我就可以在调用输入中断和执行其他进程之间交替。 int 21h 似乎不起作用,甚至在 32 位模式下也不行,int 16 也是如此。我真正开始工作的唯一中断是 int 10h 和 int 13h(代码中显示),但其他中断不出于某种原因工作。
注意: 我使用 nasm bootloader.asm -p kernel.asm 组装了引导加载程序和内核以创建一个名为 bootloader 的 bin 文件,我使用 qemu-system-x86_64 到 运行 组装的 bin 文件.
[已编辑]
这是我编写的一个程序,其中包含引导加载程序和内核,在转换为 .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