【问题标题】:Reversing String in ARM GAS Assembler returns NULL在 ARM GAS 汇编器中反转字符串返回 NULL
【发布时间】:2020-10-07 21:36:03
【问题描述】:

我知道我在做一些愚蠢的事情,但我不知道是什么。这些函数返回一个空字符串,所以我没有复制每个字符。进入我的 reverse_string_func 在 R0 中有输入字符串。示例我使用了 gas 似乎不支持的语法,因此我对其进行了修改,但它不起作用。我想一次移动一个字符数组。非常感谢您提供任何帮助,我已经盯着它看了很多次,我的代码盲了。

编辑: 输入字符串在传递给函数时位于 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}

就目前而言,这只是将一个 NULL 字符串返回到主程序中。

【问题讨论】:

  • r1r0 是否都是输入且相同?仅从代码来看,这有点令人困惑。
  • 某种意义上,我正在尝试将位于 R0 中的数组的位置加载到 R1 中。我编辑了问题以提供更多详细信息。
  • ldr - 从 RAM 加载到寄存器中。 str 将寄存器内容存储到 RAM 中。

标签: arm gnu-assembler


【解决方案1】:

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

strb r2, [r4, r5]

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

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

【讨论】:

    【解决方案2】:

    您将当前字符加载到r2 寄存器中(然后忽略它),而您似乎想要将该字符存储到r2 指向的字符串中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      相关资源
      最近更新 更多