16

パックされたダブルワード整数をXMMレジスタからスタックにプッシュする方法はありますか?その後、必要に応じてポップバックしますか?

理想的には、汎用レジスタ用のPUSHやPOPのようなものを探しています。インテルのマニュアルを確認しましたが、コマンドを見逃したか、コマンドがありません...

または、値を汎用レジスタに解凍してからプッシュする必要がありますか?

4

2 に答える 2

25

いいえ、x86ではそのようなasm命令はありませんが、次のようなことができます。

//Push xmm0
sub     esp, 16
movdqu  dqword [esp], xmm0

//Pop xmm0
movdqu  xmm0, dqword [esp]
add     esp, 16

編集:

上のコードサンプルは、直接プッシュ/ポップエミュレーションです。

スタックで他のローカル変数も使用している場合は、次のように、ebpレジスタを最初に適切に設定する必要があります。

push ebp
mov  ebp, esp
sub  esp, LocaStackVariablesSize
//... your code
mov  esp, ebp
pop  ebp  
ret

その場合、ダニエルズソリューションを使用することもできます!

于 2012-04-15T12:36:15.977 に答える
0

この目的のために、別の16ビット整列スタックを使用することをお勧めします。これにより、movdquの代わりにmovdqaを使用できます。これら2つの命令の間には、実行時間にわずかな違いがあります。

于 2018-07-27T11:17:35.987 に答える