;------------------------------------------------------------------------------ ; Speicherdeklaration ;------------------------------------------------------------------------------ did0 equ 0x30 ;Dividend LSB did1 equ 0x31 did2 equ 0x32 did3 equ 0x33 ;Dividend MSB dis0 equ 0x34 ;Divisor LSB dis1 equ 0x35 ;Divisor MSB res0 equ 0x36 ;Quotient LSB res1 equ 0x37 ;Quotient MSB zr0 equ 0x38 ;Zwischenresultat LSB zr1 equ 0x39 zr2 equ 0x3A zr3 equ 0x3B ;Zwischenresultat MSB ;****************************************************************************** ; Division vorbereiten ;****************************************************************************** mov dis0,#25 mov dis1,#00 ;Divisor = 25 mov did0,#0x00 mov did1,#0xCA mov did2,#0x9A mov did3,#0x3B ;Dividend = 10^9 call _div ;Division ausführen ;****************************************************************************** ; Divisions Routinen ;****************************************************************************** ;------------------------------------------------------------------------------ ; 32-Bit ;------------------------------------------------------------------------------ _div: ;Start mov loop,#15 ;Anzahl Durchläufe mov res0,#0 ; mov res1,#0 ;Lösche Endresultat dv1: call _shft ;Schiebe Divisor um Anz. Durchläufe -> Zwischenresultat push did0 push did1 push did2 push did3 ;Rette Dividend call _sub jc resd pop zr0 ;Stack leeren pop zr0 pop zr0 pop zr0 call _add ;Errechne Endresultat jmp dv2 resd: pop did3 pop did2 pop did1 pop did0 dv2: mov a,loop clr c subb a,#1 mov loop,a jnc dv1 ;Springe zu dv1 wenn loop > 0 ret ;Verlasse Unterprogramm ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; Unterprogramm zum Schieben des Divisor mit der Anz. Durchläufe ;------------------------------------------------------------------------------ _shft:mov zr0,dis0 ; mov zr1,dis1 ; mov zr2,#0 ; mov zr3,#0 ; mov a,loop ; jz sh2 ;Verlasse Prog wenn loop = 0 push loop ;Rette Anz. Durchläufe sh1: clr c ;Lösche Carry (nur 0 in LSB schieben) mov a,zr0 ; rlc a ; mov zr0,a ; mov a,zr1 ; rlc a ; mov zr1,a ; mov a,zr2 ; rlc a ; mov zr2,a ; mov a,zr3 ; rlc a ; mov zr3,a ;Schiebe Divisor um 1 Stelle nach rechts djnz loop,sh1 ;Springe zu sh1 wenn loop > 0 pop loop sh2: ret ;Verlasse Unterprogramm ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; Unterprogramm zum Rechnen von Dividend - Zwischenresultat ;------------------------------------------------------------------------------ _sub: mov a,did0 ; subb a,zr0 ; mov did0,a ;Subtrahiere Zwischenresultat von Dividend mov a,did1 ; subb a,zr1 ; mov did1,a ;Subtrahiere Zwischenresultat von Dividend mov a,did2 ; subb a,zr2 ; mov did2,a ;Subtrahiere Zwischenresultat von Dividend mov a,did3 ; subb a,zr3 ; mov did3,a ;Subtrahiere Zwischenresultat von Dividend ret ;Verlasse Unterprogramm ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; Unterprogramm zum Rechnen von Endresultat ;------------------------------------------------------------------------------ _add: mov zr0,#1 ; mov zr1,#0 ; mov zr2,#0 ; mov zr3,#0 ;Lösche Zwischenresultate mov a,loop ; jz ad2 ;Springe zu ad2 wenn loop = 0 push loop ;Rette Anz. Durchläufe ad1: clr c ;Lösche Carry (nur 0 in LSB schieben) mov a,zr0 ; rlc a ; mov zr0,a ; mov a,zr1 ; rlc a ; mov zr1,a ; djnz loop,ad1 ;Springe zu ad1 wenn loop > 0 pop loop ad2: mov a,res0 ; add a,zr0 ;Addiere ohne Carry mov res0,a ;Addiere Zwischenresultat zu Resultat mov a,res1 ; add a,zr1 ; mov res1,a ;Addiere Zwischenresultat zu Resultat ret ;Verlasse Unterprogramm ;------------------------------------------------------------------------------