gpt4 book ai didi

c - 如何在 ARM 中使用字符串?

转载 作者:太空狗 更新时间:2023-10-29 15:33:57 30 4
gpt4 key购买 nike

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

我有这个功能

StringSearchInString(text, searchString);

和参数

text = "Hallo Alles klar"

searchString = "ll"

我知道 ARM 将参数分别传递到寄存器 R0、R1 用于文本、searchString,但我不确定这如何与 charactesr 一起使用。如果每个字符的长度都是 8 位,那么寄存器将被传入的字符串无情地屠杀。

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

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

TL;DR:如何将字符串参数从 C 程序传递到汇编中,以及如何使用它工作/加载/做些什么?

回答:

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

正如 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 值。从这里您应该能够开始使用字符串。

最佳答案

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

关于c - 如何在 ARM 中使用字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3079000/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com