分支偏移超出范围.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, 10, 0
ALIGN
END

我在L2的循环中也遇到了问题。如果有任何建议可以将此代码改进为工作顺序,我们将不胜感激。

这个ARM开发人员页面显示

CBZ和CBNZ

限制

分支目的地必须在指令之后的4到130字节内,并且处于相同的执行状态。

您正试图向后分支56个字节。


您可能想要使用subs r0, #1和分支标志;beqcbz一样紧凑,但可以向后分支。

此外,subsadds可以作为16位拇指指令使用,而subadd只有32位编码,所以您通常都希望这样。

相关内容

最新更新