我正在尝试使用ARM程序集将一个字符串插入另一个字符串,但是我的代码总是会向调用程序集程序的C程序返回一个空字符串。我相信我已将我的问题缩小到STRB指令。以下是删除了大多数不相关代码的代码。要看的重要部分是“测试”块。
.global ins
ins:
stmfd sp!, {v1-v6, lr}
mov v1, a1 @ save pointer to 1st string
mov v2, a2 @ save pointer to 2nd string
bl strlen @ find out length
mov v3, a1 @ save string1 length
mov a1, v2 @ recover pointer to string 2
bl strlen @ length of string 2
add a1, a1, v3 @ total length
add a1, a1, #1 @ add one for null byte
bl malloc
add a3, a3, #1
test:
ldrb v3, [v1], #1
strb v3, [a1], #1
ldmfd sp!, {v1-v6, pc}
exit:
.end
v1和v2保存字符串1和2.当我将测试块写为:
时test:
ldrb v3, [v1], #1
strb v3, [a1], #1
ldmfd sp!, {v1-v6, pc}
然后程序返回一个空字符串。但是,如果我把它写成:
test:
ldrb v3, [v1], #1
strb v3, [a1]
ldmfd sp!, {v1-v6, pc}
它成功返回字符串1中的第一个字符。显然,这不足以构建一个新字符串,因为我没有在a1上执行偏移。
有谁知道导致字符串返回为空的原因是什么?老实说,经过几个小时的实验和研究,我不知道这个问题是什么。
非常感谢任何帮助!
答案 0 :(得分:1)
a1
中的值返回给调用汇编程序例程的C函数。您需要返回字符串开头的地址,但如果在写入字符串时增加a1
,则会返回字符串结尾的地址。
如果您使用其他寄存器存储您正在写入的当前地址,则返回时起始地址仍将在a1
。 e.g:
test:
mov v4, a1 @ copy address of new string to v4
ldrb v3, [v1], #1
strb v3, [v4], #1 @ increment v4, the start of string
@ will still be in a1
ldmfd sp!, {v1-v6, pc}