【问题标题】:FASM Bootloader inputFASM 引导加载程序输入
【发布时间】:2014-06-09 09:52:24
【问题描述】:

我开始在 FASM 中从头开始制作引导加载程序。我只是做了一个基本的输入。 但我不知道该怎么做。

这是我的代码:

start:
mov ax, 07C0h 
add ax, 288     
mov ss, ax 
mov sp, 4096 
mov ax, 07C0h 
mov ds, ax 
mov si, text_string 
call print_string
jmp read  ; infinite loop of reading!
text_string db '<HammerOS> : Booted up!', 13, 10, 0

read:
mov ah,0h   ;get character from keyboard
int 16h     ;and store it in AL
mov ah,0eh  ;Display a character in AL
int 10h     ;aka, echo it

jmp read

have_read_txt:
mov si, AL
call print_string

print_string:     
mov ah, 0Eh 

.repeat: 
lodsb     
cmp al, 0 
je .done 
int 10h  
jmp .repeat 

.done: 
ret 


times 510-($-$$) db 0 
dw 0xAA55

它是做什么的,它接受控制台上的输入,但是当我按下回车键时,我想检查输入的内容,并据此做一些事情。

另外,我希望光标转到下一行。现在,如果我按下回车,文本将写在同一行上。

【问题讨论】:

    标签: assembly input bootloader fasm


    【解决方案1】:

    在您获取 char 然后将其写入屏幕的地方,您还需要将 char 存储在一些内存缓冲区中。

    当您通过比较 AL 与 'enter' 键码(应该是 13 或 10)来检测 'enter' 键时,您需要分析缓冲区并做一些事情。 列表 ascii codes here;可能有用。

    如果您想移动光标,请查看 int 10h(您已经使用过)描述: BIOS interrupt call.

    【讨论】:

    • 如何制作内存缓冲区?是带 db 还是带内存段?
    • 是的,您的文本字符串也是一个内存缓冲区。但是尝试使用“mov”指令将值从 8 位寄存器 (AL) 移动到 16 位寄存器 (SI) 是错误的。请改用“movzx”或 16 位 AX 寄存器。
    • 我尝试将其移动到缓冲区,但随后它将最终打印输入字符。我使用:mov [buffer], al
    • @JoshuaBakker:我认为你应该在开始编写操作系统之前先学习一些汇编教程。你错过了非常基础的知识
    • 我尝试在 ASM 中搜索缓冲区,但找不到任何东西。 FASM、NASM、MASM和EMU8086的难度有区别吗?
    猜你喜欢
    • 2021-11-20
    • 2014-10-03
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多