【发布时间】: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 字符串返回到主程序中。
【问题讨论】:
-
r1和r0是否都是输入且相同?仅从代码来看,这有点令人困惑。 -
某种意义上,我正在尝试将位于 R0 中的数组的位置加载到 R1 中。我编辑了问题以提供更多详细信息。
-
ldr- 从 RAM 加载到寄存器中。str将寄存器内容存储到 RAM 中。
标签: arm gnu-assembler