问题描述
我刚刚开始学习ARM汇编,并且我一直在尝试编写一个相对简单的程序。完成后,用户将能够输入一个数字(出现提示时)以指示他们想要打印的斐波那契数列的输入。当前,我要做的就是打印提示,然后打印一个硬编码的条目(在这种情况下,我选择了第4个)。稍后我会弄清楚用户的输入。
但是,我遇到了分支(BL)问题。我能够跳转到外部函数printf
来打印提示,但是编译器似乎无法识别到fibo
的第二个分支。我之所以这样假设,是因为无论我将 targ 设置为什么数字,它始终会打印出x3
的初始值1-,但是情况下,无论进入循环之前x3的值是多少,它都会打印出1。函数“ fibo”用于将x3的当前值以及返回地址存储在内存中,检查计数器是否小于或等于目标#,然后返回到loop
。然后循环修改x3和x4以便进行尾递归-因此x3肯定应该在更改。谁能说明我的问题?
.text
.global main
.extern printf
main:
mov x3,xzr // set x3 and x4 -> (0,1)
mov x4,#1
ldr x1,=targ // set x1 to target (currently manually set)
ldr x0,=prompt // print prompt
bl printf
loop:
mov x9,x3 // this chunk: (1,1) -> (1,2) -> (3,5) ..
mov x3,x4
add x4,x9,x4
bl fibo // branch to fibo
ldr x30,[sp,#8] // load value and return address from stack
ldr x3,#0]
add x2,x3,x2 // x2 = x3 + x2
add sp,sp,#16
mov x0,x2 // print out x2 by moving it to x0,then calling printf
ldr x0,=stringpr
bl printf
br x30
fibo:
sub sp,#16
str x30,#8]
str x3,#0] // store current value of x3 in stack
add x5,x5,#1
cmp x5,x1 // test x5 (counter) is greater than target; if it is,ignore branch
ble loop
mov x2,#0
add sp,#16
br x30
.data
prompt:
.asciz "Enter a number:\n"
targ:
.byte 4 // hard-coded value for 'targ'
stringpr:
.asciz "%d\n"
.end
编辑
- x0->在使用printf打印变量时使用
- x1->存储'targ'变量,即目标斐波那契条目
- x2->保存斐波那契条目的返回值
- x3->保留斐波那契序列的尾递归的“尾”端。
- x4->保持尾递归的“头”端(例如[1,2]中为'2',[5,8]中为'8')
- x5->保留计数,并在每次调用
fibo
时递增
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)