@garik66 Я не совсем понимаю.
ret - это возврат из текущей функции к коду, который её вызвал. Место где я делаю call - это не функция. Просто место кода, где я делаю всякие свои штуки.
Намереваюсь вместе с ними при некоторых условиях (взведён debug_flag) сделать так, чтобы отработала функция, находящаяся по адресу после call.
Функция которую я хочу вызвать - SkipToTime
Terraria.Main::SkipToTime - push ebp
Terraria.Main::SkipToTime+1- mov ebp,esp
Terraria.Main::SkipToTime+3- push edi
Terraria.Main::SkipToTime+4- push esi
Terraria.Main::SkipToTime+5- sub esp,08
Terraria.Main::SkipToTime+8- xor eax,eax
Terraria.Main::SkipToTime+A- mov [ebp-0C],eax
Terraria.Main::SkipToTime+D- mov edi,ecx
Terraria.Main::SkipToTime+F- movzx esi,dl
Terraria.Main::SkipToTime+12- movzx eax,byte ptr [058C128D]
Terraria.Main::SkipToTime+19- cmp esi,eax
Terraria.Main::SkipToTime+1B- je Terraria.Main::SkipToTime+4E
Terraria.Main::SkipToTime+1D- call dword ptr [07F45530]
Terraria.Main::SkipToTime+23- mov [ebp-0C],eax
Terraria.Main::SkipToTime+26- cmp byte ptr [058C128D],00
Terraria.Main::SkipToTime+2D- je Terraria.Main::SkipToTime+3A
Terraria.Main::SkipToTime+2F- lea ecx,[ebp-0C]
Terraria.Main::SkipToTime+32- call dword ptr [07F4553C]
Terraria.Main::SkipToTime+38- jmp Terraria.Main::SkipToTime+43
Terraria.Main::SkipToTime+3A- lea ecx,[ebp-0C]
Terraria.Main::SkipToTime+3D- call dword ptr [07F45548]
Terraria.Main::SkipToTime+43- movzx eax,byte ptr [058C128D]
Terraria.Main::SkipToTime+4A- cmp esi,eax
Terraria.Main::SkipToTime+4C- jne Terraria.Main::SkipToTime+1D
Terraria.Main::SkipToTime+4E- mov [ebp-10],edi
Terraria.Main::SkipToTime+51- fild dword ptr [ebp-10]
Terraria.Main::SkipToTime+54- fstp qword ptr [058C0CE8]
Terraria.Main::SkipToTime+5A- cmp dword ptr [058C10B8],02
Terraria.Main::SkipToTime+61- jne Terraria.Main::SkipToTime+82
Terraria.Main::SkipToTime+63- push -01
Terraria.Main::SkipToTime+65- push 00
Terraria.Main::SkipToTime+67- push 00
Terraria.Main::SkipToTime+69- push 00
Terraria.Main::SkipToTime+6B- push 00
Terraria.Main::SkipToTime+6D- push 00
Terraria.Main::SkipToTime+6F- push 00
Terraria.Main::SkipToTime+71- push 00
Terraria.Main::SkipToTime+73- push 00
Terraria.Main::SkipToTime+75- mov ecx,00000007
Terraria.Main::SkipToTime+7A- lea edx,[ecx-08]
Terraria.Main::SkipToTime+7D- call Terraria.NetMessage::TrySendData
Terraria.Main::SkipToTime+82- lea esp,[ebp-08]
Terraria.Main::SkipToTime+85- pop esi
Terraria.Main::SkipToTime+86- pop edi
Terraria.Main::SkipToTime+87- pop ebp
Terraria.Main::SkipToTime+88- ret
ret в ней есть к слову
Чтобы понять как правильно её вызывать (у неё есть параметры)
Я проводил искал код её вызывающий и нашёл 4 похожих друг на друга класса
Каждый из которых отличается в коде только формированием регистров ECX и EDX (гипотеза моя в том, что ECX - первый параметр, а EDX - второй)
Не мудрствуя лукаво решил просто сделать вызов так, как это делает один из этих классов своим методом UsePower:
StartNightImmediately::UsePower - cmp dword ptr [058C10B8],01
StartNightImmediately::UsePower+7- jne StartNightImmediately::UsePower+A
StartNightImmediately::UsePower+9- ret
StartNightImmediately::UsePower+A- xor ecx,ecx
StartNightImmediately::UsePower+C- xor edx,edx
StartNightImmediately::UsePower+E- call Terraria.Main::SkipToTime
StartNightImmediately::UsePower+13- ret
StartNightImmediately::UsePower+14- add [eax],al
Т.е. такие 2 xor, затем call
Полагаю мой провал связан с тем, что помимо формирования корректного состояния регистров мне ещё нужно было озаботиться тем, чтобы также правильно сформировать стек. Всё дело в стеке? Может кто подсказать как изучить стек в момент перед вызовом call'а и как его повторить в своём коде?