Tp d'assembleur (avec emu8086)

Fermé
Alundra - 5 juin 2008 à 19:30
 hafida - 27 mars 2009 à 22:22
Bonjour,

J'ai un exercice d'assembleur a faire mais je suis vraiment nul dans ce langage...
Voici l'énoncé :

Ecrire un programme assembleur qui realise la somme de deux matrices A et B de taille N entrées par l'utilisateur et sauvegarde le resultat dans une matrice C qui est affichée a l'utilisateur.

Est-ce que quelqu'un aurait quelques pistes pour m'aider a realiser ce programme ?

Merci d'avance :)

5 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
5 juin 2008 à 22:13
Alors d'abord comment on représente une matrice à une dimension.
En voici une:
[0, 1, 2, 5]

Sous 8086 les entiers sont codés sur 16 bits puisque les registres ont cette taille.
Chacun de ces nombres sera codé sur deux octets donc. Si le premier élément est à l'adresse 0, alors le second est à l'adresse 0 + 2 (car 16 bits ça fait deux octets). Le troisième élément est à 0 + 4 etc...

adresse i + 6 |  5  |
adresse i + 4 |  2  |
adresse i + 2 |  1  |
adresse i     |  0  |

Donc mettons que l'adresse de la matrice (donc l'adresse du premier élément soit dans bx), si tu veux mettre la valeur du deuxième élément dans ax, tu fais comme ça:
mov ax, [bx + 2]

En gros là règle c'est: pour accéder à l'élément i, je prends son adresse de base et j'y ajoute i * 2, sachant que l'indice de la matrice i commence à 0 dans cet exemple:
adresse_element[i] = adresse_base + (i * 2)

Maintenant prenont une matrice à 3 dimensions:
[0, 1]
[2, 3]
[4, 5]

Impossible de représenter ça réellement en mémoire, puisqu'elle se présente comme une longue ligne de case à un seul étage.
Alors du coup on transforme notre matrice 3 dimensions en une matrice 1 dimension. Comment me diras-tu? Eh bien on fait comme si les lignes qui suivent la première étaient mises à sa suite.
Tout bonnement ça donne ça:
[0, 1, 2, 3, 4, 5]

Donc si l'indice de la ligne est i, que l'indice de la colonne est j, et que ces indices commencent à 0, et que le nombre d'éléments dans une ligne est de N, alors l'adresse d'un élement de ta matrice est:
adresse_element[i][j] = adresse_base + (i * N * 2) + (j * 2)

Valà!
2
Hum...ok je comprend le principe...

Bon je sais pas encore comment je vais coder (je sais je suis assez désespérante lol) mais c'est deja un peu plus clair...

Par contre, comment on fais pour demander que l'utilisateur entre les valeurs des tableaux ? (faut bien le faire, non ?)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > Alundra
5 juin 2008 à 22:28
Ben par contre faut voir ça avec emu8086, j'ai jamais manipulé. Ca doit utiliser des interruptions clavier spécifiques...

Sinon ya toujours moyen de déclarer des constantes, deux longs tableaux...
0
Alundra > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
5 juin 2008 à 22:31
Ok...je vais chercher un peu mais bon vu le peu de temps qu'il me reste je crois que c foutu pour cet exo.

Enfin bon tant pis, l'assembleur c pas mon truc

Merci beaucoup a toi au moins j'aurais compris quelque chose :)
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > Alundra
5 juin 2008 à 22:44
;-)
0