2015-12-03 1 views
2

Je me demande comment imprimer un caractère dans l'assemblage sans int 0x80 et d'autres appels système. Je fais cela pour un noyau. J'ai une fonction d'impression qui fonctionne, mais je veux en écrire une en assemblage, donc je comprends mieux comment cela fonctionne réellement sans compiler tout à l'assemblage. J'utilise QEMU. Je suis nouveau dans l'assemblage et j'ai seulement pu imprimer des chaînes à l'aide de syscalls. J'utilise NASM assembleur et je voudrais que la sortie soit ELF32. Ceci est pseudo-assemblage de ce que je suis en train d'accomplir:Caractère d'impression sans appels système

section .text 
global _start 
extern magic_print_function 
_start: 
     mov edx,1;length of buffer 
     mov ecx,'c';character c to print 
     ;somehow magically print the character without specifying stdout, maybe something like the VGA buffer? 
     call magic_print_function 
+0

Vous ne pouvez pas. La seule façon de dire au noyau, "Hey - fais ceci" est via un appel système/interruption. Et sur x86, ce 'int 0x80'. Maintenant, dans 'nasm' et d'autres assembleurs, vous pouvez créer des macros * pour automatiser l'impression de caractères. C'est ce que tu veux dire? –

+0

@ DavidC.Rankin alors je devrais faire quelque chose dans c pour l'obtenir à la mémoire tampon VGA? Pourquoi je ne peux pas le faire dans l'assemblage? –

+2

C'est la différence entre l'informatique * en mode réel * et * en mode protégé *. Dans l'ancien DOS 16 bits, etc., vous avez un accès direct au tampon vidéo. (et le reste du système). En commençant par (je ne m'en souviens même pas), avec le passage en mode protégé, seul le noyau a accès au buffer vidéo (et à la plupart des autres matériels) et vous êtes limité à faire des appels système pour dire au noyau de faire quelque chose. Vous pouvez toujours faire tout en assembleur que vous pouvez faire en C, mais les deux traitent l'API du processeur via les interruptions du système. –

Répondre

0

D'accord, vous dites que vous ne voulez pas c. C'est un peu difficile, mais je suis sûr que c'est possible. Pour commencer, vous voulez définir ax et dx égal à 0. Ensuite, démarrez la pile à 0. Ensuite, vous voulez charger la mémoire vidéo dans ax. La mémoire vidéo commence à 0xb800. Alors faites la même valeur que hache.

Chargez votre message dans une variable et placez-le dans si. À ce stade, appelez une fonction qui écrit une chaîne dans la mémoire vidéo. Cette fonction est composée de fonctions plus petites qui écrivent individuellement des caractères et déplacent le curseur d'un endroit vers la droite.

Une fois que vous avez le code pour écrire une chaîne, l'accrocher avec une boucle. c'est incroyablement simple:

loop: 
    jmp loop 

Pour plus, essayez cette http://wiki.osdev.org/Babystep4