ARM 中返回 char 与 char* 字符串的函数

问题描述 投票:0回答:1

我正在尝试模仿ARM中的这个函数来替换内存中的另一个函数:

const char* myName() {
  return "0";
}

此函数返回单个字符。我尝试过使用 GodBolt,但它使用伪指令,这让我对 LDR/LDRB 的工作原理感到困惑:GodBolt

我已经用谷歌搜索了很多,但大多数都使用 ASM,它又使用了大量伪指令。我还阅读了 ARM 网站上有关以下内容的所有文档:LDR/LDRB,它告诉我 LDR/LDRB 不能使用立即值,它需要地址(SP/PC 寻址)。

我尝试过“LDRB R0,#30”,但它似乎只适用于 Thumb。我能想到的解决方法是将#30(ASCII of 0)放入某个寄存器中,然后再次将其加载为LDRB:

MOV R1, #30
LDRB R0, [R1]
BX LR

我认为这是错误的,因为

[R1]
会被视为地址,而不是从中获取值
30
。我对解决这个问题的正确方法感到困惑。

assembly arm
1个回答
0
投票

您需要输入的代码如下所示:

myName: adr     r0, str  @ load the address of str into r0
        bx      lr       @ return to caller
str:    .string "0"

这是 12 字节的代码,可以放置在二进制文件中可以放置可执行代码的任何位置。字符串的放置与代码一致;该片段是可重定位的。

© www.soinside.com 2019 - 2024. All rights reserved.