汇编语言(fasm)- 读取字符

3

BIOS中断函数21h(ah = 1h)应从标准输入读取字符并回显。

我的读取函数:

    mov ah, 1h
    int 21h

所以,如果我按下一个键,它会识别到,但不会回显字符。由于我正在使用我的代码从软盘引导它和字符回显功能int 10h(ah = 0eh),我认为我必须将其存储,然后使用“视频-电传输出”(int 10h(ah = 0eh))回显它。
或者我在上面的代码中漏掉了什么?

2
你说的“从我的软盘启动”,是指你正在编写自己的自定义引导程序,还是DOS启动盘(根据你代码中使用的DOS中断int 21h而推断)?答案取决于你编写代码的环境。 - nrz
2个回答

2

中断0x21是指向类似MSDOS的操作系统函数的“接口”,而不是BIOS。

如果您正在编写实模式引导程序或小型操作系统内核,必须使用自己的IRQ 1处理程序。

查看此答案以了解在自己的内存缓冲区中捕获所有按键的方法: 如何在x86汇编中检查键的状态?

然后,您将不得不安排某种类型的循环。通过读取内存缓冲区检查按键是否被按下。一旦检测到按键按下,要打印“回显”的按键,您需要向视频内存写入内容。这是另一个故事。如果使用默认文本模式,请写入0xB800段。如果使用图形模式(VGA或VESA),则必须从某个地方获取光栅字体。

如果您正在引导程序级别的汇编中编写代码,则可用性非常有限。绝对不能使用int 0x21


1

你基本上在做两件不同的事情:

  1. 从键盘获取字符
  2. 将其显示到屏幕上

涉及两个不同的BIOS中断,但幸运的是,两者都使用相同的AL值。

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

INT 21h 是MSDOS中的一个功能,如果我们谈论引导程序,这是不允许的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接