0,0 → 1,332 |
// akPi v2.2 |
// Copyright (c) 1997-98 Anatoli Klassen |
|
unit LongIntegerUnit; |
|
interface |
|
const |
MaxLongDigit = 100040 div 4; |
NumDWord : longint = MaxLongDigit div 4; |
|
type |
PLongInteger = ^LongInteger; |
LongInteger = array[1..MaxLongDigit] of Cardinal; |
|
procedure MovLong(var A, B : LongInteger); { B := A } |
procedure LetLong(var A : LongInteger; B : longint); { A := B } |
procedure AddLong(var A, B : LongInteger); { A := A + B } |
procedure SubLong(var A, B : LongInteger); { A := A - B } |
procedure MulLong(var A : LongInteger; B : longint); { A := A * B } |
procedure DivLong(var A : LongInteger; B : longint); { A := A div B } |
|
procedure MovLongLim(var A, B : LongInteger; Lim : longint); { B := A } |
procedure AddLongLim(var A, B : LongInteger; Lim : longint); { A := A + B } |
procedure SubLongLim(var A, B : LongInteger; Lim : longint); { A := A - B } |
procedure MulLongLim(var A : LongInteger; B, Lim : longint); { A := A * B } |
procedure DivLongLim(var A : LongInteger; B, Lim : longint); { A := A div B } |
|
procedure MulLongLenLim(var A : LongInteger; B, Lim : longint); { A := A * B } |
|
// (Lim - in bytes) |
|
implementation |
|
procedure MovLong(var A, B : LongInteger); { B := A } |
asm |
PUSHAD |
PUSHF |
|
MOV ESI,A |
MOV EDI,B |
|
MOV ECX,NumDWord |
CLD |
REP MOVSD |
|
POPF |
POPAD |
end; |
|
procedure LetLong(var A : LongInteger; B : longint); { A := B } |
asm |
PUSHAD |
PUSHF |
MOV EDI,A |
|
CLD |
MOV ECX,NumDWord |
DEC ECX |
MOV EAX,0 |
REP STOSD |
|
MOV EAX,B |
MOV [EDI],EAX |
|
POPF |
POPAD |
end; |
|
procedure AddLong(var A, B : LongInteger); { A := A + B } |
asm |
PUSHAD |
PUSHF |
MOV ESI,A |
MOV EDI,B |
|
MOV ECX,NumDWord |
MOV EBX,0 |
CLC |
|
@ADDL: |
MOV EAX,[EDI+EBX*4] |
ADC [ESI+EBX*4],EAX |
INC EBX |
DEC ECX |
JNZ @ADDL |
|
POPF |
POPAD |
end; |
|
procedure SubLong(var A, B : LongInteger); { A := A - B } |
asm |
PUSHAD |
PUSHF |
MOV ESI,A |
MOV EDI,B |
|
MOV ECX,NumDWord |
MOV EBX,0 |
CLC |
|
@SUBL: |
MOV EAX,[EDI+EBX*4] |
SBB [ESI+EBX*4],EAX |
INC EBX |
DEC ECX |
JNZ @SUBL |
|
POPF |
POPAD |
end; |
|
procedure MulLong(var A : LongInteger; B : longint); { A := A * B } |
asm |
PUSHAD |
PUSHF |
MOV EDI,A |
|
MOV ECX,NumDWord |
MOV EBX,B |
MOV EBP,0 |
CLD |
|
@MULL: |
MOV EAX,[EDI] |
MUL EBX |
ADD EAX,EBP |
MOV EBP,EDX |
STOSD |
DEC ECX |
JNZ @MULL |
|
POPF |
POPAD |
end; |
|
procedure DivLong(var A : LongInteger; B : longint); { A := A div B } |
asm |
PUSHAD |
PUSHF |
MOV EDI,A |
MOV EBX,B |
|
MOV ECX,NumDWord { EDX := A + NumDWord * 4 - 4 } |
MOV EDX,ECX |
SHL EDX,2 |
SUB EDX,4 |
ADD EDI,EDX |
|
MOV EDX,0 |
STD |
|
@DIVL: |
MOV EAX,[EDI] |
DIV EBX |
STOSD |
DEC ECX |
JNZ @DIVL |
CLD |
|
POPF |
POPAD |
end; |
|
//=========================================================================== |
|
procedure MovLongLim; { B := A } |
asm |
PUSHAD |
PUSHF |
|
MOV ESI,A |
MOV EDI,B |
MOV EAX,Lim |
SHR EAX,2 |
|
MOV ECX,NumDWord |
SUB ECX,EAX |
CLD |
REP MOVSD |
|
POPF |
POPAD |
end; |
|
procedure AddLongLim; { A := A + B } |
asm |
PUSHAD |
PUSHF |
MOV ESI,A |
MOV EDI,B |
MOV EAX,Lim |
SHR EAX,2 |
|
MOV ECX,NumDWord |
SUB ECX,EAX |
MOV EBX,0 |
CLC |
|
@ADDL: |
MOV EAX,[EDI+EBX*4] |
ADC [ESI+EBX*4],EAX |
INC EBX |
DEC ECX |
JNZ @ADDL |
JC @ADDL |
|
POPF |
POPAD |
end; |
|
procedure SubLongLim; { A := A - B } |
asm |
PUSHAD |
PUSHF |
MOV ESI,A |
MOV EDI,B |
MOV EAX,Lim |
SHR EAX,2 |
|
MOV ECX,NumDWord |
SUB ECX,EAX |
MOV EBX,0 |
CLC |
|
@SUBL: |
MOV EAX,[EDI+EBX*4] |
SBB [ESI+EBX*4],EAX |
INC EBX |
DEC ECX |
JNZ @SUBL |
JC @SUBL |
|
POPF |
POPAD |
end; |
|
procedure MulLongLim; { A := A * B } |
asm |
PUSHAD |
PUSHF |
MOV EDI,A |
MOV EBX,B |
MOV EAX,Lim |
SHR EAX,2 |
|
MOV ECX,NumDWord |
SUB ECX,EAX |
MOV EBP,0 |
CLD |
|
@MULL: |
MOV EAX,[EDI] |
MUL EBX |
ADD EAX,EBP |
MOV EBP,EDX |
STOSD |
DEC ECX |
JNZ @MULL |
JC @MULL |
|
POPF |
POPAD |
end; |
|
procedure DivLongLim; { A := A div B } |
asm |
PUSHAD |
PUSHF |
MOV EDI,A |
MOV EBX,B |
MOV EAX,Lim |
SHR EAX,2 |
|
MOV ECX,NumDWord |
SUB ECX,EAX |
MOV EDX,ECX { EDI := A + NumDWord * 4 - 4 } |
SHL EDX,2 |
SUB EDX,4 |
ADD EDI,EDX |
|
MOV EDX,0 |
STD |
|
@DIVL: |
MOV EAX,[EDI] |
DIV EBX |
STOSD |
DEC ECX |
JNZ @DIVL |
CLD |
|
POPF |
POPAD |
end; |
|
//=========================================================================== |
|
procedure MulLongLenLim; { A := A * B } |
asm |
PUSHAD |
PUSHF |
MOV EDI,A |
MOV EBX,B |
MOV EAX,Lim |
SHR EAX,2 |
|
MOV ECX,NumDWord |
SUB ECX,EAX |
SHL EAX,2 |
ADD EDI,EAX |
|
MOV EBP,0 |
CLD |
|
@MULL: |
MOV EAX,[EDI] |
MUL EBX |
ADD EAX,EBP |
MOV EBP,EDX |
STOSD |
DEC ECX |
JNZ @MULL |
JC @MULL |
|
POPF |
POPAD |
end; |
|
end. |
|