我正在编写一个名为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的任何值,而不是实际进行模数运算.
谷歌对这样一个基本问题没有任何帮助.这是我的第一个汇编代码,所以我对"寄存器"的概念非常不熟悉,我认为将它们混合在一起就是我的错误所在.
在此先感谢您的帮助!
有一大堆寄存器,您可以将其视为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.