如何在没有int 21h的情况下获取输入并显示它

时间:2013-05-22 22:10:10

标签: assembly operating-system

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

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

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

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

3 个答案:

答案 0 :(得分: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读取char):

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.

在第一个例子的第二行,我将函数号复制到啊,这样当BIOS检查寄存器的值时,它知道该怎么做。有关常见中断类和函数的列表,请查看here

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

答案 1 :(得分: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

签署 Atari amigabot

现在,如果您可以打印出一些随机垃圾,旧的键盘缓冲区曾经是DS周围的一些:SI 0000:041E

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

答案 2 :(得分:-3)

操作系统是什么?

一些asm例程可以访问窗口

OSBGET,OSBPUT,OSRDCH,OSASCI,OSNEWL,OSWRCH,OSWORD,OSBYTE和OSCLI

另一种方法是将值移动到eax并在操作系统中删除它们