ARM气体汇编器中的反转字符串返回NULL

ARM气体汇编器中的反转字符串返回NULL,arm,gnu-assembler,Arm,Gnu Assembler,我知道我在做傻事,但我不知道是什么。函数返回一个空字符串,因此我不会复制每个字符。进入我的反向\u字符串\u func的输入字符串为R0。我使用的示例语法gas似乎不支持,因此我对其进行了修改,但它不起作用。我想沿着char数组一次移动一个。非常感谢任何帮助,我已经盯着它看了很多次了,我都快看不见代码了 编辑: 当输入字符串传递给函数时,它处于R0状态。反向_字符串是一个填充了0的空缓冲区。我试图做的是将输入字符串的位置加载到R1中,在其中移动(同时加载到r3),直到找到终止的0,然后移动到复制

我知道我在做傻事,但我不知道是什么。函数返回一个空字符串,因此我不会复制每个字符。进入我的反向\u字符串\u func的输入字符串为R0。我使用的示例语法gas似乎不支持,因此我对其进行了修改,但它不起作用。我想沿着char数组一次移动一个。非常感谢任何帮助,我已经盯着它看了很多次了,我都快看不见代码了

编辑: 当输入字符串传递给函数时,它处于R0状态。反向_字符串是一个填充了0的空缓冲区。我试图做的是将输入字符串的位置加载到R1中,在其中移动(同时加载到r3),直到找到终止的0,然后移动到复制循环。在这里,我想将R3(字符串的末尾)的当前位置加载到R2(反向字符串)的第一个位置,然后从R3向后拉字符,并以相反的顺序将它们放回R2。我以为我用的是R2而不是忽略它

        ldr r2, [r0], r3 /* start at end of string */
        add r3, #-1
我想我正在把R0中数组中编号为R3的值推到R2中?这不是正在发生的事情吗

reverse_string_func:
        PUSH {ip, lr}
        LDR r1, =input_string           @ pointer to first string.
        LDR r2, =reverse_string         @ pointer to second string
        mov r3, #0
mv2end:  /* try to find the end of the string */
        ldr r1, [r1], #1
        add r3, #1
        cmp r1, #0
        bne mv2end
        /* found end of string, move on */
string_copy:
        ldr r2, [r0], r3 /* start at end of string */
        add r3, #-1
        cmp r3, #0
        bne string_copy /* move back for next character */

        POP {ip, pc}
编辑2:

好的,我已经做了一些更改,尝试str我正在查找的值。我已经一步一步地完成了所有的事情,它似乎都在寄存器中,但它没有被存储到内存中的字符缓冲区中吗?我还是不明白我做错了什么

reverse_string_func:
            PUSH {ip, lr}
        LDR r1, =input_string           @ pointer to first string.
        LDR r4, =reverse_string         @ pointer to second string
        mov r3, #0
mv2end:  /* try to find the end of the string */
        ldrb r2, [r1, r3]
        add r3, #1
        cmp r2, #0
        bne mv2end
        /* found end of string, move on */
        add r3, #-2 /* on terminator, move back past terminator, and line feed */
string_copy:
        add r3, #-1
        ldrb r2, [r1, r3]
        strb r4, [r1, r3] @ <--- I believe I'm going wrong here, but how?
        cmp r3, #0
        bne string_copy /* move back for next character */
        POP {ip, pc}

reverse\u string\u func:
推送{ip,lr}
LDR r1,=输入字符串@指向第一个字符串的指针。
LDR r4,=反向_字符串@指向第二个字符串的指针
mov r3#0
mv2end:/*尝试查找字符串的结尾*/
ldrb r2,[r1,r3]
加上r3,#1
cmp r2,#0
bne mv2end
/*找到字符串的结尾,继续*/
在终止符上添加r3、#-2/*并向后移动到终止符之后,然后换行*/
字符串\u副本:
加上r3,#-1
ldrb r2,[r1,r3]

strb r4,[r1,r3]@将当前字符加载到
r2
寄存器中(然后忽略它),虽然看起来您想要的是将该字符存储到由
r2

指向的字符串中,但我在第二次编辑时遇到的问题是STRB助记符,问题是我误解了存储方向。正确的方法是:

strb r2, [r4, r5]
因为您正在将寄存器R2的内容存储到R4中的内存位置,偏移量为R5


希望这能帮助以后来这里的其他人。这里有一个很好的教程:

是不是
r1
r0
都是输入,而且都是相同的?仅仅从代码来看有点混乱,我试图将数组的位置加载到R1中,数组的位置在R0中。我编辑了这个问题以提供更多细节。
ldr
-从RAM加载到寄存器
str
将寄存器内容存储到RAM中。