これをコンパイルできません。Visual Studio で [eax+4] を y に移動するにはどうすればよいですか?
float x, y, z;
__asm
{
mov x, eax
mov y, [eax+4]
mov z, [eax+8]
}
編集:
エラー 1 エラー C2424: '+': '第 2 オペランド' の式が不適切です
これをコンパイルできません。Visual Studio で [eax+4] を y に移動するにはどうすればよいですか?
float x, y, z;
__asm
{
mov x, eax
mov y, [eax+4]
mov z, [eax+8]
}
編集:
エラー 1 エラー C2424: '+': '第 2 オペランド' の式が不適切です
MOV 命令はメモリ間を移動できません。各命令のルールの詳細については、お気に入りのアセンブリ言語リファレンスを確認してください。許可されているものとして明示的に記載されていないものは、許可されません。あなたはただものを作ることはできません。プロセッサは非常にうるさいです。
ポインターとして使用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
知っx
てy
いて連続している場合は、XMM レジスタを使用して一度に 8 バイトをコピーできます。