STRB 工作,除非目标地址被转移

STRB works, unless target address gets shifted

我正在尝试使用 ARM 程序集将一个字符串插入另一个字符串,但是我的代码总是 return 向调用汇编程序的 C 程序发送一个空字符串。我相信我已经将我的问题缩小到 STRB 指令。下面是我的代码,删除了最不相关的代码。要查看的重要部分在 "test" 块中。

        .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}

然后程序 return 是一个空字符串。但是,如果我把它写成:

test:
        ldrb    v3, [v1], #1
        strb    v3, [a1]
        ldmfd   sp!, {v1-v6, pc}

它成功地 returns 字符串 1 中的第一个字符。显然,这不足以构建一个新字符串,因为我没有对 a1 执行偏移。

有谁知道是什么导致字符串被 return 编辑为空?老实说,经过几个小时的试验和研究,我不知道问题出在哪里。

非常感谢任何帮助!

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

如果您使用另一个寄存器来存储您正在写入的当前地址,那么当您 return 时,起始地址仍将在 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}