在Pure Pascal中需要这4个简短的Pascal Asm例程

时间:2015-10-26 14:57:19

标签: assembly pascal

我正在将一个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

1 个答案:

答案 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;