STRB有效,除非目标地址被移位

时间:2015-03-26 04:43:15

标签: c assembly arm byte

我正在尝试使用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上执行偏移。

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

非常感谢任何帮助!

1 个答案:

答案 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}