2

我目前正在尝试编写一个简单的操作系统,但在获取和返回用户输入时遇到了麻烦。基本上因为它独立于操作系统,我不能使用 int21。我现在使用的代码在这里:

    inputChar:
        mov ah, 00h
        int 16h
        mov al, ah
        mov ah, 0Eh
        int 10h

它得到了字符,但我无法成功显示它。我相信从某种形式的十六进制转换为字符输出是一个问题。我输入一个字符时的输出基本上是一堆随机字符。

有人对如何解决这个问题有任何想法吗?

4

3 回答 3

1

假设您使用 Intel 语法的 BIOS 中断:

要打印单个字符:

mov al, 'G' ;Copy the char's value to al. Replace G with the char you want to print
mov ah, 0x0e ;Copy the function number, in this case 0Eh, to ah.
int 0x10 ;Call the BIOS video service

获取输入并打印它(用 echo 读取字符):

xor ax, ax ;Make ax zero (faster than mov)
int 0x16 ;Raise the interrupt. Returns character code in al
mov ah, 0x0e ;Start Writing. Set AH to 0xe.
int 0x10 ; Call BIOS video service. Prints char.

在第一个示例的第二行中,我将功能编号复制到 ah,这样当 BIOS 检查寄存器的值时,它就知道该做什么了。有关常见中断类和函数的列表,请查看此处

如果汇编代码无法在您的计算机上编译,您可能正在使用 AT&T 语法汇编,但根据您提供的示例,我认为您不是。

于 2015-05-10T17:07:53.523 回答
0

尝试这个?看看你是否得到任何输出

push cs
pop ds
mov ax,B800 ;video
mov es,ax
mov di,42 ;part of way along monitor
mov cx,1F
mov ah,70 ;inverse video
.print 
lodsb
stosw
loop print

签约雅达利 amigabot

现在,如果您可以打印出一些随机垃圾,那么旧的键盘缓冲区曾经位于 DS:SI 0000:041E 附近

所以 ES:DI 将其打印到屏幕上 DS:SI 是缓冲区

于 2013-05-23T17:16:10.363 回答
-2

什么是操作系统?

一些asm例程可以访问windows

OSBGET、OSBPUT、OSRDCH、OSA​​SCI、OSNEWL、OSWRCH、OSWORD、OSBYTE 和 OSCLI

另一条路线是将值移动到 eax 并将它们丢弃在操作系统中

于 2013-05-23T01:04:51.367 回答