我正在尝试用 C 和 MIPS 编写一些自我修改的代码。
由于我想稍后修改代码,因此我正在尝试编写实际的机器指令(而不是内联汇编)并尝试执行这些指令。有人告诉我,可以只 malloc 一些内存,在那里写指令,将 C 函数指针指向它,然后跳转到它。(我包括下面的例子)
我已经用我的交叉编译器(sourcery codebench 工具链)尝试了这个,但它不起作用(是的,事后看来,我认为它确实看起来很幼稚)。我怎么能正确地做到这一点?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void inc(){
int i = 41;
uint32_t *addone = malloc(sizeof(*addone) * 2); //we malloc space for our asm function
*(addone) = 0x20820001; // this is addi $v0 $a0 1, which adds one to our arg (gcc calling con)
*(addone + 1) = 0x23e00000; //this is jr $ra
int (*f)(int x) = addone; //our function pointer
i = (*f)(i);
printf("%d",i);
}
int main(){
inc();
exit(0);}
我在这里遵循 gcc 调用约定,其中参数传递给 $a0,并且函数的结果预计在 $v0 中。我实际上不知道返回地址是否会被放入 $ra (但我无法测试它,因为我无法编译。我使用 int 作为我的指令,因为我正在编译 MIPS32(因此是 32 位 int应该够了)