我正在尝试模仿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
。我对解决这个问题的正确方法感到困惑。
您需要输入的代码如下所示:
myName: adr r0, str @ load the address of str into r0
bx lr @ return to caller
str: .string "0"
这是 12 字节的代码,可以放置在二进制文件中可以放置可执行代码的任何位置。字符串的放置与代码一致;该片段是可重定位的。