我的主要源文件:
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
和分支标志;beq
和cbz
一样紧凑,但可以向后分支。
此外,subs
和adds
可以作为16位拇指指令使用,而sub
和add
只有32位编码,所以您通常都希望这样。