在 ARM GAS 汇编程序中反转字符串 returns NULL

Reversing String in ARM GAS Assembler returns NULL

我知道我在做一些愚蠢的事情,但我不知道是什么。函数 return 一个空字符串,所以我没有复制每个字符。进入我的 reverse_string_func 的输入字符串在 R0 中。这个例子我使用了 gas 似乎不支持的语法,所以我修改了它,但它不起作用。我想一次移动一个 char 数组。非常感谢任何帮助,我已经盯着它看太多次了,我都快看不懂代码了。

编辑: 输入字符串在传递给函数时位于 R0 中。 reverse_string 是一个用 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}

目前这只是return主程序中的一个 NULL 字符串。

您将当前字符加载到 r2 寄存器(然后忽略它),而看起来您想要的是将该字符存储到 r2.

指向的字符串中

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

strb r2, [r4, r5]

因为您要将寄存器 R2 的内容存储到 R4 中保存的内存位置,偏移量为 R5。

希望这对后来来到这里的其他人有所帮助。这里有一个很好的教程:https://azeria-labs.com/memory-instructions-load-and-store-part-4/