2015-10-26 15 views
-1

我將一個Delphi 32位應用程序移植到Pascal腳本 - 它不支持asm,而我只有64位機器,所以我甚至不能運行代碼並模仿它。在Pure Pascal中需要這4個短Pascal Asm例程

{$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(但找不到應用程序 - 是否有一個?)。

感謝, OZZ

+7

我投票結束這個問題作爲題外話,因爲這不是一個編碼服務。 –

+0

那麼你可以推薦一個網站嗎? –

+2

在C:http://graphics.stanford.edu/~seander/bithacks.html –

回答

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位可能也是危險的,在這種情況下,使「工作」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; 
+0

謝謝Marco!第二個例子是一個很好的位計數器。任何想法bsf eax,dword ptr BB - 與dword ptr [BB]之間有什麼不同?不知道支架的作用(如果有的話)... –

+0

Borland的Afaik ptr講話是[] Masm(微軟)的彙編程序。一些工具允許或忽略另一個 –

+0

Marco,我在FPC中發現[]至少意味着參數必須是var。所以,我無法調用BitScanForward(1),在沒有[]的情況下更改並在定義中放置var - 然後我可以調用raw。 (我現在有一個32位系統,所以我可以手動移植到asm)。 –