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
相关产品推荐
相关产品推荐

