;-----------------------------------------------------------------------------: ; 32bit/32bit Unsigned Division ; ; Register Variables ; Call: var1[3:0] = dividend (0x00000000..0xffffffff) Dividend ; var2[3:0] = divisor (0x00000001..0x7fffffff) Divisor ; mod[3:0] = wird am anfang genullt; später dann der Rest der Division ; lc = (high register must be allocated) (1) Es muss ein Wert zugewiesen werden, aber wozu? ; ; Result:var1[3:0] = var1[3:0] / var2[3:0] Dividend ; var2[3:0] = Divisor ; mod[3:0] = var1[3:0] % var2[3:0] Rest der Division (was nicht mehr geteilt werden kann) ; lc = 0 lc = loopcounter? ; ; Size = 26 words ; Clock = 549..677 cycles (+ret) ; Stack = 0 bytes div32u: clr mod0 ;initialize variables Rest der Division wird genullt clr mod1 ; mod = 0; clr mod2 ; lc = 32; clr mod3 ; ldi lc,32 ;/ (2) Wozu musste ich jetzt bei (1) lc einen Wert zuweißen? ;---- calcurating loop lsl var10 ;var1 = var1 << 1; lsl = Logical Shift Left -> also ohne carry, verschub nach links rol var11 ; rol = Rotate left through carry -> das selbe mit carry rol var12 ; rol var13 ;/ rol mod0 ;mod = mod << 1 + carry; in meinen Rest wird eine 1 geladen, sofern carry gesetzt ist rol mod1 ; rol mod2 ; rol mod3 ;/ cp mod0,var20 ;if (mod => var2) { Rest wird mit Dividenden verglichen cpc mod1,var21 ; mod -= var2; var1++; cpc mod2,var22 ; } cpc mod3,var23 ; (3) Wenn durch die Vergleiche carry gesetzt worden ist, springe? zu PC+6 brcs PC+6 ; kann auch verwendet werden um auf pc 6 zu addieren? , was ist aber pc? inc var10 ; sub mod0,var20 ; Var20 wird von mod0 abgezogen und dort auch gespeichert sbc mod1,var21 ; und wieder mit carry sbc mod2,var22 ; sbc mod3,var23 ;/ dec lc ;if (--lc > 0) lc wird um 1 subtrahiert -> lc = loopcounter? brne PC-19 ; continue loop; (4) was wird vergleicht? ret geht aus der unterschleife wieder raus, laut meinem pdf, aber wohin? zu div32u:?