2010-06-20 141 views
4

这是一个家庭作业问题。坦率地说,我不确定C程序如何为汇编级别提供字符串参数。如何在ARM中使用字符串?

我具备的功能

StringSearchInString(text, searchString);

和参数

text = "Hallo Alles klar"

searchString = "ll"

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

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

Sooo ...什么?我不理解这一点。字符串text将存储在R0中,前四个字节中,“霍尔”存储在R0中,剩下的顺序与堆栈中的顺序相反?我理解对吗?我如何给他们打电话?

TL; DR:如何将一个字符串参数从一个C程序传递到程序集中,以及如何处理/加载/执行一些东西?

答:

在远程情况下,任何人都在寻找解决这个问题,以及,那就是:

由于格雷格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值。从这里你应该可以开始使用字符串了。

+0

在您的答案部分,当您在第一个装配注释中说“并跳过” - 您的意思是后增量R0?如果你想后增加R0--如果你想遍历整个字符串,这是典型的 - 你会想要像“LDRB R4,[R0],#1”(由于它是单个字符增加1)。另外,当你将R4载入R0时,你是否意识到在你的下一条指令中你已经有效地破坏了(丢失)了你的字符串指针? – Dan 2010-06-20 14:32:35

+0

跳过前面或多或少是指用户做任何他们想要做的事情之后。但是,是的,我意识到你需要你,并且我将R4插入到R0中,因为当我跳出汇编程序进入C时,答案被存储在寄存器R0中。然而,你是对的,这是一个相当不好的例子,我会改变它。 – IAE 2010-06-20 14:59:43

+0

没问题,我只是想确保没有混淆。在课堂上玩得开心,当我在学校时,ARM还没有存在;-) – Dan 2010-06-20 15:04:39

回答

5

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

+0

想象一下,但我该如何使用它?我尝试加载寄存器,这是没有道理的。我试着用'ADR'指向它。但编译器抱怨。所以我不确定还有什么要做。 – IAE 2010-06-20 11:16:43

+2

@SoulBeaver:恐怕我的ARM程序集很生锈,因为几年前我只用了它,但通常你会将指针加载到寄存器中,然后使用间接寻址模式来读取内存中的实际字符(通常是一次一个)。 – 2010-06-20 11:22:47

+0

谢谢!凭借你的小洞见,我能够弄清楚该怎么做。希望其余的应该是一件轻而易举的事!更新了我的问题,并让我提出了我的建议,至今只有答案。 – IAE 2010-06-20 11:48:21

相关问题