⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 div.s

📁 SecuDe是一个由安全应用程序接口组成,对验证机制、证件处理、PEM、X.400报文处理和密钥管理提供支持。SecuDe提供DES、 RSA杂凑函数、密钥生成以及数字签名的生成和核实等多种密码机制。
💻 S
📖 第 1 页 / 共 2 页
字号:
          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 + -