我刚开始学习编程和计算,得到了一个让我很困惑的任务。它有两个部分:1.用ARM汇编语言程序计算第n个Fibonacci数。第n个斐波那契数递归地定义为: Fn= Fn-1 + Fn-2,其中F0 =0,F1 = 1。对n使用R2,在R0中计算Fn。通过计算F16和F32来测试程序。2.以您对Q1的回答为起点,编写ARM汇编语言程序,使用(i) 32位无符号算法和(ii) 32位签名算法计算最大可能的斐波那契数。确保在项目提交中报告n和Fn (十六进制和十进制)的值。
如果(MAX - 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发布于 2018-10-10 14:02:01
因此,您希望在此指令之后测试这些标志。
ADD R0, R0, R3 ; fn = fn + fn1但它没有设置旗子。所以添加S后缀。
ADDS R0, R0, R3 ; fn = fn + fn1接下来,您希望避免在on溢出的情况下再次循环。
(编辑:,让我们把这个做对了。如果没有溢出,则为分支。)
对于32位无符号的情况,在溢出时设置进位标志(C),如果应该重复循环,则清除(CC)。
BCC whn ; }对于32位签名,溢出标志(V)被设置(VS)溢出,清除(VC),如果循环应该重复。
BVC whn ; }(我已经20年没有做过ARM编程了。(假设为AArch32.)
https://stackoverflow.com/questions/52741816
复制相似问题