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 个寄存器块作为当前寄存器窗口可见,并标记为%o0- %o7%l0-%l7%i0- %i7。(有第四块 8 个寄存器%g0- %g7,它们是全局的,而不是窗口排列的一部分。)

当您saverestore时,窗口移动两个8 块。重叠块允许参数和结果传递。%o0在调用者中命名的寄存器与在被调用者中命名的寄存器%o7相同 。(被调用者中的两个新块是- ,它们是私有的,供该窗口内的本地使用,以及-当被调用者想要调用另一个函数时可以使用它们。)%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在你的窗口中看到它。

.rem接受两个参数。你把这些放在你的%o0%o1(在你的窗口中),然后调用它。它将在其%i0和中看到它们%i1(假设它save设置了一个新窗口)。它把答案放在它的 中%i0,这是你的%o0

同样,你应该把你的结果放在你的%i0; 无论谁打电话给你,都会在他们的%o0.

于 2011-10-10T01:33:03.613 回答
0
! modified based on comments 

isOdd:
  save     %sp, -96, %sp  ! Save caller's window
  mov      %i0, %o0       ! Parameter num goes to %o0
  mov      2, %o1         ! 2 goes to %o1
  call     .rem           ! Call modulus subroutine
  nop

  mov      %o0, %i0       ! moves the result of the subroutine 
                          ! to input register i0
  ret
  restore
于 2013-10-07T14:30:34.943 回答