2012-01-17 142 views
-3

請怎麼會這樣C++函數轉換爲德爾福:轉換一個C++內聯彙編函數的德爾福內聯彙編函數

int To_Asm_Fnc(dword Amem, dword Al, dword Ac) { 
int b = 0; 
    asm ("push %%ecx; \ 
      call %%eax; \ 
      pop %%ecx;" 
     : "=Al" (b) /* output value */ 
     : "Al" (mem), "Ac" (Al), "d" (Ac) /* input value */ 
     ); 
    return b; 
} 

,這是我的德爾福嘗試

Function To_Asm_Fnc(Amem,Al,Ac:dword):Integer; 
var 
b:Integer; 
begin 
Result:=0; 
b:=0; 
//******* 
{ i really didn't get it as in the c++ code } 
//******* 
Result:=b; 
end; 

千恩萬謝

+5

這不是C++,這是程序集。 –

+2

什麼是您的C++編譯器。您需要了解調用約定並註冊該約定的維護規則才能瞭解這一點。 –

+0

在Delphi中,你也可以使用'asm'關鍵字,http://docwiki.embarcadero.com/RADStudio/en/Using_Inline_Assembly_Code。 – Pol

回答

6

看起來這個函數接受指向另一個函數的指針,並設置參數

function To_Asm_Fnc(Amem: Pointer; _Al, _Ac: cardinal): integer; 
asm 
    // x68 only!; paramateres are passed differently in x64 
    // inputs : "Al" (mem), "Ac" (Al), "d" (Ac) /* input value */ 
    // amem is already in eax 
    // _al is passed in edx and _ac in ecx; but the code expects them reversed 
    xchg edx, ecx 
    push ecx 
    call eax 
    pop ecx 
    // result is already in eax and delphi returns the result in eax 
    // outputs : "=Al" (b) /* output value */ 
end; 
+0

如果所有這些例程所做的都是顛倒參數的順序,那麼從長遠角度來看,這樣做可能會更好,而無需採用裝配。我必須說,我不太清楚你是如何看出原來的asm顛倒了這兩個參數的。 –

+2

原始asm沒有反轉參數。代碼:「Ac」(A1),「d」(Ac)表示:將Al變量放入ecx寄存器並將Ac變量放入edx寄存器。德爾福按照以下順序使用params:eax,edx,ecx,stack;所以爲了保持函數簽名相同,我們交換傳遞的參數。 PS。該函數調用另一個由Amem參數 –

+0

指向的函數。出於興趣,C++編譯器以此格式接受asm。我不認識這種語法。哦,+1順便說一句。 –