gpt4 book ai didi

c - STRB 有效,除非目标地址发生移位

转载 作者:行者123 更新时间:2023-11-30 15:22:13 25 4
gpt4 key购买 nike

我正在尝试使用 ARM 汇编将一个字符串插入另一个字符串,但是我的代码始终会向调用汇编程序的 C 程序返回一个空字符串。我相信我已经将问题范围缩小到了 STRB 指令。下面是我的代码,删除了大部分不相关的代码。要查看的重要部分是“测试” block 。

        .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。当我将测试 block 写为:

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 执行偏移。

有谁知道是什么导致字符串返回为空?老实说,经过几个小时的实验和研究后,我真的不知道问题是什么。

非常感谢任何帮助!

最佳答案

a1 中的值将返回到调用汇编程序例程的 C 函数。您需要返回字符串开头的地址,但如果在写入字符串时递增 a1,您将返回字符串结尾的地址。

如果您使用另一个寄存器来存储您正在写入的当前地址,那么当您返回时起始地址仍将位于 a1 中。例如:

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}

关于c - STRB 有效,除非目标地址发生移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29271250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com