Question

Je suis en train d'utiliser l'interruption vidéo de bios pour afficher un caractère à l'écran. Ce qui suit est le code d'assemblage:

mov $0x0A, %AH
mov $0x68, %AL ; to display character 'h'
int $0x10

I assemblé en utilisant le code assembleur GNU pour produire un fichier objet appelé sample.o La taille totale de sample.o est 449 octets. Maintenant, j'écris manuellement ce fichier objet les chiffres hexadécimaux 0x55 et 0xAA à des positions d'octets 511e et 512e pour la rendre bootable. Je crois donc maintenant j'ai un secteur d'amorçage 512 octets. J'utilise qemu pour essayer de démarrer à partir de ce fichier d'objet:

$> qemu -fda sample.o

L'émulateur QEMU démarre et se fige au point où il est dit « Amorcer à partir de disquette ... » Mais je pensais après avoir détecté le secteur de démarrage de la vidéo interruption code bios était censé courir et afficher un caractère à l'écran.

Je sais que je fais quelque chose horriblement mal. Peut-être que je me manque le concept des interruptions. Quelqu'un peut-il aider.

EDIT: Je suis maintenant avec as86 et ld86 pour produire juste le binaire plat. Et au lieu de 0x0A dans AH j'utilise 0x0E et il semble que cela a fait l'affaire. Semble comme bios question de la mise en œuvre.

Je vous remercie tous ceux qui ont répondu en arrière.

Merci

Était-ce utile?

La solution

Un fichier .o normal contient tout à fait un peu autre que simplement le code binaire résultant, il est donc pas surprenant que ce que vous faites ne fonctionne pas (le résultat de ce devrait être d'environ 10 octets environ).

Vous pouvez soit écrire un script pour ld pour l'obtenir pour produire un binaire plat (je crois me rappeler qui est censé être possible, mais ne l'ai pas essayé personnellement). Si je faisais cela, je serais probablement utiliser nasm à la place, car il peut produire assez facilement sortie binaire brut. Une autre possibilité serait de vieux MS-DOS assembleur que peut produire la sortie de format .com (qui est aussi binaire brut, mais vous devez être prudent, car il charge un peu différemment).

Autres conseils

Vous devez passer la valeur d'attribut dans BL (07h est gris sur noir), numéro de page en Bosnie-Herzégovine et compter dans CX.

Vous dites que vous l'avez compilé avec le gaz et il vous a donné un fichier 448 octets? Assemblez-vous dans un fichier ELF ou quelque chose? Je vous recommande nasm bin -f, en utilisant la directive 16 BITS.

Comme Coffin Jerry dit, le problème est que votre fichier .o n'est pas une image de disquette avec un secteur de démarrage approprié. Le fichier contient .o beaucoup d'informations en plus du code tels que les noms de symboles et d'information de déplacement.

Si vous utilisez MSNA, utilisez -f bin pour produire un binaire brut. Si vous utilisez LD, vous pouvez écrire un script de liaison.

Pour vous aider avec ce genre de choses, le meilleur endroit est probablement osdev.org et son forum .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top