我正在将一个Delphi 32位应用程序移植到Pascal脚本 - 它不支持asm,我只有64位机器,所以我甚至无法运行代码并模仿它。
{$ASMMODE INTEL}
function BitScanForward(var BB:Int64):Integer; assembler;
asm
bsf eax, dword ptr [BB]
jnz @@2
@@0: bsf eax, dword ptr [BB+04h]
add eax, 20h
@@2:
end;
function BitScanBackward(var BB:Int64):Integer; assembler;
asm
bsr eax, dword ptr [BB+04h]
jz @@0
add eax, 20h
jnz @@2
@@0: bsr eax, dword ptr [BB]
@@2:
end;
function BitCountAsm(const BB:Int64): Integer; assembler;
asm
mov ecx, dword ptr BB
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 BB+04h
test ecx, ecx
jz @@3
@@2: lea edx, [ecx-1]
inc eax
and ecx, edx
jnz @@2
@@3:
end;
function BitScanForward2(BB:Int64): Integer; assembler;
asm
bsf eax, dword ptr BB
jnz @@2
@@0: bsf eax, dword ptr BB+04h
add eax, 20h
@@2:
end;
我想要那些纯粹的pascal。我还看到了一个YouTube视频,其中有人演示了Asm-> Pascal(但找不到该应用 - 是否有一个?)。
谢谢, OZZ
答案 0 :(得分:2)
类似的东西:
function BitScanForward(var BB:Int64):Integer;
var i : integer;
work:int64;
begin
Work:=bb;
i:=0;
while (i<64) and ((bb and 1)=0) do
begin
inc(i);
bb:=bb shr 1;
end;
result:=i;
end;
BitscanBackward是相同的,但测试最高位。可能最好的是没有签名,但是我无法测试,所以我将其作为练习留给读者。可能第64位在上述版本中也很危险,在这种情况下make&#34; work&#34; UINT64。
function BitScanForward(var BB:Int64):Integer;
var i : integer;
work:int64;
begin
Work:=bb; result:=0;
for i:=0 to 63 do
begin
if (bb and 1)=1 then
inc(result);
bb:=bb shr 1;
end;
end;