7
votes

6 Réponses :


0
votes

Ce n'est pas l'assemblage en ligne, c'est C. très bas niveau C, en utilisant une fonction pour provoquer l'interruption, mais toujours c.

Cette page a une documentation (pour le compilateur DJGPP, Les vôtres pourraient travailler différemment), y compris la structure utilisée pour représenter les registres. Il note également:

Notez que, contrairement à la __dpmi_int fonction, demandes qui traversent int86 et fonctions similaires sont spécialement traité pour les faire Convient pour invoquer le mode réel interruption de mode protégé programmes. Par exemple, si un particulier La routine prend un pointeur à BX, INT86 S'attend à ce que vous mettiez un (mode protégé) pointeur à EBX. Donc, int86 devrait avoir un soutien spécifique pour chaque interrompre et fonction que vous invoquez ceci chemin. Actuellement, il ne supporte qu'un sous-ensemble de toutes les interruptions disponibles et fonctions [...]


1 commentaires

Ceci est vrai pour le compilateur DJGPP C, car INT86 n'est pas une fonction standard, il n'est pas indiqué que le compilateur Mars numérique fonctionne de la même manière, il peut avoir plus ou moins de restrictions.



1
votes

Le premier formulaire est plus lisible qui compte également pour quelque chose; -)

Si vous voulez savoir si INT86 fait quelque chose derrière votre dos, compilez simplement votre programme et examinez le code de montage généré


3 commentaires

Je pense quelle forme est plus "lisible" que l'autre est une question d'opinion personnelle, car personnellement, je trouve la deuxième plus lisible, mais les deux sont compréhensibles. Disserter le code compilé serait une chose d'un dernier recours, si quelqu'un n'avait pas la réponse pour moi ici que je ne vais sûrement pas aller cette voie.


Le premier formulaire est plus lisible par des compilateurs qui utilisent un format différent pour l'assemblage en ligne. Mais vous pouvez vous inquiéter de la surcharge de l'appel de la fonction inutile, en plus de résoudre les éléments du syndicat , alors le int86 copiant tous les registres (tous ceux définis dans le Union, pas seulement celles que vous utilisez) de la mémoire, puis la copie tous de nouveau (que vous jetez ensuite).


@ P-Nuts - Enchanté toujours mon café, je pensais que Alon signifiait lisible comme à la lecture des yeux humains. Je conviens que le premier formulaire serait lisible par plus de compilateurs.



1
votes

En appelant Int86, votre code reste dans C. Dans les deux cas, il écrit le pixel en faisant une interruption système.

Si vous avez un lot de pixels à écrire et que vous commencez sérieusement à frapper des problèmes de vitesse, il pourrait y avoir une voie plus directe (et beaucoup moins sûre mais potentiellement utile) d'écrire directement sur le pixel mémoire.


2 commentaires

Il peut y avoir un point où j'aurais beaucoup de pixels d'écrire, car le client débattre d'un écran de démarrage au début de l'application. Pour l'instant, j'en ai seulement besoin de dessiner la ligne impair à l'écran. Cette question peut finir par être sa propre question lorsque le temps vient.


@Heather: Ouais, j'ai regardé votre machine et l'écran est monochrome et minuscule, alors je doute si des graphiques seront une grande partie du goulot d'étranglement.



9
votes

Lorsque vous utilisez l'appel de la fonction INT86 , c'est une bibliothèque d'exécution C appelant les registres et émet une fonction DOS INT . Les deux méthodes sont vraiment identiques à une exception près, lorsque vous utilisez un assembleur en ligne, le code est en réalité intégré au code d'objet lorsqu'il est compilé et lié.

Assemblée en ligne serait considérée comme plus rapide puisque vous n'avez pas les frais généraux nécessaires à l'appelant C Runtime Bibliothèque d'invoquer l'interruption DOS pour vous. L'ONUS est sur vous pour vous assurer de suffisamment d'espace de pile lors de l'utilisation de l'assemblage en ligne, tandis que la bibliothèque d'exécution C prend en charge l'affectation d'espace de pile lors de la configuration des registres avant d'invoquer la fonction int86 .

Le int86 est un moyen de faciliter l'invocation des interruptions DOS. C'était extrêmement populaire parmi l'ancienne Suite Borland Turbo C des compilateurs et sur Microsoft, je parle de vieux compilateurs avant de remporter la victoire 3.1.

Parler de l'interruption 0x10, qui est responsable de la sortie vidéo, Si je me souviens bien, à l'époque, certains BIOS ont détruit le registre bp et que la solution de contournement était de le faire: xxx

Vous pouvez découvrir le Extende des fonctions de BIOS sur la liste d'interruptions de Ralph Brown ici . Aussi aidPC V2.1 peut également aider, trouvez ici .


1 commentaires

Je pense que j'avais une copie de la liste d'interruptions de Ralph Brown au collège maintenant que j'y pense, et je n'ai aucune idée de ce que j'ai fait avec elle. Il semble que j'ai oublié cette ressource géniale, merci! C'est très utile.



1
votes

Les deux extraits de code accomplissent la même chose. Le gros avantage du 1er 1 est qu'il y a de la probabilité que vous puissiez toujours l'utiliser lorsque vous changez de compilateurs. Et que vous ne souscrivez pas à un registre que le générateur de code du compilateur de C »utilisait à un autre but. Quelque chose que vous oubliez certainement de prendre soin de votre extrait d'ASM.


1 commentaires

Je soupçonnais que je ne faisais pas quelque chose que je devais faire dans le bloc ASM. Merci.



1
votes

Vous devez vérifier le manuel des compilateurs pour savoir qui est responsable de la restauration des valeurs du registre après une section de montage en ligne. Étant donné que vos variables sont affectées à des registres, des modifications involontaires des valeurs peuvent entraîner des bugs difficiles à trouver. INT86 (0x10, & REGS, & REGS); Enregistre les registres et les restaure après avoir exécuté l'interruption logicielle.

Certains compilateurs acceptent des instructions pour définir une liste de clobs (registres qui doivent être enregistrés et restaurés). Habituellement, une section d'assembleur doit enregistrer des registres et des indicateurs qui seront modifiés avec la poussée et les restauré à l'aide de POP, soit par le compilateur, soit par vous-même. Par conséquent, le premier exemple doit être préféré.


1 commentaires

Je suis d'accord sur INT86 - Je pense que je vais utiliser cette approche pour être en sécurité, à moins que la vitesse ne devienne un véritable problème, merci :)