2017-12-11 8 views
3

私はASMについて知識を持っていないので、愚かな質問であれば私を許してください。Delphi ASMでvarパラメータを返す方法

私はこの機能を持っている:

function SwapDWord(const AValue: DWORD): DWORD; 
asm 
    BSWAP EAX 
end; 

どのように私は、ASMの手順に変換します:私はどの私ができるAValue := SwapDWord(AValue);を使用したくない

procedure SwapDWordVar(var AValue: DWORD); 
asm 
    // ??? 
end; 

。私はASMでこれをやりたい

私ははSystem.pasを見て、多くの愚かな事をしようとした登録(複数可)を使用するかを理解しようとしました。しかし何も働かなかった。常に元の AValueを返します。

+3

なぜあなたはあなたがすでに持っているものに変更したいのかもしれません

procedure SwapDWordVar(var AValue: DWORD); asm mov edx, [eax] bswap edx mov [eax], edx end; 

?このために関数がはるかに優れています。 –

+1

@DavidHeffernan、それは学習のためのものでした。私はあなたがもちろん:) – zig

+1

はない気にしないことを望むが、あなたはあなたはそれが –

答えて

6

可能な変形:あなたは便利なグイドGybels articles

+0

これは私が使った正確なコードです!ただし、私はeaxレジスタで角括弧を使用しませんでした。彼らの意味を説明できますか? – zig

+4

'Var'引数は変数のアドレスを格納します。したがって、 'eax'には変数のアドレスが含まれています。 '[eax]'はそのアドレスを使い、価値があります。 – MBo

2

ただ、このバージョンでは、コンパイルとWin32とWin64の両方のために働くことを

procedure SwapDWordVar(var AValue: DWORD); 
asm 
    mov edx, dword ptr [AValue] 
    bswap edx 
    mov dword ptr [AValue], edx 
end; 

注意をしてみてください。

しかし、ほとんどの時間は、メモリにアクセスしない、関数を呼び出す費やされるので、それはAValue := SWapDWord(AValue)より速くならないことに注意してください。

+1

によって生成され、得られたASMコードを研究:オペコードとオペランド – zig

+1

の無効な組合せが 'bswap'メモリで動作していますか? AFAIK、登録番号 – MBo

+0

参照:http://www.felixcloutier.com/x86/BSWAP.html bswapはregオペランドのみを使用します。 – Johan

関連する問題