📄 sqlite3obj.inc
字号:
@__lldiv@slow_ldiv:
or edx,edx // test sign of dividend
jns @__lldiv@onepos
neg edx
neg eax
sbb edx,0 // negate dividend
or edi,1
@__lldiv@onepos:
or ecx,ecx // test sign of divisor
jns @__lldiv@positive
neg ecx
neg ebx
sbb ecx,0 // negate divisor
xor edi,1
@__lldiv@positive:
mov ebp,ecx
mov ecx,64 // shift counter
push edi // save the flags
xor edi,edi // fake a 64 bit dividend
xor esi,esi
@__lldiv@xloop:
shl eax,1 // shift dividend left one bit
rcl edx,1
rcl esi,1
rcl edi,1
cmp edi,ebp // dividend larger?
jb @__lldiv@nosub
ja @__lldiv@subtract
cmp esi,ebx // maybe
jb @__lldiv@nosub
@__lldiv@subtract:
sub esi,ebx
sbb edi,ebp // subtract the divisor
inc eax // build quotient
@__lldiv@nosub:
loop @__lldiv@xloop
pop ebx // get control bits
test ebx,1 // needs negative
jz @__lldiv@finish
neg edx
neg eax
sbb edx,0 // negate
@__lldiv@finish:
pop edi
pop esi
pop ebx
pop ebp
ret 8
@__lldiv@quick_ldiv:
div ebx // unsigned divide
xor edx,edx
jmp @__lldiv@finish
End;
Procedure __lludiv;
Asm
push ebp
push ebx
push esi
push edi
mov ebx,20[esp] // get the first low word
mov ecx,24[esp] // get the first high word
or ecx,ecx
jnz @__lludiv@slow_ldiv // both high words are zero
or edx,edx
jz @__lludiv@quick_ldiv
or ebx,ebx
jz @__lludiv@quick_ldiv // if ecx:ebx == 0 force a zero divide
@__lludiv@slow_ldiv:
mov ebp,ecx
mov ecx,64 // shift counter
xor edi,edi // fake a 64 bit dividend
xor esi,esi
@__lludiv@xloop:
shl eax,1 // shift dividend left one bit
rcl edx,1
rcl esi,1
rcl edi,1
cmp edi,ebp // dividend larger?
jb @__lludiv@nosub
ja @__lludiv@subtract
cmp esi,ebx // maybe
jb @__lludiv@nosub
@__lludiv@subtract:
sub esi,ebx
sbb edi,ebp // subtract the divisor
inc eax // build quotient
@__lludiv@nosub:
loop @__lludiv@xloop
@__lludiv@finish:
pop edi
pop esi
pop ebx
pop ebp
ret 8
@__lludiv@quick_ldiv:
div ebx // unsigned divide
xor edx,edx
jmp @__lludiv@finish
End;
Procedure __llmod;
Asm
push ebp
push ebx
push esi
push edi
xor edi,edi
mov ebx,20[esp] // get the first low word
mov ecx,24[esp] // get the first high word
or ecx,ecx
jnz @__llmod@slow_ldiv // both high words are zero
or edx,edx
jz @__llmod@quick_ldiv
or ebx,ebx
jz @__llmod@quick_ldiv // if ecx:ebx == 0 force a zero divide
@__llmod@slow_ldiv:
or edx,edx // test sign of dividend
jns @__llmod@onepos
neg edx
neg eax
sbb edx,0 // negate dividend
or edi,1
@__llmod@onepos:
or ecx,ecx // test sign of divisor
jns @__llmod@positive
neg ecx
neg ebx
sbb ecx,0 // negate divisor
@__llmod@positive:
mov ebp,ecx
mov ecx,64 // shift counter
push edi // save the flags
xor edi,edi // fake a 64 bit dividend
xor esi,esi
@__llmod@xloop:
shl eax,1 // shift dividend left one bit
rcl edx,1
rcl esi,1
rcl edi,1
cmp edi,ebp // dividend larger?
jb @__llmod@nosub
ja @__llmod@subtract
cmp esi,ebx // maybe
jb @__llmod@nosub
@__llmod@subtract:
sub esi,ebx
sbb edi,ebp // subtract the divisor
inc eax // build quotient
@__llmod@nosub:
loop @__llmod@xloop
mov eax,esi
mov edx,edi // use remainder
pop ebx // get control bits
test ebx,1 // needs negative
jz @__llmod@finish
neg edx
neg eax
sbb edx,0 // negate
@__llmod@finish:
pop edi
pop esi
pop ebx
pop ebp
ret 8
@__llmod@quick_ldiv:
div ebx // unsigned divide
xchg eax,edx
xor edx,edx
jmp @__llmod@finish
End;
Procedure __llumod;
Asm
push ebp
push ebx
push esi
push edi
mov ebx,20[esp] // get the first low word
mov ecx,24[esp] // get the first high word
or ecx,ecx
jnz @__llumod@slow_ldiv // both high words are zero
or edx,edx
jz @__llumod@quick_ldiv
or ebx,ebx
jz @__llumod@quick_ldiv // if ecx:ebx == 0 force a zero divide
@__llumod@slow_ldiv:
mov ebp,ecx
mov ecx,64 // shift counter
xor edi,edi // fake a 64 bit dividend
xor esi,esi //
@__llumod@xloop:
shl eax,1 // shift dividend left one bit
rcl edx,1
rcl esi,1
rcl edi,1
cmp edi,ebp // dividend larger?
jb @__llumod@nosub
ja @__llumod@subtract
cmp esi,ebx // maybe
jb @__llumod@nosub
@__llumod@subtract:
sub esi,ebx
sbb edi,ebp // subtract the divisor
inc eax // build quotient
@__llumod@nosub:
loop @__llumod@xloop
mov eax,esi
mov edx,edi
@__llumod@finish:
pop edi
pop esi
pop ebx
pop ebp
ret 8
@__llumod@quick_ldiv:
div ebx // unsigned divide
xchg eax,edx
xor edx,edx
jmp @__llumod@finish
End;
Procedure __llshl;
Asm
cmp cl, 32
jl @__llshl@below32
cmp cl, 64
jl @__llshl@below64
xor edx, edx
xor eax, eax
ret
@__llshl@below64:
mov edx, eax
shl edx, cl
xor eax, eax
ret
@__llshl@below32:
shld edx, eax, cl
shl eax, cl
ret
End;
Procedure __llshr;
Asm
cmp cl, 32
jl @__llshr@below32
cmp cl, 64
jl @__llshr@below64
sar edx, 1fh
mov eax,edx
ret
@__llshr@below64:
mov eax, edx
cdq
sar eax,cl
ret
@__llshr@below32:
shrd eax, edx, cl
sar edx, cl
ret
End;
Function __ftol: integer; Cdecl;
Var
f: double;
Begin
Asm
lea eax, f // BC++ passes floats on the FPU stack
fstp qword ptr [eax] // Delphi passes floats on the CPU stack
End;
Result := Trunc(f);
End;
Function _strlen(P: PAnsiChar): integer; Cdecl;
Begin
Result := lstrlen(P);
End;
Function _strncmp(P1, P2: PAnsiChar; Length: integer): integer; Cdecl;
Begin
Result := StrLComp(P1, P2, Length);
End;
Procedure _memset(P: Pointer; B: Byte; count: integer); Cdecl;
Begin
FillChar(P^, count, B);
End;
Procedure _memcpy(dest, Source: Pointer; count: integer); Cdecl;
Begin
Move(Source^, dest^, count);
End;
Function _memmove(Destination: Pointer; Source: Pointer; Length: DWORD): Pointer; Cdecl;
Begin
Move(Source^, Destination^, Length);
Result := Destination;
End;
Function _memcmp(P1, P2: Pointer; Length: integer): integer; Cdecl;
Begin
Result := -1;
If CompareMem(P1, P2, Length) Then
Result := 0;
End;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -