如何在ARM中使用字符串?

时间:2010-06-20 11:09:05

标签: c assembly arm

这是一个家庭作业问题。坦率地说,我不确定C程序如何将一个字符串参数传递给汇编级别。

我有功能

StringSearchInString( text, searchString);

和参数

text = "Hallo Alles klar"

searchString = "ll"

我知道ARM分别为文本searchString将参数传递到寄存器R0,R1中,但我不确定这对charactesr是如何工作的。如果每个字符的长度为8位,那么寄存器将被传入的字符串无情地宰杀。

我已经读过ARM APCS将参数转换为字,其中前4个字节存储在寄存器中,其余的以相反的顺序加载到堆栈中。

Sooo ......什么?我不明白这一点。字符串text将存储在R0中,前四个字节,“Hall”存储在R0中,其余字节以相反的顺序存储在堆栈中?我明白了吗?我怎么称呼他们?

TL; DR:如何将C-Program中的字符串参数传递给汇编语件,如何使用它来加载/加载/执行操作?

解答:

在远程情况下,任何人都在寻找解决方案,这里是:

正如Greg Hewgill所说,字符串作为指向字符串的指针传递。因此,R0中的值是字符串的地址。因此,您可以使用间接寻址来访问值,如下所示:

StringSearchInString( text, searchString ); // calls the ARM function...

//Going into the ARM function...

LDRB R4, [R0], #1 // Load the first value of R0 into R4 and skip 
                  // ahead one character(8 bits)
                  // Note the "B" in LDR. It indicates that you load ONLY 1 byte!
MOV R0, R4        // Move the value of R4 into R0. This destroys the pointer
                  // Stored in R0! Careful!

成功!如果你的字符串是像我一样的“hallo Alles klar”,你将把0x68加载到寄存器R0中。这是“h”的ASCII值。从这里你应该能够开始使用字符串。

2 个答案:

答案 0 :(得分:5)

简短的回答是,在C中,字符串作为指针传递给其他地方的字符数据。例如,R0可能包含值0x01000078,它将被解释为指向内存中"Hallo Alles klar"数据的指针,后跟一个空字符(00字节)..这不是ARM独有的。

答案 1 :(得分:-1)

它并不是真正地以“反向”顺序存储,只是寄存器以大字节序格式存储字节,而堆栈(即内存)以小字节序存储字节。不要将寄存器与内存混淆。至于堆栈的实际顺序,它可以是降序还是升序,具体取决于您对推入进行编码的方式。借助ARM,您可以定制堆栈框架以增大或减小。