【发布时间】:2017-09-02 01:52:53
【问题描述】:
我正在尝试了解操作系统的工作原理。这是一个我很难解决的简单任务:编写一个简单的引导加载程序,提示用户输入他的名字并打印欢迎消息,如“你好,>>name
如果有任何相关性,我正在运行 minix 3 和 qemu。我只是将asm 文件和dd 的前512 个字节编译为/dev/c0d0(minix 的虚拟硬盘驱动器)。
我可以打印消息并打印用户输入的内容。但是,后来我没能打印出用户名。
这是我的汇编代码:
[bits 16]
[org 0x7c00]
mov si, HelloString
call print_string
mov di, name
call read_name
mov si, name
call print_string
read_name:
read_char:
mov ah, 0h ; read character from keyboard
mov [di], ah ; save it in the buffer
inc di ; next char
int 0x16 ; store it in AL
cmp ah, 0x0d ; check for enter
je stop_reading
mov ah, 0eh ; display character in AL
int 0x10 ; echo it
jmp read_char ; an so on
stop_reading:
mov si, EoL
call print_string
ret
print_char:
mov ah, 0x0e ; one char
mov bh, 0x00 ; page number
mov bl, 0x07 ; font color
int 0x10
ret
print_string:
next_char:
mov al, [si]
inc si
or al, al
jz exit_function
call print_char
jmp next_char
exit_function:
ret
;data
HelloString db 'Enter your name', 0xd, 0xa, 0
name times 20 db 0
EoL db 0xd, 0xa, 0
times 510 - ($ - $$) db 0;
dw 0xaa55
我做错了什么?
【问题讨论】:
-
您会想要查看诸如 Ralph Brown 的 Int 0x16/ah=00 的中断列表之类的内容。特别是 AH 会有键盘扫描码。如果你想要 ASCII 字符,它实际上在 AL 中。我想你想做
cmp al, 0x0d而不是cmp ah, 0x0d -
您将 0 存储到
name的缓冲区中。
标签: assembly x86 bootloader osdev minix