我刚刚开始编程和计算,得到的任务确实让我感到困惑。它分为两个部分 1.编写一个ARM汇编语言程序以计算第n个斐波纳契数。的 第n个斐波那契数递归定义为: Fn = Fn-1 + Fn-2 其中F0 = 0和F1 = 1。 对n使用R2并在R0中计算Fn。通过计算F16和F32来测试您的程序。 2.以对第一季度的答案作为起点,编写一个ARM汇编语言程序 使用(i)32位无符号算术来计算最大可能的斐波那契数 (ii)32位带符号算术。确保报告n和Fn的值(在 十六进制和十进制)。
如果(MAX-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
答案 0 :(得分:0)
因此,您想在执行此指令后测试这些标志。
ADD R0, R0, R3 ; fn = fn + fn1
但是它没有设置标志。因此,添加S后缀。
ADDS R0, R0, R3 ; fn = fn + fn1
接下来,您要避免在发生溢出时再次循环处理。
(编辑:,让我们做对吧。如果没有溢出,请分支。)
对于32位无符号,在溢出时将进位标志(C)设置为(CS),如果应重复循环,则将其清零(CC)。
BCC whn ; }
对于32位带符号,溢出标志(V)在溢出时置位(VS),如果应重复循环,则清除(VC)。
BVC whn ; }
(自从我完成任何ARM编程已经二十年了。假设是AArch32。)