; *********************************************************************** ; Programme: DIV-1.TXT version PEP813 sous WINDOWS ; ; Programme qui effectue la division d'un dividende par un ; diviseur pour donner le quotient et le reste. ; Il utilise un sous-programme avec passage des paramètres par les ; registres. ; ; Bien qu'impossible, la divison par zéro est tolérée et donne 0. ; ; Les nombres négatifs retournent 0 comme quotient et comme reste. ; ; auteur: Bernard Martin ; code permanent: non applicable ; courriel: martin.bernard@uqam.ca ; date: hiver 2020 ; cours: INF2171 ; *********************************************************************** ; DIVISI1: DECI dividend,d ; lecture du dividende LDA dividend,d DECI diviseur,d ; lecture du diviseur LDX diviseur,d CALL DIVISE ; appel à la routine de division STX quotient,d DECO quotient,d CHARO ' ',i STA reste,d DECO reste,d STOP dividend:.BLOCK 2 ; #2d diviseur:.BLOCK 2 ; #2d quotient:.BLOCK 2 ; #2d reste: .BLOCK 2 ; #2d ; ; divise: calcule le quotient et le reste d'une division ; par soustractions répétitives ; Passage des arguments et résultats par registres ; ; IN: A=dividende ; X=diviseur ; OUT: A=reste ; X=quotient ; diviseu: .EQUATE 0 ; #2d ; DIVISE: SUBSP 2,i ; empilons le diviseur #diviseu STX diviseu,s LDX diviseu,s ; BREQ retdiv ; division par 0 tolérée BRLT zérocalc ; diviseur négatif retourne 0 comme quotient et comme reste CPA 0,i BRLE zérocalc ; dividende négatif retourne 0 comme quotient et comme reste LDX 0,i ; initialisation du quotient soustrai:ADDX 1,i SUBA diviseu,s BRGE soustrai ; soustraction répétitive ; ; à ce stade, nous avons soustrait une fois de trop SUBX 1,i ; redéfaisons la dernière soustraction ADDA diviseu,s BR retdiv ; zérocalc:LDA 0,i ; reste = 0 LDX 0,i ; quotient = 0 retdiv: RET2 ; désempilons le diviseur #diviseu .END