编写一个非常基本的SPARC程序例程会导致数字是否为奇数

时间:2011-10-10 00:07:51

标签: assembly sparc

我正在编写一个名为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的任何值,而不是实际进行模数运算。

谷歌对这样一个基本问题没有任何帮助。这是我的第一个汇编代码,所以我对“寄存器”的概念非常不熟悉,我认为将它们混合在一起就是我的错误所在。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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