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);}
ここでは、引数が $a0 に渡され、関数の結果が $v0 にあると想定される gcc 呼び出し規約に従います。戻りアドレスが $ra に入れられるかどうかは実際にはわかりません (ただし、コンパイルできないため、まだテストできません。MIPS32 をコンパイルしているため、命令には int を使用します (したがって、32 ビットの int十分なはずです)