我正在编写一个名为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的任何值,而不是实际进行模数运算。
谷歌对这样一个基本问题没有任何帮助。这是我的第一个汇编代码,所以我对“寄存器”的概念非常不熟悉,我认为将它们混合在一起就是我的错误所在。
提前感谢您的帮助!
答案 0 :(得分: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
+----------------------+
: :
您的来电者将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