我刚刚开始编程和计算,得到了一个任务,这真的让我困惑。它有两个部分1.编写ARM汇编语言程序来计算第n个斐波那契数。第n个斐波那契数递归定义为:Fn= Fn-1 + Fn-2,其中F0 = 0且F1 = 1。使用R2表示n并计算Fn在R 0中的值。通过计算F16和F32测试程序。2.以问题1的答案为起点,编写一个ARM汇编语言程序来计算最大可能的斐波那契数(i)32位无符号算术和(ii)32位有符号算术。确保在提交的项目中报告了n和Fn的值(十六进制和十进制)。
如果(最大值- Fn-1〈Fn-2)// Fn-1 + Fn-2将大于最大值......中断;//因此Fn-1是最大的斐波那契数
到目前为止我有:
AREA RESET, CODE, READONLY
ENTRY
start MOV R1, #16 ; n = 16
MOV R3, #0 ; fn1 = 0
MOV R0, #1 ; fn = 1
MOV R2, #1 ; curr = 1
whn CMP R2, R1 ; while (curr < 1)
BHS endwhn ; {
ADD R2, R2, #1 ; curr = curr + 1
MOV R4, R0 ; tmp = fn
ADD R0, R0, R3 ; fn = fn + fn1
MOV R3, R4 ; fn1 = tmp
B whn ; }
endwhn
STOP B STOP
END
1条答案
按热度按时间0sgqnhkj1#
因此,您希望在此指令之后测试标志。
但是它没有设置标志,所以添加S后缀。
接下来,您希望避免在on溢出的情况下再次循环。
(编辑:让我们正确地处理这个问题。如果它没有溢出,则进行分支。)
对于32位无符号,进位标志(C)在溢出时置位(CS),如果循环应该重复则清除(CC)。
对于32位带符号,溢出标志(V)在溢出时置位(VS),如果应重复循环则清除(VC)。
(It我已经二十年没有做过ARM编程了,假设是AArch32。)