1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
unit UASMTools;
interface
//function FirstOne(aBoard: Int64): Integer;
//function LastOne(aBoard: Int64): Integer;
function BitCount(aBoard: Int64): Byte;// assembler;
function BitScanForward(var X: Int64): Integer;
//function BitScanReverse(var X: Int64): Integer;
//function BitScan(var X, Y: Integer; Z: pointer): Integer;
implementation
//FirstOne scans low register first (forward)
//LastOne scans high register first (reverse)
//PopCount count the number of bits set in a Int64
function BitCount(aBoard: Int64): Byte;
var
LDam: Int64;
begin
result := 0;
LDam := aBoard;
while LDam <> Int64(0) do
begin
if LDam and Int64(1) = Int64(1) then
Inc(result);
LDam := LDam shr 1;
end;
end;
function BitScanForward(var X: Int64): Integer;
begin
result := 0;
end;
(*
function FirstOne(aBoard: Int64): Integer;
asm
xor eax, eax
bsf edx, dword ptr aBoard
jnz @@1
mov eax, 32
bsf edx, dword ptr aBoard + 4
@@1: add eax, edx
end;
function LastOne(aBoard: Int64): Integer;
asm
xor eax, eax
bsr edx, dword ptr aBoard
jnz @@1
mov eax, 32
bsr edx, dword ptr aBoard + 4
@@1: add eax, edx
end;
function BitCount(aBoard: Int64): Byte; assembler;
asm
mov ecx, dword ptr aBoard
xor eax, eax
test ecx, ecx
jz @@1
@@0: lea edx, [ecx-1]
inc eax
and ecx, edx
jnz @@0
@@1: mov ecx, dword ptr aBoard+4
test ecx, ecx
jz @@3
@@2: lea edx, [ecx-1]
inc eax
and ecx, edx
jnz @@2
@@3:
end;
function BitScanReverse(var X: Int64): Integer;
asm
{store lowest 32 bit into ECX and the higher 32 bit into EDX}
MOV ECX,[EAX]
MOV EDX,[EAX+4]
{test if lower 32 bit contain a '1'}
BSR EAX,ECX
JNZ @READY
{test if higher 32 bit contain a '1'}
BSR EAX,EDX
JNZ @CALCINDEX
{set error code}
MOV EAX, -1
JMP @READY
@CALCINDEX:
{add 32 to get the overall index}
ADD EAX, 32
@READY:
RET
end;
function BitScanForward(var X: Int64): Integer;
asm
{store lowest 32 bit into ECX and the higher 32 bit into EDX}
MOV ECX,[EAX]
MOV EDX,[EAX+4]
{test if lower 32 bit contain a '1'}
BSF EAX,ECX
JNZ @READY
{test if higher 32 bit contain a '1'}
BSF EAX,EDX
JNZ @CALCINDEX
{set error code}
MOV EAX, -1
JMP @READY
@CALCINDEX:
{add 32 to get the overall index}
ADD EAX, 32
@READY:
RET
end;
function BitScan(var X, Y: Integer; Z: pointer): Integer;
var
dummy: Cardinal;
asm
PUSHA
MOV EAX,[z]
MOV Dummy, EAX // voor het geval eax al een waarde heeft ontvangen
MOV EDX,[z+4]
BSF X,EAX
JZ @E //Als niet gevonden
ADD X, 32 //Het is een int64
BSR Y,EDX //dan moet het in edx gezocht worden
JZ @B //Als niet gevonden
@B:
BSR EDX,Dummy
JZ @SetNull //Als niet gevonden
ADD Y, 32 //Gevonden in het tweede register.
JMP @READY
@E:
BSF X,EDX //Als niet gevonden in EAX dan misschien in EDX
JZ @SetNull //Anders maar op nul!
JMP @READY
@SetNull:
MOV X, $-1
MOV Y, $-1
@READY:
POPA
RET
end;
*)
end. |
Partager