如何解决分支偏移超出范围 ARM汇编程序,用于打印最高达N的质数,其中N是用户输入
我的主要源文件:
L0 LDR R0,=prompt
BL WriteString ;print prompt
BL ReadInt ;R0 = n
CMP R0,#0
BGE L1
LDR R0,=res0 ; invalid input
BL WriteString
B L0
L1 MOV R1,#2
L2 UDIV R2,R0,R1
MLS R2,R1,R2,R0
CBZ R2,L3
BL WriteInt
ADD R1,#1
CMP R1,R0
BLT L2
L3 SUB R0,#1
CBZ R0,L0 ;Error: A1176E: Branch offset 0xFFFFFFC8 out of range.
B L1
prompt DCB "Enter a positive integer: ",0
res0 DCB 13,10,"Invalid input",13,0
ALIGN
END
我还遇到了L2跳出循环的问题。任何建议将此代码改进为可正常使用的建议。
解决方法
这个ARM developer page说
CBZ和CBNZ
限制
分支目的地必须在指令之后的4到130个字节内,并且处于相同的执行状态。
您正尝试向后分支56个字节。
您可能想使用subs r0,#1
并在标志上分支; beq
和cbz
一样紧凑,但是可以向后分支。
此外,subs
和adds
可作为16位拇指指令使用,这与sub
和add
仅具有32位编码的情况不同,因此通常您希望无论如何。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。