1

アセンブリとMIPS命令セットを調べています。これが私が勉強している私の基本的な最初のプログラムです:

.text
    .globl main
main:
    li  $t0, -10 #  $t0 = -10   ("load immediate")
    li  $t1, -31 #  $t1 = -31   ("load immediate")
    li  $t2, -10 #  $t2 = -10   ("load immediate")
    li  $t3, -31 #  $t3 = -31   ("load immediate")

    #swap

    xor $t0, $t0, $t1
    xor $t1, $t0, $t1
    xor $t0, $t0, $t1

    addu    $t2, $t2, $t3
    subu    $t3, $t2, $t3
    subu    $t2, $t2, $t3

    li  $v0, 10
    syscall

ここで、エミュレーターでこのプログラムを実行できるため、各命令が何をするのかを理解したいと思います。これにより、このプログラムとその機能、およびアセンブリをさらに学習するためにプログラムを変更する方法について詳しく知ることができます。手始めに、xor、addu、subuの部分にコメントする方法と、syscallの意味と最初の部分の.textと.bloblmainについて教えてください。

私はこれを実際よりも難しくしていますか?また、MIPSアセンブリプログラミングのチュートリアルを提供してください。

4

1 に答える 1

1

私はそれを分解します:

liはいわゆる擬似命令であり、アセンブラはそれをlui(Load Upper Immediate) とori(OR Immediate) に分割して、2 つの 16 ビット即値から 32 ビット値を構築します。lw使用できますが、通常はメリットがなく、キャッシュラインが破棄されます。

は、xorop1 = op2 XOR op3 を計算するだけです。あなたの特別なケースでは、$t0 と $t1のレジスタ スワッピングに使用されます。

adduそして、subuop2 と op3 を加算/減算し、結果を op1 に格納します。繰り返しますが、コードに示されているものは、2 つのレジスタ $t2 と $t3 を交換します。

syscallオペレーティングシステムにトラップされ、特定の機能を実行します。関数番号は $v0 に格納されるため、この例では関数番号 10 が実行されます。これは "exit" で一般的なようです。

于 2012-07-25T11:18:19.173 に答える