2013-02-23 8 views
7

ほとんどのアセンブリプログラムでは汎用レジスタeax ebx ecx edxを使用していますが、多くの場合、4つ以上のレジスタを使用してpushpopスタックから多くまで。私のプログラムはFPUまたはMMXレジスタを浮動小数点計算または "意図された使用"に使用する意思がないので、これらの余分なレジスタをプログラムで使用することは容認されますか?FPUとMMXレジスタを "汎用レジスタ"として使用

例:ループインクリメントカウンタにxmm0を使用して、ecxレジスタを解放して他の処理を行います。

+0

あなたは何でもしても大丈夫です。 xmmレジスタを使用してスタックに流出するよりも速いとわかった場合は、それを行ってください。 – Mysticial

+2

@Mysticialプログラマに関係することは誰も "私が欲しいものは何でもできます"と言っている人はほとんどいません。私はそれを掘る:) – user99545

+1

x86_64一般的な使用のための8つの余分なレジスタがあります。 –

答えて

3

なぜ4ですか?これらのすべてを使用することができます:eaxebxecxedxesiediおよびebpそれは7です。それとも十分ではありませんか?

FPUレジスタとMMXレジスタは、自分自身とメモリからのみロードでき、自分自身とメモリにのみ格納できるため、やや面倒です。それらと汎用レジスタ間で自由にデータを移動することはできません。また、両方の種類のレジスタで同時に動作する命令もありません。

7つの汎用レジスタでは不十分な場合は、local/on-stack変数を使用します。たとえば、メモリ内のカウンタ変数を直接減分することができます。また、定数または別のレジスタと直接比較することもできます。おそらく、これはFPUやMMXレジスタを奇妙な方法で使用するよりも遅くなることはないでしょう(より速いでしょう)。

+0

いいえ、7つのレジスタはすべてを使用するほど高速ではありません。 MMXレジスタは非常に便利です。 –

+0

@BenVoigt Elaborate? –

-2

Weelもちろん、SIとDIもあります。また、x64には追加のレジスタがありますが、FPレジスタは任意のものに使用できます。

0

32ビットのレジスタはどれくらいの頻度で必要ですか?小さなカウンタのようなものについては、AH/AL、BH/BL、CH/CL、DH/DLのバイトサイズの四半期の汎用レジスタを自由に使用してください。ビット単位のトリッキーでは、上位16ビットの汎用レジスタをワードサイズの変数の中間記憶域として使用することもできます。

リアルモード(読み込み:DOS)では、セグメントレジスタES、FS、GSを中間値の格納に使用することもできます。プロテクトモードのOS(Windows、Linux、* nix)では、コードはクラッシュします。