Bonsoir,
Envoyé par
imkyozz
Bonjour,
Je commence depuis cette années des études en informatique de gestion. J'ai aucuns difficultés pour les cours de web (php/css/html) ni pour les cours de C. Par contre, pour mon cours d'assembleur, ce n'est pas trop ça..
Je trouve que pour de l'informatique de gestion, le programme est assez poussé (peu de gens pratiquent encore l'assembleur, encore moins à l'école). Et pour quelqu'un qui débute, je trouve également que tu t'en sors plutôt bien.
J'ai un devoir pour demain que je n'arrive pas vraiment à faire.
Voici l'exercice 1 :
Pour celui là je pense savoir plus ou moins comment faire.. J'ai écrit quelque chose du style :
1 2 3 4 5 6 7 8
| MOV AX, 4321h
MOV BX, 8765h
MOV CX, AX
MOV AX, BX
MOV BX, CX
MOV CH, AH
MOV AH, AL
MOV AL, CH |
Ce n'est pas mal du tout mais, en réalité, il existe l'instruction « XCHG » pour permuter facilement le contenu de deux registres. Tu peux également utiliser la pile si elle est correctement initialisée.
Ensuite on me demande un exercice deux :
Là, les choses se compliquent.
Pour les adresses, je pensait les convertir en adresses physiques.. En faisant segment+offset..
De cette manière, 5002:3333 donnerait 8335h et 6004:DCBA donnerait : 14CBEh (?) pas sûr de moi pour celui là..
C'est presque cela mais il faut décaler le segment de 4 bits vers la gauche avant de faire l'opération, sinon le segment en lui-même n'aurait aucun intérêt. Ça revient à le multiplier par 16 et/ou à lui rajouter un « zéro » hexadécimal :
+--+--+--+--+
| | | | | <-- Offset
+--+--+--+--+
+--+--+--+--+
+ | | | | | <-- Segment
+--+--+--+--+
----------------------
+--+--+--+--+--+
= | | | | | | <-- Adresse physique
+--+--+--+--+--+
Ceci donnerait « 6004:DCBA = 6DCFA » et « 5002:3333 ≡ (…je te laisse trouver) »
Par contre le dernier exercice, ça ne va vraiment pas :
Là par contre ça ne va vraiment pas, je ne vois vraiment pas comment copier seulement 2 octets à chaque fois.. Si vous pouviez m'éclairer..
Copier deux octets, c'est facile. Les registres que tu utilises sont naturellement larges de 16 bits, donc de deux octets.
Par contre, n'oublie pas qu'un octet s'écrit sur deux chiffres hexadécimaux, de 00 à FF. Et je pense que c'est le format qui t'est donné dans ton énoncé.
C'est à vérifier avec ton professeur mais si c'est bien le cas, cela signifie qu'il faut lire un seul octet par registre. Dans ce cas, commence par mettre à zéro les registres concernés, soit avec « MOV AX, 0 », soit avec « XOR AX, AX » si tu veux épater ton prof', et même chose avec les suivants. Ensuite, il te suffit de charger uniquement la partie basse du registre avec « MOV AL, xxxxxx », « MOV BL, xxxxx », etc.
Enfin, il faut retenir que tout cela ne concerne que le 8086 (et les x86 en général en mode réel). Les autres microprocesseurs fonctionnent selon des mécanismes similaires mais qui ont chacun leurs spécificités, et en suivant un jeu d'instructions propre.
Partager