如何解决在ARM GAS汇编器中反转字符串将返回NULL
我知道我在做一些愚蠢的事情,但是我不知道该怎么做。该函数返回一个空字符串,因此我不会复制每个字符。输入我的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,#-1
cmp r3,#0
bne string_copy /* move back for next character */
POP {ip,pc}
EDIT2:
好的,所以我进行了更改以尝试扩展所找到的值。我已经完成了所有步骤,似乎都在寄存器中,但是它没有存储到内存中的字符缓冲区中吗?我还是不明白我在做什么错。
reverse_string_func:
PUSH {ip,=input_string @ pointer to first string.
LDR r4,#0
mv2end: /* try to find the end of the string */
ldrb r2,[r1,r3]
add r3,#1
cmp r2,move on */
add r3,#-2 /* on terminator,move back past terminator,and line feed */
string_copy:
add r3,#-1
ldrb r2,r3]
strb r4,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字符串。
解决方法
第二次编辑时遇到的问题是STRB助记符,问题是我误解了存储的方向。正确的方法是:
strb r2,[r4,r5]
因为您要将寄存器R2的内容存储到R4中保存的内存位置,偏移量为R5。
希望这对以后再来的人有所帮助。这里有一个很好的教程:https://azeria-labs.com/memory-instructions-load-and-store-part-4/
,您将当前字符加载到r2
寄存器中(然后忽略它),而您似乎想要的是将该字符存储到r2
指向的字符串中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。