在 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/
我知道我在做一些愚蠢的事情,但我不知道是什么。函数 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/