2012-02-24 14 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

私の助言は、このコードをアセンブラではなくパスカルに変換することです。 –

答えて

10

インラインアセンブラはGCCと同じようにDelphiで動作しません。まず第一に、あなたは、Delphiでのマクロとテンプレートのサポートの同じ種類を持っていないので、あなたが宣言ワンス汎用アセンブラルーチンを使用する場合、あなたは関数として宣言する必要があります。

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ビットでのみサポートされています。このようなasmブロックでは、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

多くのおかげでHenrickHellström、私はあなたの貴重な 答えに基づいて再起動します。 ありがとう – Alexis

+2

@Alexisこのhttp://meta.stackexchange.com/questions/5234/を読んでから、この回答と以前の質問への回答を受け入れることを検討してください。 –

+0

私の元の回答の不具合を修正しました。 SARは署名付き操作なので、aValueパラメータはLongWordではなくLongWordである必要があります。 –

関連する問題