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

📄 math.lib

📁 一个C style Assembler的source code
💻 LIB
字号:
;;; ARITHMETIC: Integer arithmetic routines.ClearX:   ClearLoop:      mov @R0, #0      inc R0   djnz R2, ClearLoopretCopyX:   CopyLoop:      mov A, @R1      inc R1      mov @R0, A      inc R0   djnz R2, CopyLoopretCplX:   CplLoop:      mov A, @R0      cpl A      mov @R0, A      inc R0   djnz R2, CplLoopretRolX:   clr CShiftX:   ShiftLoop:      mov A, @R0      rlc A      mov @R0, A      inc R0    djnz R2, ShiftLoopretLessX:   clr C   LessLoop:      mov A, @R0      inc R0      subb A, @R1      inc R1   djnz R2, LessLoopretZeroX:   clr C   ZeroLoop:      mov A, @R0      jnz NotZero      inc R0   djnz R2, ZeroLoop   setb CNotZero:retIncX:   setb CCarryX:   CarryLoop:      mov A, @R0       addc A, #0      mov @R0, A      inc R0   djnz R2, CarryLoopretDecX:   setb CBorrowX:   BorrowLoop:      mov A, @R0       subb A, #0      mov @R0, A      inc R0   djnz R2, BorrowLoopretAddX:   clr C   AddLoop:      mov A, @R0      addc A, @R1      inc R1      mov @R0, A      inc R0   djnz R2, AddLoopretSubbX:   setb Csjmp SubtractLoopSubtractX:   clr C   SubtractLoop:      mov A, @R0      subb A, @R1      inc R1      mov @R0, A      inc R0   djnz R2, SubtractLoopretNegX:   setb CNegLoop:   mov A, @R0   cpl A   addc A, #0   mov @R0, A   inc R0djnz R2, NegLoopretInc10X:   Inc10Loop:      inc @R0      mov A, @R0   cjne A, #10, Inc10Break      mov @R0, #0      inc R0   djnz R2, Inc10Loop   Inc10Break:ret;;; Multiplication RoutinesSizeX equ 30h ;;; 1 byteSizeY equ 31h ;;; 1 byteArgX  equ 32h ;;; 1 byteArgY  equ 33h ;;; 1 byteArgZ  equ 34h ;;; 1 byteMultiplyX: ;;; The new multiplication algorithm R5 is the carry.   mov R5, #0MultiplyLoop:   mov R0, ArgX   mov A, @R0   mov R2, A   inc ArgX      ;;; R2 = *ArgX++;   mov R0, ArgZ   inc ArgZ      ;;; R0 = ArgZ++;   mov R1, ArgY   mov R3, SizeY   mov R4, #0   jz BreakCarry   MulNibble:      mov A, R2      mov B, @R1      inc R1      mul AB     ;;; B:A = *R1++ * R2;      add A, R4      xch A, B      addc A, #0      xch A, B   ;;; B:A += R4;      add A, @R0      mov @R0, A      inc R0      mov A, B      addc A, #0      mov R4, A  ;;; R4:*R0++ = B:A + *R0;   djnz R3, MulNibble   mov R3, SizeX   mov A, R4   CarryBy1:      add A, @R0      mov @R0, A      inc R0     ;;; C:*R0++ += *R0 + A;   jnc BreakCarry      mov A, #1   djnz R3, CarryBy1   inc R5BreakCarry:djnz SizeX, MultiplyLoopretMulByR1: ;;; R3:(@R0) = R1*(@R0);   mov R3, #0   MulLoop:      mov A, @R0      mov B, R1      mul AB      add A, R3      mov @R0, A      inc R0      mov A, B      addc A, #0      mov R3, A   djnz R2, MulLoopretOp      equ 35h ;;; 8 bytesDivisor equ 3dh ;;; 8 bytesQuo     equ 45h ;;; 8 bytesFract   equ 4dh ;;; 8 bytesRem     equ 55h ;;; 8 bytesDiv1:   clr C   mov R0, #Op   mov R2, SizeX   acall ShiftX          ;;; C:Op = Op*2;   mov R0, #Rem   mov R2, SizeX   acall ShiftX          ;;; Rem = Rem*2 + C;   mov R0, #Rem   mov R1, #Divisor   mov R2, SizeX   acall LessX   jc Quot               ;;; if (Rem >= Divisor) {      mov R0, #Rem      mov R1, #Divisor      mov R2, SizeX      acall SubtractX    ;;;    Rem -= Divisor;   Quot:                 ;;; }   cpl C                 ;;; C = !C;retDivideX:   mov R0, #Rem   mov R2, SizeX   acall ClearX          ;;; Rem = 0;   mov R0, #Quo   mov R2, SizeX   acall ClearX          ;;; Quo = 0;   mov A, SizeX   rl A   rl A   rl A   mov R3, A   DivLoop:              ;;; for (R3 = 8*SizeX; R3 > 0; R3--) {      acall Div1            ;;; Rem:Op <<= 1; C = Rem/Divisor; Rem %= Divisor;      mov R0, #Quo      mov R2, SizeX      acall ShiftX          ;;; Quo = Quo << 1 | C;   djnz R3, DivLoop      ;;; }   mov R0, #Fract   mov R2, SizeX   acall ClearX          ;;; Fract = 0;   mov A, SizeX   rl A   rl A   rl A   mov R3, A   FractLoop:            ;;; for (R3 = 8*SizeX; R3 > 0; R3--) {      acall Div1            ;;; Rem:Op <<= 1; C = Rem/Divisor; Rem %= Divisor;      mov R0, #Fract      mov R2, SizeX      acall ShiftX          ;;; Fract = Fract << 1 | C;   djnz R3, FractLoop    ;;; }ret;;; Square root of 64-bit word W returned in 32-bit word Q.Q equ 35h ;;; 8 bytesD equ 3dh ;;; 8 bytesX equ 45h ;;; 8 bytesW equ 4dh ;;; 8 bytesY bit F0 ;;; 1 bitSqrt64:   mov R0, #Q   mov R2, #4   acall ClearX      ;;; Q = 0;   mov R0, #D   mov R2, #8   acall ClearX      ;;; D = 0;   mov R0, #X   mov R2, #8   acall ClearX      ;;; X = 0;   mov R3, #32       ;;; for (I = 0; I < 32; I++) {   SqrtLoop:      mov R0, #W      mov R2, #8      acall RolX      mov R0, #D      mov R2, #8      acall ShiftX      mov R0, #W      mov R2, #8      acall RolX      mov R0, #D      mov R2, #8      acall ShiftX   ;;;    D <<= 2, D += (W&0xc0000000) >> 30, W <<= 2;      mov R0, #X      mov R1, #D      mov R2, #8      acall LessX      mov Y, C       ;;;    Y = (X < D);      mov R0, #Q      mov R2, #4      acall ShiftX   ;;;    Q <<= 1; Q |= Y;      jnb Y, YY0     ;;;    if (Y) {         mov R0, #D         mov R1, #X         mov R2, #8         acall SubbX ;;;       D -= (X + 1);      YY0:           ;;;    }      mov R0, #X      mov R2, #8      acall RolX     ;;;    X <<= 1;      jnb Y, YY1     ;;;    if (Y) {         orl X, #4   ;;;       X |= 0x04;      YY1:           ;;;    }   djnz R3, SqrtLoop ;;; }ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -