2013-05-22 3 views
2

J'essaie actuellement d'écrire un système d'exploitation simple et j'ai du mal à obtenir et à retourner l'entrée de l'utilisateur. Fondamentalement parce que c'est OS indépendant je ne peux pas utiliser int21. Le code que je me sers est maintenant ici:Comment obtenir l'entrée et l'afficher sans int 21h

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

Il obtient le caractère, mais je suis incapable d'afficher avec succès. Je crois que c'est un problème de conversion d'une forme d'hexagone à une sortie de personnage. La sortie lorsque je saisis un personnage est essentiellement un groupe de caractères aléatoires.

Est-ce que quelqu'un a des idées pour résoudre ce problème?

+0

Un peu de recherche rapide sur le Web montre que int16h dans le bios PC récupère les codes de balayage de clé brutes, plutôt que des caractères d'entrée. Si vous écrivez du code pour convertir une valeur en une série de caractères représentant ceux-ci en hexadécimal ou en décimal, vous pouvez les imprimer. Ou vous pouvez créer une table de recherche pour les convertir en caractères ou en abréviations (soit des chaînes terminées soit une longueur fixe) –

+2

[La liste d'interruption de Ralph Brown] (http://www.ctyme.com/intr/rb-1754.htm) dit que int16h/00h renvoie le code ASCII dans 'AL'. Avez-vous essayé de sortir cela, plutôt que 'AH' (le scancode)? – Michael

+0

Oui, je le pense. À partir du code affiché ne serait-ce pas essayer de produire la valeur al, puisque c'est ce que 0Eh utilisera? – Hirsh

Répondre

1

en supposant que vous utilisez interruptions BIOS avec la syntaxe Intel:

Pour imprimer un seul caractère:

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 

Obtenir entrée et l'imprimer (lire omble chevalier écho):

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. 

Sur la deuxième ligne du premier exemple, je copiais le numéro de fonction ah si que lorsque le BIOS vérifie la valeur du registre, il sait quoi faire. Pour une liste des classes et fonctions d'interruption courantes, jetez un oeil à here.

Si le code d'assemblage ne se compile pas sur votre ordinateur, vous utilisez probablement l'assemblage de syntaxe T AT &, mais selon l'exemple fourni, je ne pense pas que vous l'êtes.

-3

Quel est le système d'exploitation?

Certaines routines asm peuvent accéder à Windows

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

L'autre itinéraire est mov valeurs eax et les jeter dans la OS

+0

Euh ... quoi? Les routines que vous nommez proviennent de [BBC Micro] (http://en.wikipedia.org/wiki/BBC_Micro). Ils ne sont même pas pertinents sur x86! – duskwuff

+0

Je me demandais s'il avait regardé les 'interruptions logicielles' – ady

+1

Merci pour le commentaire, mais je dois utiliser des interruptions matérielles puisque j'écris actuellement un système d'exploitation, donc il n'y a pas d'autres interruptions logicielles, c'est pourquoi j'ai spécifiquement demandé quelque chose à remplacer 21h. – Hirsh

0

Essayez ceci? et voir si vous obtenez une sortie

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 

signé Atari amigabot

Maintenant, si vous pouvez imprimer des ordures au hasard le vieux tampon du clavier utilisé pour être quelque part autour de DS: SI 0000: 041E

Ainsi ES: DI il imprime à l'écran et DS: SI est le tampon

+0

Merci, je l'ai fait réparer, pas avec ce code exact, mais en utilisant une méthode similaire! Merci pour la réponse! – Hirsh

Questions connexes