2017-12-11 9 views
1

私はランダムに記憶していました。以前のMIPSアセンブリコースでスタック上の変数にアクセスしようとしたときに、私は特にLAを使用しました(私はLEAのMIPSと同じです)。しかし、x86 32インテルでは、主にスタック内の変数にアクセスするためにmovを使用することを認識しました。私は、LEAがアドレスをロードし、そのアドレスをレジスタに格納し、次にdereferencedによってそのアドレスにあった値を取得するように変更することを理解する。x86 32 intel - MOV vs LEA with pointers

私はeaxが両方のシナリオで逆参照されたesp + 4と等しいことがわかります。このシナリオで、ある方法を他の方法よりも使用する利点は何ですか? 私はこのメソッドを使って関数の引数を取得するためにこのコードを書いた 私は好奇心を持っています。私のMIPSコースの私の教授はmovを使わないように教えてくれました。

mov $eax [$esp+4] 

lea $eax [$esp+4] 
mov $eax [$eax] 
+0

最初はMIPS 'lw $ t0、4($ sp)'に相当します。 2番目は 'addiu $ t0、$ sp、4'に続いて' lw $ t0、0($ t0) 'と同じです。 –

答えて

0

対MIPS laは、x86 mov reg, imm32と同じである:それはレジスタにアドレス定数を置くための擬似命令です。 は、任意のアドレッシングモードを使用できるLEAとは異なり、実際の定数に対してのみ機能します。

MIPSmove命令がありません。 move $t1, $t0は、
or $t1, $zero, $t0の疑似命令です。つまり、$t1 = 0 | $t0 = $t0です。レジスタをコピーする必要がある場合は、adduまたはorの代わりにmoveと書くこともできます。

x86のアドレッシングモードが直接32ビットの定数を使用することができます(ただし、通常はMIPSにあなたはadd命令がdst = src1 + src2の代わりにdst += srcを行う場所の指示は、x86とは異なり、別の目的地を持っているので、レジスタのコピーを避けることができる)、そして遠くあります利用可能なレジスタが少なくなります。アドレスを最初にレジスタに入れるのではなく、直接使用することはしばしば意味があります。例えばadd eax, [my_array + ecx*4]Referencing the contents of a memory location. (x86 addressing modes)を参照してください。

MIPSには1つのアドレッシングモード(レジスタ+ 16ビットの即時)しかありません。小さなアドレス(アドレス空間の下位16ビット)では、それらを直接使用することができます。 ls $t0, my_static_variable($zero)またはlw $t0, my_array($t1)。 (もちろん、縮尺の指標はないので、次の要素にインデックスを付けるにはaddui $t1, $t1, 4にする必要があります)。

関連する問題