我知道我在做傻事,但我不知道是什么。这些函数返回一个空字符串,所以我不会复制每个字符。输入到我的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}
EDIT2:
好了,我已经做了一些更改,尝试字符串我找到的值。我单步执行了所有操作,它们似乎都在寄存器中,但它没有存储到内存中的字符缓冲区中?我还是不明白我做错了什么。
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}
按照原样,这只是将一个空字符串返回到主程序中。
发布于 2020-10-08 15:38:57
您将当前字符加载到r2
寄存器(然后忽略它),而您需要的似乎是将该字符存储到r2
指向的字符串中。
发布于 2020-10-11 19:01:41
我在第二次编辑时遇到的问题是STRB助记符,问题是我误解了存储的方向。正确的方法是:
strb r2, [r4, r5]
因为您通过偏移量R5将寄存器R2的内容存储到R4中的内存位置。
希望这能帮助其他以后来这里的人。这里有一个很好的教程:https://azeria-labs.com/memory-instructions-load-and-store-part-4/
https://stackoverflow.com/questions/64252653
复制相似问题