; Exemple d'appel de Diviser: ; --------------------------- ; Algo: ; ----- ; ; Début ; Lire Dividende (entier) ; Lire Diviseur (entier) ; Diviser(Dividend,Diviseur,Reste,Quotient) ; Afficher Quotient (entier) ; Afficher Reste (entier) ; Fin ; ; Programme principal: ; -------------------- ; Début DECI Dividend,d ; Lire Dividende (entier) DECI Diviseur,d ; Lire Diviseur (entier) LOADA Dividend,d ; -- Paramètre #1 = Dividende STOREA d#-8,s ; LOADA Diviseur,d ; -- Paramètre #2 = Diviseur STOREA d#-6,s ; ADDSP d#-8,i ; JSR Divss ; Diviser(Dividend,Diviseur,Reste,Quotient) LOADA d#0,s ; STOREA Reste,d ; -- Récupérer Reste LOADA d#2,s ; STOREA Quotient,d ; -- Récupérer Quotient ADDSP d#4,i ; DECO Quotient,d ; Afficher Quotient (entier) DECO Reste,d ; Afficher Reste (entier) STOP ; Fin ; Espace réservé pour les variables: ; ---------------------------------- Dividend: .WORD h#0000 ; Dividende : entier Diviseur: .WORD h#0000 ; Diviseur : entier Quotient: .WORD h#0000 ; Quotient : entier Reste: .WORD h#0000 ; Reste : entier ; Sous-programmes: ; ---------------- ; ------- Divss ------- ; Division 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: quotient et ; reste). S'il y a division par zéro on retourne h#FFFF à la ; fois comme quotient et reste. ; La pile est nettoyée des deux nombres. Dquotie: .EQUATE d#18 ; Quotient Dreste: .EQUATE d#16 ; Reste Ddivise: .EQUATE d#14 ; Diviseur Ddivide: .EQUATE d#12 ; Dividende DAdRet: .EQUATE d#10 ; Adresse de retour DVieuxA: .EQUATE d#8 ; Sauvegarde registre A DVieuxX: .EQUATE d#6 ; Sauvegarde registre X Dtemp: .EQUATE d#4 ; Diviseur temporaire Dqtemp: .EQUATE d#2 ; Quotient temporaire Dinit: .EQUATE d#0 ; Indicateur départ ; PROCEDURE Divss(Ent1, Ent2: Integer; Ent3: OUT Integer) IS Divss: ADDSP d#-10,i ; STOREA DVieuxA,s ; sauvegarder registre STOREX DVieuxX,s ; sauvegarder registre LOADA d#0,i ; STOREA Dquotie,s ; résultat nul STOREA Dreste,s ; résultat nul Div1: LOADA Ddivise,s ; LOOP BREQ Div5 ; EXIT WHEN diviseur null STOREA d#-6,s ; empiler diviseur LOADA Ddivide,s ; STOREA d#-4,s ; empiler dividende ADDSP d#-6,i ; JSR Granss ; IF Diviseur > Dividende THEN LOADA d#0,s ; ADDSP d#2,i ; désempile Booléen COMPA d#0,i ; BREQ Div6 ; EXIT; LOADA Ddivise,s ; ELSE STOREA Dtemp,s ; LOADA d#0,i ; STOREA Dqtemp,s ; quotient temporaire := 0; STOREA Dinit,s ; première := true; Div2: LOADA Dtemp,s ; WHILE Diviseur > Dividende LOOP STOREA d#-6,s ; empiler diviseur LOADA Ddivide,s ; STOREA d#-4,s ; empiler dividende ADDSP d#-6,i ; JSR Granss ; IF Diviseur > Dividende THEN LOADA d#0,s ; ADDSP d#2,i ; désempile Booléen COMPA d#0,i ; EXIT; BREQ Div3 ; END IF; LOADX Dqtemp,s ; ASLX ; Décaler quotient temporaire STOREX Dqtemp,s ; LOADA Dinit,s ; BRNE Dsuite ; IF première THEN ADDX d#1,i ; quotient temporaire + 1 STOREX Dqtemp,s ; première := false; STOREX Dinit,s ; END IF; Dsuite: LOADA Dtemp,s ; IF bit15 = 1 THEN BRLT Div4 ; EXIT et ne pas défaire le décalage ASLA ; ELSE STOREA Dtemp,s ; décaler diviseur BR Div2 ; END LOOP; Div3: LOADA Dtemp,s ; ASRA ; annuler dernier décalage ANDA h#7FFF,i ; sans extension du signe STOREA Dtemp,s ; Div4: LOADA Ddivide,s ; SUBA Dtemp,s ; STOREA Ddivide,s ; dividende := dividende - diviseur temp ADDX Dquotie,s ; STOREX Dquotie,s ; ajouter quotient temporaire BR Div1 ; END LOOP; Div5: LOADA h#FFFF,i ; résultat de division par zéro FFFF FFFF STOREA Dreste,s ; STOREA Dquotie,s ; BR Div7 ; Div6: LOADA Ddivide,s ; ranger le reste STOREA Dreste,s ; Div7: LOADA DAdRet,s ; STOREA Ddivise,s ; LOADA DVieuxA,s ; restaure A LOADX DVieuxX,s ; restaure X ADDSP d#14,i ; nettoyer pile RTS ; END Divss; ; ------- Granss ; Comparaison de deux entiers sans tenir compte des signes ; Les entiers sont sur la pile. Le résultat est placé sur ; la pile et celle-ci est nettoyée des paramètres. ; Si Nb1 > Nb2 résultat = 1 sinon 0. Cresult: .EQUATE d#10 ; Booléen résultat Cent1: .EQUATE d#8 ; Nombre 1 Cent2: .EQUATE d#6 ; Nombre 2 CAdRet: .EQUATE d#4 ; Adresse de retour CVieuxA: .EQUATE d#2 ; Ancienne valeur de A CVieuxX: .EQUATE d#0 ; Ancienne valeur de X ; Granss: ADDSP d#-4,i ; espace local sauvegarde STOREA CVieuxA,s ; sauvegarde A STOREX CVieuxX,s ; sauvegarde X LOADA Cent1,s ; IF nombre 1 > 0 THEN BRLT Neg1 ; LOADX Cent2,s ; IF nombre 2 > 0 THEN BRLT Cgrand ; COMPA Cent2,s ; test normal BRLT Cpetit ; Cgrand: LOADA d#1,i ; plus grand BR Cretour ; Cpetit: LOADA d#0,i ; plus petit BR Cretour ; END IF; Neg1: LOADX Cent2,s ; ELSIF nombre 2 > 0 THEN BRGE Cpetit ; plus petit COMPX Cent1,s ; BRGE Cgrand ; BR Cpetit ; END IF; Cretour: STOREA Cresult,s ; LOADA CAdRet,s ; adresse retour STOREA Cent1,s ; déplacée LOADA CVieuxA,s ; restaure A LOADX CVieuxX,s ; restaure X ADDSP d#8,i ; nettoyer pile RTS ; END Granss .END