📄 div.s
字号:
movl a0@(-4),sp@- | auf Stack merken movl #4,d4 | fuer Pointer = Anzahl der mulul d0,d4 | Ziffern * 4 addl d4,a0 | a0->fuehrende Zi div-Feld movl #0,a0@+ | vor fuehrende Zi div-Feld wird | eine 0 eingetragen, a0->davor! movl sp@(0),d0 | d0=Anzahl Divisionsschritte | = L(Dt) - L(Dr), evtl. +1 lea quotient,a3 | a3->Laengenfeld quot-Feld movl #4,d4 | d4 fuer Pointerausrichtung mulul d0,d4 addl d4,a3 addl #4,a3 | a3->vor fuehrende Zi quot-Feld subql #1,d0 | d0 Schleifenzaehler, Schlei- | fenende bei -1mainloop: movl a0@-,d7 | d7=fuehrende Zi div-Feld movl a0,a2 | a2->fuehrende Zi div-Feld movl d1,d2 | d2 = Laenge Quotient * 4 mulul #4,d2 | (wg. 4 Byte,Ziffer) subl d2,a2 | a2->niedrigste Zi div-Feld, | die bei mult und subtr ange- | sprochen wird cmpl d7,d5 | hoechste Zi div-Feld = v1 ? bne dodivide | nein => q^ durch Division er- | mitteln movl #-1,d3 | ja => d3=q^=b-1=2**32-1=1...1 bra dotest | q^ testendodivide: movl a0@(-4),d6 | d6d7 = u1u0 divuq d5,d7:d6 | u0u1 : v1, d6=Quotient,d7=Rest movl d6,d3 | d3 = q^dotest: lea testfeld,a4 | a4->testfeld movl sp@(4),d4 | d4d5 = v2v1 mulul d3,d2:d4 | d4d2 = q^*v2, d2 hoeherwertig movl d4,a4@(0) | niederwertiges Testergebnis movl d2,a4@(4) | ablegen, hoeherwertiges merken mulul d3,d2:d5 | d5d2 = q^*v1, d2 hoeherwertig addl d5,a4@(4) | auf 2. Testfeld addieren bcc nocarry1 | Uebertrag ? nein => weiter addql #1,d2 | ja => addiere 1 auf hoeherw.nocarry1: cmpl a0@(0),d2 | vergleiche hoechstwertiges | Testergebnis mit u0 bcs okay | u0 groesser: okay bhi docorrect | u0 kleiner: q^ korrigieren movl a4@(4),d2 cmpl a0@(-4),d2 | gleich: weiter vergleichen bcs okay bhi docorrect movl a4@(0),d2 cmpl a0@(-8),d2 | beim letzten Vergleich okay bls okay | bei a0@(-8)>=d2 !|| q^ ist um eins zu gross: korrigieren|docorrect:subql #1,d3|| Jetzt ist q^ okay, die Division kann beginnen, d.h. q^ * v wird| von den entsprechenden u-Stellen abgezogen|okay: eorl d5,d5 | Uebertragsregister loeschen movl d1,d2 | d2 Schleifenzaehler, Schlei- subql #1,d2 | fenende bei -1loopsub: movl a1@+,d6 | d6=niederwertigste Zi Divisor mulul d3,d7:d6 | vn*q^=d6d7,d7 hoeherwert. Teil addl d5,d6 | addiere Uebertrag bcc nocarry2 | Carry ? nein=> weiter addql #1,d7 | ja => add. 1 auf hoeherw. Teilnocarry2: subl d6,a2@+ | subtrahieren von niederwert. | Zi vom div-Feld bcc nocarry3 | Borrow ? nein => weiter addql #1,d7 | ja => beim naechsten Schritt | eins mehr abziehennocarry3: movl d7,d5 | Uebertrag merken dbra d2,loopsub | Quot.fertig? Nein => Schleife subl d5,a2@(0) | ja => subtrahiere letztes | Multiplikationsergebnis bcc noreadd | Borrow ? nein => weiter|| q^ * v > u , daher muss 1*v wieder auf u aufaddiert und q^ um| eins vermindert werden | subql #1,d3 | q^ = q^ - 1 movl #4,d4 | d4 wird wieder Offset mulul d1,d4 subl d4,a2 | a2->niedrigste Zi von u zum subl d4,a1 | Addieren, a1->niedr.Zi von v movl d1,d2 | d2 Schleifenzaehler, Schlei- subql #1,d2 | fenende bei -1 andb #0xce,cc | CCR zuruecksetzenloopreadd:movl a1@+,d5 | d5 = aktuelle Zi Quotient movl a2@(0),d6 | d6 = aktuelle Zi Div-Feld addxl d5,d6 | addiere auf div-Feld mit Carry movl d6,a2@+ | Summe in div-Feld eintragen dbra d2,loopreadd | Quot. fertig? nein=>Schleife movl #0,a2@+ | jetzt ist die hoechstwertige | Zi vom div-Feld = 0|| Die Division ist beendet. a1->vor fuehrende Zi Divisor| a2->vor fuehrende Zi div-Feld|noreadd: movl d3,a3@- | Quotient eintragen, a3-> | naechstgroesste Ziffer movl #4,d4 | fuer Pointer-Zuruecksetzung mulul d1,d4 subl d4,a1 | a1->1. Zi Divisor movl sp@(8),d5 | d5=fuehrende Zi Divisor = v1 dbra d0,mainloop | Div. fertig? nein => Schleife|| Laenge von Quotient und Rest (=div-Feld) bestimmen| movl sp@(0),d0 | d0=Anzahl Div.Schritte cmpl #0,a3@(-4,d0:l*4) | fuehrende Quot.Ziffer = 0 ? bne nocorr2 | nein => L(Quot)=L(Div)-L(Divi- | sor) = Anzahl Div.Schritte subql #1,d0 | ja => L(Quot) eins groessernocorr2: movl d0,a3@(-4) | Laenge Quotient eintragen lea divident,a2 | a2->Laengenfeld Rest | Die Laenge vom Rest kann hoechst gleich der Laenge vom Divisor| sein.|loopchklngth: cmpl #0,a2@(0,d1:l*4) | Ist diese = 0? bne found | nein => Laenge klar subql #1,d1 | nein => L. mind. 1 kuerzer bra loopchklngth | weiter suchenfound: movl d1,a2@(0) | Laenge Rest eintragen|| Erweiterung vom Rest (frueher div-Feld) und Quotient rueckgaengig| machen| movl sp@(12),d4 | d4 = Erweiterungsfaktor cmpl #0,d4 | wurde ueberhaupt erweitert ? beq noreshift | nein => weiter negl d4 | andersrum shiften subql #4,a1 | a1->L-Feld Divisor | a2->L-Feld Rest movl a1,sp@- | Adresse Divisor und Shift- movl d4,sp@- | faktor auf Stack schreiben movl a1,sp@- jsr __shift | Shiftprogramm aufrufen movl a2,sp@(0) | dasselbe fuer Rest movl a2,sp@(8) jsr __shift addl #12,sp | Stackpointer zurueckschaltennoreshift:addl #16,sp | Shiftfaktor etc. wird nicht | mehr gebraucht|| Ergebnisse uebertragen: Quotient kommt zuerst dran und wird dabei | evtl. ueberschrieben| subql #4,a3 | a3->L-Feld Quotient movl a3@(0),d2 | d2 Schleifenzaehler, Schlei- movl sp@(68),a4 | a4->L-Feld Quotientloopquot: movl a3@+,a4@+ | uebertragen dbra d2,loopquot | fertig ? nein => Schleife movl a2@(0),d2 | d2 wieder Schleifenzaehler movl sp@(72),a4 | a4->L-Feld Restlooprest: movl a2@+,a4@+ | uebertragen dbra d2,looprest | fertig ? nein => Schleife eorl d0,d0 | alles fertig, RC = 0 return: moveml sp@+,a0,a1,a2,a3,a4,a5,a6,d1,d2,d3,d4,d5,d6,d7 rts .datafehler: .ascii "Division durch Null" .evennull: .long 0,0,0,0,0,0,0,0,0,0,0,0,0 | 13 Langworte 0 zum Loeschen .bss .evendivident: .=.+164 .eventestfeld: .=.+160 .evenquotient: .=.+80 | Quotientfeld-Laenge: 4*Feldlaenge
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -