2012-02-24 326 views
7

請我已經這個代碼GCC內聯彙編件轉換一個GCC內聯彙編德爾福內聯彙編

int src = 0; 
dword n; 
__asm(
      "sar %%cl,%%edx" 
      : "=d" (n) // saves in eax,edx 
      : "c" (src), "d" (n) // the inputs 
      ); 

和我的德爾福的嘗試是:

asm 
mov ecx, &src 
mov edx, &n 
sar cl,edx 
mov eax,edx 
end; 

請是正確的?

+5

我的建議是將此代碼轉換爲Pascal而不是彙編程序。 – 2012-02-24 12:07:35

回答

10

內聯彙編程序在德爾福中的工作方式與在GCC中的工作方式不同。對於初學者來說,你沒有同類型的德爾福宏觀和模板支撐,所以如果你想使用一個聲明,一旦通用匯編程序,你必須將其聲明爲一個函數:

function ShiftArithmeticRight(aShift: Byte; aValue: LongInt): LongInt; 
{$IFDEF WIN64} 
asm 
    sar edx,cl 
    mov eax,edx 
end; 
{$ELSE} 
{$IFDEF CPU386} 
asm 
    mov cl,al 
    sar edx,cl 
    mov eax,edx 
end; 
{$ELSE} 
begin 
    if aValue < 0 then 
    Result := not (not aValue shr aShift) 
    else 
    Result := aValue shr aShift; 
end; 
{$ENDIF} 
{$ENDIF} 

在Delphi中,內聯彙編程序必須在使用它的地方實現,並且只支持32位。在這樣的模塊中,您可以自由使用EAX,ECX,EDX以及周圍代碼中的任何標識符。例如:

var 
    lValue: LongInt; 
    lShift: Byte; 
begin 
    // Enter pascal code here 
    asm 
    mov cl,lShift 
    sar lValue,cl 
    end; 
    // Enter pascal code here 
end; 
+0

非常感謝亨裏克Hellström,我將根據您的寶貴 答案重新啓動。 謝謝 – Alexis 2012-02-24 12:53:52

+2

@Alexis請仔細閱讀這個http://meta.stackexchange.com/questions/5234/,然後考慮接受這個答案,並回答一些你以前的問題 – 2012-02-24 14:10:06

+0

修復了我原來的答案中的一個錯誤。 SAR是一個有符號操作,所以aValue參數應該是LongInt而不是LongWord。 – 2012-02-24 14:57:25