; Exemple d'appel de multiplier: ; ------------------------------ ; Programme principal: ; -------------------- ; Début LOADA Nb1,d ; -- Paramètre #1: Nb1 = 24 (base 10) STOREA d#-6,s ; LOADA Nb2,d ; -- Paramètre #2: Nb2 = 43 (base 10) STOREA d#-8,s ; ADDSP d#-8,i ; JSR Mulss ; Mulss(Nb1,Nb2,(Prod1,Prod2)) LOADA d#2,s ; STOREA Prod2,d ; -- Récupérer Prod2 = 1032 (base 10) ADDSP d#4,i ; DECO Prod2,d ; Affiche Prod2 = 1032 (base 10) STOP ; Fin ; Espace résevé pour les variables: ; --------------------------------- Nb1: .WORD d#24 ; Multiplicande : entier Nb2: .WORD d#43 ; Multiplicateur : entier Prod2: .WORD h#0000 ; Partie la moins significative du produit ; ------- Mulss ------- ; Multiplication sans signe de deux nombres entiers de 16 bits ; dont les valeurs se trouvent sur la pile (1 mot chacun); ; rangement du résultat sur la pile (2 mots). La pile est ; nettoyée des deux nombres. Mres2: .EQUATE d#14 ; Fin résultat Mres1: .EQUATE d#12 ; Début résultat Mnb1: .EQUATE d#10 ; Nombre 1 Mnb2: .EQUATE d#8 ; Nombre 2 MAdRet: .EQUATE d#6 ; Adresse de retour MVieuxA: .EQUATE d#4 ; Sauvegarde registre A MVieuxX: .EQUATE d#2 ; Sauvegarde registre X Mtemp: .EQUATE d#0 ; Temporaire ; PROCEDURE Mulss(Ent1, Ent2: Integer; Ent3: OUT Integer) IS Mulss: ADDSP d#-6,i ; STOREA MVieuxA,s ; sauvegarder registre STOREX MVieuxX,s ; sauvegarder registre LOADA d#0,i ; STOREA Mres1,s ; résultat nul STOREA Mres2,s ; résultat nul STOREA Mtemp,s ; nul pour décalage A Muldeca: LOADA Mnb2,s ; LOOP ASRA ; décaler multiplicateur ANDA h#7FFF,i ; sans extension du signe STOREA Mnb2,s ; BRC Mtrans ; IF bit 1 sorti THEN BR Muldec2 ; Mtrans: LOADA Mres2,s ; ajouter A décalé ADDA Mnb1,s ; au produit 2 STOREA Mres2,s ; BRC Majout2 ; sans oublier les retenues Mcont1: LOADA Mres1,s ; ajouter début A décalé ADDA Mtemp,s ; au produit 1 STOREA Mres1,s ; BR Muldec2 ; END IF; Majout2: LOADA Mres1,s ; ADDA d#1,i ; {ajoute bit 1 retenue} STOREA Mres1,s ; {au résultat} BR Mcont1 ; Majout3: LOADA Mtemp,s ; ADDA d#1,i ; {ajoute bit 1 retenue} STOREA Mtemp,s ; {au début de A} BR Mcont3 ; Muldec2: LOADA Mtemp,s ; décaler début A ASLA ; pour prochaine itération STOREA Mtemp,s ; LOADA Mnb1,s ; décaler A ASLA ; STOREA Mnb1,s ; BRC Majout3 ; passer retenue à première partie Mcont3: LOADA Mnb2,s ; EXIT WHEN B = 0; BRNE Muldeca ; END LOOP; LOADA MAdRet,s ; STOREA Mnb1,s ; LOADA MVieuxA,s ; restaure A LOADX MVieuxX,s ; restaure X ADDSP d#10,i ; nettoyer pile RTS ; END Mulss; .END