1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdint.h> 4 5 // -------------- 6 // Register Usage 7 // -------------- 8 // $0 zero 9 // $1 at 10 // $2-$3 function return value registers 11 // $4-$7 function argument registers 12 // $8-$15 temporary 13 // $16-$23 saved register 14 // $24-$25 temporary 15 // $26-$27 os kernel 16 // $28 global pointer 17 // $29 stack pointer 18 // $30 saved register 19 // $31 return addres reigster 20 21 // -------------------- 22 // Instruction Encoding 23 // -------------------- 24 // lui: 0011 1100 000t tttt iiii iiii iiii iiii 25 // ori: 0011 01ss ssst tttt iiii iiii iiii iiii 26 // jr: 0000 00ss sss0 0000 0000 0000 0000 1000 27 // nop: 0000 0000 0000 0000 0000 0000 0000 0000 28 29 uint32_t stub[] = { 30 0x3c190000ul, 31 0x37390000ul, 32 0x03200008ul, 33 0x00000000ul 34 }; 35 36 int test() { 37 printf("hello world!\n"); 38 return 5; 39 } 40 41 int main() { 42 int (*f)() = (int (*)())stub; 43 stub[0] |= (((uint32_t)(uintptr_t)test) >> 16) & 0xffff; 44 stub[1] |= (((uint32_t)(uintptr_t)test)) & 0xffff; 45 46 printf("return = %d\n", f()); 47 return EXIT_SUCCESS; 48 } 49