1

私はisOddと呼ばれる小さなアセンブリルーチンを書いています。これは、名前が示すように、渡された整数が奇数の場合、%演算から1を返すことによって返されます。

これはこれまでの私のコードです:

Function prototype: int isOdd( long num )

isOdd:
    save     %sp, -96, %sp  ! Save caller's window

    mov      %i0, %o0       ! Parameter num goes to %o0
    mov      2, %l0         ! 2 goes to local register
    call     .rem           ! Call modulus subroutine
    nop

    mov      %o0, %l0       ! moves the result of the subroutine 
                            ! to output register o0
    ret
    restore

しかし、私は良い出力を得ることができません。実際、モジュラス演算を実際に実行するのではなく、numに渡した値を返すだけのようです。

グーグルはそのような基本的な質問に役立つことを証明していません。これは私の最初のアセンブリコードなので、「レジスタ」の概念にかなり慣れていません。それらを混同すると、エラーが発生する可能性があると思います。

よろしくお願いします!

4

2 に答える 2

8

8 個のブロックであると考えることができるレジスターがたくさんあります。いつでも、8 個のレジスターの 3 つの連続したブロックが現在のレジスター ウィンドウとして表示され、%o0- %o7%l0- %l7、および %i0-のラベルが付けられ%i7ます。(8 つのレジスタからなる 4 番目のブロック%g0-%g7があり、これらはウィンドウ配置の一部ではなくグローバルです。)

saveまたはの場合restore、ウィンドウは 8 の2ブロックずつ移動します。オーバーラップ ブロックにより、パラメーターと結果の受け渡しが可能になります。呼び出し元で名前が付けられているレジスタは、呼び出し先%o0%o7名前が付けられているものと同じです 。(呼び出し先の 2 つの新しいブロックは、そのウィンドウ内でローカルに使用するためのプライベートな-と、呼び出し先が別の関数を呼び出したいときに使用できる - です。)%i0%i7%l0%l7%o0%o7

それは絵でより明確です:

:                      :
+----------------------+
| Block of 8 registers |      caller's window
+----------------------+  +----------------------+
| Block of 8 registers |  |      %i0 - %i7       |    ---------.
+----------------------+  +----------------------+             | save
| Block of 8 registers |  |      %l0 - %l7       |             v
+----------------------+  +----------------------+  +----------------------+
| Block of 8 registers |  |      %o0 - %o7       |  |      %i0 - %i7       |
+----------------------+  +----------------------+  +----------------------+
| Block of 8 registers |              ^             |      %l0 - %l7       |
+----------------------+      restore |             +----------------------+
| Block of 8 registers |              `---------    |      %o0 - %o7       |
+----------------------+                            +----------------------+
| Block of 8 registers |                                callee's window
+----------------------+
:                      :

呼び出し元はnum引数を%o0(ウィンドウ内に) 配置し、呼び出します。save新しいウィンドウを設定すると、ウィンドウに表示されます%i0

.rem2 つのパラメーターを取ります。これらを%o0and %o1(ウィンドウ内) に配置してから呼び出します。それらはその%i0andに表示されます(新しいウィンドウをセットアップするために%i1a を行うと仮定します)。それはあなたの であるsaveに答えを入れます。%i0%o0

%i0同様に、結果を;に入れる必要があります。あなたに電話した人は誰でも、彼らの にそれが表示されます%o0

于 2011-10-10T01:33:03.613 に答える