【发布时间】:2021-11-04 01:48:58
【问题描述】:
我正在编写一个小型 16 位操作系统,我想知道为什么 input_msg 不打印预期的输出。我正在使用 BIOS 电传打印中断并获取用户输入并在 input_msg 中使用stosb-ing 它。至少这是意图。
内核:
bits 16
org 0x9000
entry:
cld
call clear_screen_widetext
mov si, loaded_kernel
call print_str
jmp handle_enter
hang:
mov ah, 0x10
int 0x16
mov [input_char], al
mov di, input_msg
stosb
mov si, input_char
call print_str
mov al, [input_char]
cmp al, 13
je handle_enter
jmp hang
print_str:
lodsb
mov ah, 0x0E
cmp al, 0
je done
int 0x10
jmp print_str
clear_screen_widetext:
mov ah, 0x0700
int 0x10
ret
handle_enter:
mov si, enter_handle_data
call print_str
mov si, input_msg
mov si, cli_default_text
call print_str
jmp hang
done:
ret
data:
loaded_kernel db 'Loaded Kernel Successfully', 13, 10, 0
input_char db 0, 0
input_msg db 0, 0, 0, 0
enter_handle_data db 10, 0
cli_default_text db '>>>', 0
感谢任何帮助
【问题讨论】:
-
这个内核没有设置 ES 或 DS 来匹配它的 ORG,而且你没有显示引导加载程序,所以我们不知道这是否已经发生。 (或者引导加载程序是否甚至在正确的地址加载内核或跳转到它。)所以这不是minimal reproducible example。使用调试器(例如在 Bochs 中)单步执行您的代码。
-
另外,缩进指令相对于标签,并在块之间留下空白行(例如在
ret之后,或在一些循环之前),所以它是可读的。如果没有 cmets 或格式,这很难读。 -
谢谢,是的,引导加载程序有效,引导加载程序有效,我可以从这个内核将消息打印到屏幕上,所以没有问题
标签: assembly x86 operating-system nasm osdev