-1

我正在将一个 Delphi 32 位应用程序移植到一个不支持 asm 的 Pascal 脚本,而且我只有 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;

我想得到那些纯帕斯卡。我还看到了一个 YouTube 视频,其中有人演示了 Asm->Pascal(但找不到该应用程序 - 有吗?)。

4

1 回答 1

3

就像是:

 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 位可能也很危险,在这种情况下,请“工作”uint64。

 function BitScanBackward(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;
于 2015-10-27T21:18:33.547 回答