分支偏移超出范围。用于打印最多 N 的素数的 ARM 汇编程序,其中 N 是用户输入

Xav*_*nsa -1 assembly arm cortex-m

我的主要源文件:

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
Run Code Online (Sandbox Code Playgroud)

我也遇到了跳出 L2 循环的问题。任何将此代码改进为工作顺序的建议将不胜感激。

Wea*_*ane 7

这个 ARM开发者页面

CBZ 和 CBNZ

限制

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

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


你可能想subs r0, #1在标志上使用和分支;beq一样紧凑,cbz可以向后分支。

此外,subsadds可用作 16 位拇指指令,与只有 32 位编码的sub和不同add,因此您通常需要它。