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

lor*_*ara 1 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
Run Code Online (Sandbox Code Playgroud)

但是,我没有得到好的输出; 事实上,它似乎只是返回我传递给num的任何值,而不是实际进行模数运算.

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

在此先感谢您的帮助!

Mat*_*ery 8

有一大堆寄存器,您可以将其视为8个块.在任何时候,8个寄存器的三个连续块作为当前寄存器窗口可见,并标记为%o0- %o7,%l0- %l7%i0- %i7.(有8个寄存器的第四个块,%g0- %g7,它们是全局的,而不是窗口排列的一部分.)

当你save或者restore,窗口移动两个 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
+----------------------+
:                      :
Run Code Online (Sandbox Code Playgroud)

您的调用者将num参数放入%o0(在其窗口中),然后调用您.您save可以设置一个新窗口,以便%i0在窗口中看到它.

.rem有两个参数.你把它们放在你的%o0%o1(在你的窗口中),然后调用它.它会看到他们在%i0%i1(假设它确实一个save建立一个新的窗口).它将答案放在其中%i0,这是你的答案%o0.

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