You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM汇编中带偏移的标签寻址语法报错,求可行实现方案

ARM汇编循环加载间隔16字节字符串数组的正确实现

你原来的代码报错是因为ldr指令的内存操作数里不能直接用=FirstString这种伪指令——=xxx是用来把地址加载到寄存器的语法,没法直接作为内存访问的基址。下面给两种可行的实现方式:

方法一:先加载数组基址到寄存器,再用寄存器偏移访问

这是最通用的写法,把字符串数组的基地址先放到一个寄存器里,再结合r4的偏移计算目标地址:

@ r4初始值为0
printInventory:
    ldr     r0, =PrintLetter   @ 加载printf的格式字符串地址
    ldr     r2, =FirstString   @ 把字符串数组的基地址加载到r2
    ldr     r1, [r2, r4, LSL #4]  @ 计算地址:r2 + r4*16,加载对应字符串的地址
    bl      printf

    @ 这里一定要加循环终止条件,不然会无限循环
    add     r4, r4, #1
    cmp     r4, #ARRAY_LENGTH  @ 替换ARRAY_LENGTH为你的数组实际长度
    blt     printInventory     @ 没到数组末尾就继续循环

方法二:提前计算基址并复用(可选优化)

如果循环次数多,可以把基址加载放到循环外面,减少重复操作:

@ 初始化部分,只执行一次
    mov     r4, #0              @ 计数器清零
    ldr     r0, =PrintLetter    @ 提前加载格式字符串地址
    ldr     r2, =FirstString    @ 提前加载数组基址

printInventory:
    ldr     r1, [r2, r4, LSL #4]
    bl      printf

    add     r4, r4, #1
    cmp     r4, #ARRAY_LENGTH
    blt     printInventory

关键注意点

  • 必须添加循环终止条件,比如用cmp对比计数器和数组长度,再用blt/bne等指令控制循环,否则会无限执行导致程序崩溃。
  • LSL #4就是左移4位,等价于乘以16,刚好对应你要的16字节间隔,这个部分的写法是对的。

内容的提问来源于stack exchange,提问作者Will A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:00:04