【问题标题】:Why doesn't input_msg print?为什么 input_msg 不打印?
【发布时间】: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


【解决方案1】:

为什么 input_msg 不打印?

只是因为您不要求打印!你在这里忘记了一个额外的call print_str

mov si, input_msg
                              missing call !!!!!
mov si, cli_default_text
call print_str

但是等等,即使你插入了这个,你也不会看到输入的文本,因为你的 hang 输入循环,将stosb所有字符相互叠加!而且因为回车 (13) 是最后一个,所以没有视觉输出。

您需要将mov di, input_msg 指令移到hang 循环之外!

请查阅 BIOS api。 BIOS.Teletype 函数 0Eh 和 BIOS.ScrollWindowDown 函数 07h 都有附加参数。你很幸运,所有这些都以某种方式起作用......

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 2022-01-25
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多