微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决分支偏移超出范围 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并在标志上分支; beqcbz一样紧凑,但是可以向后分支。

此外,subsadds可作为16位拇指指令使用,这与subadd仅具有32位编码的情况不同,因此通常您希望无论如何。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。