C.E*_*lly 5 c assembly jit arm raspberry-pi
我正在尝试用 C 和 ARM 编写一些自我修改代码。我之前问过一个关于 MIPS的类似问题,现在我正在尝试将该项目移植到 ARM。
我的系统:= Raspbian on raspberry pi、ARMv6、GCC
有几件事我不确定:
我也试过一个例子
#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);}
Run Code Online (Sandbox Code Playgroud)
但我不断收到分段错误。我正在使用 aapcs 调用约定,我已经了解到这是所有 ARM 的默认设置
如果有人指出我正确的方向,我将非常感激
额外的问题(意思是,它实际上并不需要回答,但知道它会很酷)-我“来自 MIPS 背景”,ARM 程序员在没有 0 寄存器的情况下怎么办?(例如,硬编码为值 0 的寄存器)
阅读上的缓存和自修改代码blogs.arm.com。文章还包括一个示例,它可以完成您所描述的操作。
回答您文章中的问题
...ARM 架构通常被认为是改进的哈佛架构。...
纯哈佛架构的典型缺点是指令存储器无法从与数据存储器相同的地址空间直接访问,尽管此限制不适用于 ARM。在 ARM 上,您可以将指令写入内存,但由于 D 缓存和 I 缓存不一致,新写入的指令可能会被 I 缓存的现有内容屏蔽,导致处理器执行旧的(或可能无效)说明。
请参阅__clear_cache了解如何使缓存无效。
如果您打算将指令推入内存,我希望您也了解 ARM/Thumb 指令集。