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:
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
;les comparaisons : quel chiffre traite t'on?
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
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).

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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
      mov   dx,offset mcandew
      mov   ah,009h
      int      21h
Merci d'avance, Et à plustard !
Phil.