我正在尝试用 C 和 ARM 编写一些自我修改的代码。我之前问过一个关于 MIPS 的类似问题,现在正试图将项目移植到 ARM。
我的系统 := 树莓派、ARMv6、GCC 上的 Raspbian
有几件事我不确定:
- ARM 是否需要 D 缓存回写/I 缓存无效(缓存刷新)?如果是这样,我们该怎么做?
我也尝试了一个例子
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int inc(int x){ //increments x
uint16_t *ret = malloc(2 * sizeof(uint16_t));
*(ret + 0) = 0x3001; //add r0 1 := r0 += 1
*(ret + 1) = 0x4770; //bx lr := jump back to inc()
int(*f)(int) = (int (*)(int)) ret;
return (*f)(x);
}
int main(){
printf("%d",inc(6)); //expect '7' to be printed
exit(0);}
但我不断收到分段错误。我正在使用 aapcs 调用约定,我已经明白这是所有 ARM 的默认设置
如果有人指出我正确的方向,我将不胜感激
额外的问题(意思是,它实际上不需要回答,但知道会很酷) - 我“来自 MIPS 背景”,ARM 程序员在没有 0 寄存器的情况下怎么做?(例如,硬编码为值 0 的寄存器)