这是一个家庭作业问题。坦率地说,我不确定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值。从这里你应该可以开始使用字符串了。
在您的答案部分,当您在第一个装配注释中说“并跳过” - 您的意思是后增量R0?如果你想后增加R0--如果你想遍历整个字符串,这是典型的 - 你会想要像“LDRB R4,[R0],#1”(由于它是单个字符增加1)。另外,当你将R4载入R0时,你是否意识到在你的下一条指令中你已经有效地破坏了(丢失)了你的字符串指针? – Dan 2010-06-20 14:32:35
跳过前面或多或少是指用户做任何他们想要做的事情之后。但是,是的,我意识到你需要你,并且我将R4插入到R0中,因为当我跳出汇编程序进入C时,答案被存储在寄存器R0中。然而,你是对的,这是一个相当不好的例子,我会改变它。 – IAE 2010-06-20 14:59:43
没问题,我只是想确保没有混淆。在课堂上玩得开心,当我在学校时,ARM还没有存在;-) – Dan 2010-06-20 15:04:39