Я действительно не знаю, как выразить это словами, но я пытаюсь вызвать адрес функции, скажем, игру из моего кода C ++, но я не могу, так как игра будет просто бесплатной, потому что все регистры запутался, и игра не сохраняет свой первоначальный адрес оглавления, когда я вызываю эти функции из моего проекта C ++, извините, если это трудно понять, но я действительно не знаю, как выразить это словами: 3
Вот способ, которым я пользуюсь для вызова адресов в данный момент, но это не лучший способ, и он может быть довольно нестабильным и раздражающим время от времени …
void CallFunc(std::uint64_t nothing)
{
for(;;)
{
__asm(
"lis 3, 0x1002;""lwz 12, 0x4C(3);""cmpwi 12, 0;""beq end;"
/*save the general registers !*/
"mflr 0;""std 0, -0x520-0x10(1);""std 31, -0x520-0x18(1);""std 30, -0x520-0x20(1);""std 29, -0x520-0x28(1);""std 28, -0x520-0x30(1);""std 27, -0x520-0x38(1);""std 26, -0x520-0x40(1);""std 2, -0x520-0x48(1);"
/*emulate the TOC registers*/
"lis 2, 0xD6;""ori 2, 2, 0x7E98;""li 26, 0;""li 27, 0;""li 28, 0;""lis 29, 0xD5;""ori 29, 29, 0x3D88;""lis 30, 0xD014;""addic 30, 30, 0x7080;""li 31, 0;"
/*Loading args*/
"lwz 4, 0x4(3);""lwz 5, 0x8(3);""lwz 6, 0xC(3);""lwz 7, 0x10(3);""lwz 8, 0x14(3);""lwz 9, 0x18(3);""lwz 10, 0x1C(3);""lwz 11, 0x20(3);"
"lfs 1, 0x24(3);""lfs 2, 0x28(3);""lfs 3, 0x2C(3);""lfs 4, 0x30(3);""lfs 5, 0x34(3);""lfs 6, 0x38(3);""lfs 7, 0x3C(3);""lfs 8, 0x40(3);""lfs 9, 0x48(3);"
/*Calling*/
"lwz 3, 0(3);""mtctr 12;""bctrl;"
/*returns*/
"lis 4, 0x1002;""li 5, 0;""stw 5, 0x4C(4);""stw 3, 0x50(4);"
"ld 0, -0x520-0x10(1);""mtlr 0;""ld 26, -0x520-0x40(1);""ld 27, -0x520-0x38(1);""ld 28, -0x520-0x30(1);""ld 29, -0x520-0x28(1);""ld 30, -0x520-0x20(1);""ld 31, -0x520-0x18(1);""ld 2, -0x520-0x48(1);");
__asm("end:;");
sleep(1);
}
}
};
Любая помощь будет отличной!
Спасибо 🙂
Задача ещё не решена.