Bonjour,
Je suis nouveau sur le forum, donc, une petite présentation s'impose:
Je m'appelle Philip et je fais des études en informatique de gestion à Liège. On a eu un cours d'architecture des ordinateurs en première et maintenant on a un cours d'assembleur (en deuxième).
On doit faire un programme de multiplication sans utiliser l'instruction MUL. On doit utiliser les interruptions pour encoder et afficher.
Le programme qui multiplie (16bits * 16 bits et résultat en 32 bits) était assé simple (j'ai galéré pas mal quand même :p). Je suis en train d'essayer de transformer ce que j'ai encodé au clavier mais![]()
![]()
...
![]()
Je pense que je n'utilise pas la bonne syntaxe car l'algorithme est assé simple, et je l'ai refais deux fois (mais ça ne veut pas dire que l'algorithme fonctionne bien sur hein)
Je vais mettre un bout de code.
Le multiplicande peut être au maximum = 65535 (max 16 bits = FFFFh = 65535d), ça fait 5 chiffres à encoder (au maximum). Je compare le nombre de caractères effectivement lus ([mcande+1] : cf. interruption "Int 21h, Fct 0Ah") à 1, 2, 3, 4 et 5 pour savoir cmb on en a lu. Le code ci dessous est le code pour le cas où on entre 2 chiffres.
je n'ai pas mis le code complet, c'est donc encore un peu algorithmique![]()
variables:
mcande db 8 dup(?) (8 parceque l'interruption "Int 21h, Fct 0Ah" utilise le premier octet pour le nombre max de caractère qu'on peut entrer (j'ai mis 6 (5+carriage return)), le deuxième pour le nombre de caractère lu. Donc, 2 + 5 + 1 = 8 )
mcandew dw 2 dup(?),'$'
Debut du programme
;encodage du multiplicande dans mcande
;comparaison de [mcande+1] (nbr de caractère lu) avec 1, 2, 3, 4 et 5 pour savoir cmb de chiffres composent le nombre.
;NB: j'affiche un msg à ce moment ci, et donc je suis sur que j'arrive à cette partie du programme quand j'entre deux chiffres
;si composé de DEUX chiffres:
;les comparaisons : quel chiffre traite t'on?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 mov si, 2 debut: mov bl, mcande[si] ;soustraction pour avoir le nombre en décimal sub bl, 30h
avec ce code, j'espérais avoir le multiplicande transformé en hexadécimal dans mcandew et pouvoir l'afficher grâce au caractère de fin de ligne que j'ai mis à la suite de cette variable. Mais quand j'affiche, j'obtiens des "crasses" (des caractères divers).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 cmp si, 2 jz muldix cmp si, 3 jz fintrait muldix: mov cx, 10 ;on définit le multiplicateur dans cx call fctMul ;multiplication (bx = multiplicande, cx = multiplicateur) add mcandew, bx ;partie basse du résultat adc mcandew+2, ax ;partie haute du résultat inc si ;on incrémente pour traîterl'element suivant jmp debut ;et on va le traîter fintrait: add mcandew, bx ;add du chiffre des unités
En fait, pour l'algorithme, je vais chercher encore. C'est surtout pour savoir si je ne me trompe pas dans la syntaxe que je montre le code.
La fonction de multiplication rend le résultat dans ax-bx (la partie haute dans ax et la partie basse dans bx donc). Je l'ai testée avec un simulateur et ça marche super (ça m'impressionne même).
Pour l'affichage, l'interruption de sortie d'une chaine :
Merci d'avance, Et à plustard !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 mov dx,offset mcandew mov ah,009h int 21h
Phil.
Partager