0

これをコンパイルできません。Visual Studio で [eax+4] を y に移動するにはどうすればよいですか?

float x, y, z;

__asm
{
    mov x,      eax
    mov y,      [eax+4]
    mov z,      [eax+8]
}

編集:

エラー 1 エラー C2424: '+': '第 2 オペランド' の式が不適切です

4

3 に答える 3

11

MOV 命令はメモリ間を移動できません。各命令のルールの詳細については、お気に入りのアセンブリ言語リファレンスを確認してください。許可されているものとして明示的に記載されていないものは、許可されません。あなたはただものを作ることはできません。プロセッサは非常にうるさいです。

于 2012-09-16T15:36:20.340 に答える
4

ポインターとして使用eaxしているため、そのビットパターンをに格納することfloat xはほとんどないようです。[eax+0]おそらく、メモリから、+4、および +8 の3 つの float をコピーするつもりでしたか?

@RaymondChenは正しいです。一時レジスタを使用して転送できます。明らかな選択は、ECX または EDX を一時的に選択することです。これらは EAX と一緒に呼び出されるため、それらを使用しても、コンパイラが asm ブロックを含む関数でそれらを保存/復元することは強制されません。

値がfloatであっても、XMM0 または x87 レジスタではなく、32 ビット整数レジスタを使用してコピーできます。それらに対してFP計算を行っていません。

mov   ecx, [eax]
mov   x, ecx            // you probably want this, not  mov x, eax
mov   ecx, [eax+4]
mov   y, ecx
mov   ecx, [eax+8]
mov   z, ecx

知っxyいて連続している場合は、XMM レジスタを使用して一度に 8 バイトをコピーできます。

于 2012-09-16T15:57:39.173 に答える