Question

Je viens de commencer à utiliser le langage d'assemblage (j'avais envie d'apprendre quelque chose de nouveau) et j'ai rencontré quelques questions (jusqu'à présent) auxquelles tous les tutoriels que j'ai consultés ne répondent pas, ou sont trop vieux pour savoir.

1) J'ai essayé quelques recherches (peut-être que je ne connais pas les bons mots-clés), mais je ne trouve pas de liste actualisée des modes graphiques permettant de modifier les résolutions d'écran, etc. Les meilleurs que j'ai trouvés est: Didacticiel Assembler , et j’ai peine à penser que 640x480 est le meilleur langage d'assemblage de résolution peut utiliser. Est-ce que quelqu'un connaît un didacticiel plus récent que je peux utiliser?

Modifier: l'interruption 10h est ancienne et ne prend pas en charge plus de 640x480

2) Est-il possible de & mov; mov " une valeur d'une variable à une autre variable sans la déplacer d'abord dans un registre? Exemple:

jmp start
  n1     dw 0
  n2     dw 0
  res    dw 0
start:
  mov n1,5
  mov n2,6
  mov res,n1
  add res,n2
...etc...

Modifier: ce n'est pas possible. Vous ne pouvez pas passer de mémoire en mémoire sans utiliser de registres.

3) Pour répondre à la question 1, existe-t-il un moyen de détecter le mode graphique actuellement utilisé par un utilisateur, afin que je puisse le changer et le remettre après? (Je suppose qu'il y en a un, mais je ne sais pas comment le faire.)

Modifier: vous devez interroger le système d'exploitation pour connaître les paramètres graphiques.

Était-ce utile?

La solution

Pour les questions n ° 1 et n ° 3, consultez les extensions du BIOS VESA . Il s’agissait là d’une norme pour traiter le problème "Super VGA". modes, populaires dans les années 90.

En ce qui concerne le point 2, en général, la réponse est non, vous ne pouvez pas déplacer la mémoire MOV en mémoire. Mais ce n'est pas tout à fait vrai: il existe MOVS (chaîne de déplacement), qui déplace un octet, un mot ou un mot de DS: SI à ES: DI. Généralement, cette instruction est utilisée avec un préfixe REP pour déplacer des blocs de mémoire. De plus, en supposant que la pile soit configurée, vous pouvez déplacer la mémoire vers la mémoire sans écraser un registre en appuyant et en décompressant:

PUSH [mem1]
POP  [mem2]

Autres conseils

En ce qui concerne votre première question, l’interruption 10 est très ancienne et n’est probablement pas utilisée au-delà des résolutions de 640x480. Une autre partie de la pile de logiciels est maintenant utilisée. c'est-à-dire qu'il vous faudrait interroger Windows pour obtenir la résolution d'écran actuelle.

Cet article plutôt prolixe contient beaucoup de détails sur la façon d'utiliser l'assembleur pour piloter DirectX dans Windows. De nos jours, DirectX est la famille d’API clé pour les graphismes. Vous n’allez pas loin en utilisant des interruptions de type DOS et en programmant directement le framebuffer VGA.

Interrupt 10h est essentiellement un appel de fonction du système d’exploitation (en réalité, il exécute le code BIOS). En interne, il lit / écrit la mémoire vidéo ainsi que divers registres sur la carte graphique. Pour avoir une idée du type de choses qui se passe " dans " interrompez 10h, vérifiez cette sortie.

Lorsque vous exécutez un programme DOS sous Windows, il s’exécute sur une machine DOS virtuelle. Windows ne le laisse pas réellement toucher la carte graphique, mais le laisse jouer avec une carte virtuelle. Habituellement, cela ne concerne que les modes d’écran VGA (et parfois seulement le mode texte), c’est-à-dire que vous avez une carte VGA virtuelle (et non une carte graphique moderne). Pour cette raison, en langage assembleur 16 bits sous Windows, vous ne pouvez pas utiliser toutes les fonctionnalités des cartes graphiques modernes.

Oui, bien sûr, le langage assembleur peut vous permettre de faire tout ce que la carte graphique peut faire. Mais seulement si soit:

  • votre programme a un accès illimité au matériel graphique (par exemple, vous écrivez un pilote de périphérique Windows ou Linux, ou vous l'exécutez sous DOS, ou dans votre propre noyau), ou
  • votre programme passe par l'interface de système d'exploitation appropriée.

Si vous êtes toujours intéressé par le langage assembleur, je vous suggérerais d'essayer d'écrire un noyau de jouet. En faisant cela, vous apprendrez une montagne de choses.

Laissez un commentaire si vous souhaitez plus d'informations.

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