Division 36/18 = 36 Bit und Fehlerstatus
Division von 36/18 Bit ohne Vorzeichen
Operanden | high | low |
Dividend | r12 | r13 |
Divisor | r15 | |
Ergebniss | high | low |
Quotient | r12 | r13 |
Rest | r15 | |
Fehler bei != 0 | r14 |
; ; Dividieren von 36 Bit Werten durch 18 Bit Werte ohne Vorzeichen ; div3618: ; im Aufruf intern ; Dividend : R12 | R13 R4 | R5 (High | Low) ; Divisor : R15 R7 ; Quotient : R12 | R13 R4 | R5 ; Rest: R15 R7 ; Fehler: R14 R6 != 0 ; ; Anzahl der Zyklen laden movi r15, 18 ; nicht 18+1, da in divz0 immer +1 ; Übertrag Dividend löschen xor r8, r8 ; Quotient low löschen xor r10, r10 ; 1. Kopie von Dividend bilden MOV R12, R4 MOV R13, R5 xor r4, r4 ; Quotient High löschen ; Divisor solange links schieben, bis MSB eine 1 ist und ; mit jedem Schritt die Zyklenzahl erhöhen. movi r6, 1 ; Fehler für Division durch 0 beqz r7, err0 divz0: mov r5, r7 ; Kopie von r7 nach r5 slli r7, 1 addi r15, 1 ; Anzahl der Divzyklen + 1 beqzc divz0 ; MSB war noch 0 mov r7, r5 ; Wert mit MSB = 1 noch in R5 mov r5, r15 addi r5, -19 ; Anzahl der Zyklen, die der Rest zurück muss. ; 2. Differenz High Dividend und Divisor bilden divz: mov r9, r8 ; ist immer teilbar wenn Dividend Übertrag hatte bnez r8, ydiv SLTU R12, R7 ; teilbar ? Ja -> cc = 0 movi r9, 0 ; r9 = 1 wenn teilbar bnezc nodiv ; movi r9, 1 ; r9 = 1 wenn teilbar ydiv: SUBU R12, R7 ; Differenz bilden wenn teilbar nodiv: addi r15, -1 ; Zyklenzahl - 1 ; Ergebnis in den Quotient schieben slli r4, 1 slli r10, 1 movs2i r6, SFR_CC ; r6 = höchtes Bit des Quotient low addu r4, r6 ; in den Quotent high eintragern. addu r10, r9 ; Divisionsergebnis addieren beqz r15, divend ; Dividend low linksschieben slli r13, 1 movs2i r9, SFR_CC ; Übertrag merken ; Dividend high linksschieben slli r12, 1 movs2i r8, SFR_CC ; Übertrag merken addu r12, r9 ; Übertrag low einfügen ; j divz ; divend: xor r6, r6 ; ; Rest um die Anzahl in r5 nach rechts schieben ; rest_pos: beqz r5, err0 srli r12, 1 addi r5, -1 j rest_pos ; err0: mov r5, r10 ; Quotient mov r7, r12 ; Rest jrs r11 ;
Testprogramm: Ass-Quelle, Liste, Protokoll
SPHO-Format Start mit "G" im Monitor.
Include Datei für das Programm: spartan_equ.inc
UP d361836 als Macro
Include Dateien für das Macro: d361836um.incTestprogramm: Ass-Quelle, Liste, SPHO-Format Start mit "G" im Monitor.