Sav
Posts: 2180
|
baratorch Wrote:а че такое $3, и зачем перед еах - % ?
я какбэ и в msvs достаточно с асмом поработал и тут недавно masm32 и fasm скачал, попрактиковался. но процитированный код меня пугает.
Это Dev c++ и at&t ассемблер.
$3 - константа, % - потому что такой синтаксис, а самое кошмарное то, что в mov первый операнд записывается во второй, а не наоборот. Меня этот код тоже пугает, если честно.
(This post was last modified: 29.08.2011 10:05 by Sav.)
|
|
29.08.2011 10:00 |
|
feanor
Posts: 624
|
Quote: с помощью __asm _emit и макросов в ms vc++ можно же реализовать любую недоступную инструкцию
проблема не в инструкциях, проблема в синтаксисе. АТ-шный отличается сильно.
Quote:Меня этот код тоже пугает, если честно.
дык.
Code:
int __attribute__((naked)) NewLuckCode() asm("new_luck");
asm
(
".intel_syntax noprefix\n" // use intel syntax
"new_luck: \n"
"xor eax, eax \n"
"mov ecx, edi \n"
"loop_1: \n"
"cmp dword ptr ds:[ecx], 0x2D \n"
"je calc_bonuses_1 \n"
"inc eax \n"
"add ecx, 0x8 \n"
"cmp eax, 0x13 \n"
"jl loop_1 \n"
"mov ecx, dword ptr ds:[0x660b68] \n"
"mov eax, dword ptr ds:[ecx+0x5D8] \n"
"cmp eax, -1 \n"
"je art_2 \n"
"lea edx, [eax*2+eax] \n"
"mov eax, dword ptr ds:[0x660B6C] \n"
"mov ecx, dword ptr ds:[edx*8+eax] \n"
"push ecx \n"
"mov ecx, esi \n"
"mov eax, 0x4d9460 \n"
"call eax \n"
"test al, al \n"
"je art_2 \n"
"calc_bonuses_1: \n"
"inc dword ptr ss:[ebp+0x0C] \n"
"art_2: \n"
"xor eax, eax \n"
"mov ecx, edi \n"
"loop_2: \n"
"cmp dword ptr ds:[ecx], 163 \n"
"je calc_bonuses_2 \n"
"inc eax \n"
"add ecx, 0x8 \n"
"cmp eax, 0x13 \n"
"jl loop_2 \n"
"mov ecx, dword ptr ds:[0x660b68] \n"
"mov eax, dword ptr ds:[ecx+0x5D8] \n"
"cmp eax, -1 \n"
"je art_3 \n"
"lea edx, [eax*2+eax] \n"
"mov eax, dword ptr ds:[0x660B6C] \n"
"mov ecx, dword ptr ds:[edx*8+eax] \n"
"push ecx \n"
"mov ecx, esi \n"
"mov eax, 0x4d9460 \n"
"call eax \n"
"test al, al \n"
"je art_3 \n"
"calc_bonuses_2: \n"
"add dword ptr ss:[ebp+0x0C],-2 \n"
"art_3:"
"ret_section: \n"
"mov eax, 0x4E3AC7 \n"
"jmp eax \n"
".att_syntax noprefix\n" // reset AT&T syntax or there will be errors
);
(This post was last modified: 29.08.2011 10:22 by feanor.)
|
|
29.08.2011 10:21 |
|
Sav
Posts: 2180
|
Понятно, спасибо.
А что означают __attribute__((naked)) и asm("new_luck") в объявлении функции?
|
|
29.08.2011 11:02 |
|
baratorch
Posts: 197
|
__attribute__((naked)) это как в msvc++ __declspec(naked) ?
- очевидно означает объявление "голой" функции, то есть скомпилированная она будет без всяких такм push ebp mov ebp, esp ... вначале и ... retn в конце.
я вот вижу не только асм кривой в гсс... зочем такое извращение как двойные скобки после __attribute__?
кстати здесь на форуме отдельная тема по программированию есть, а то офф. пошел..
вопрос: без asm("new_luck") и ... "new_luck:
голая функция работать не будет что ли?
|
|
29.08.2011 12:19 |
|
baratorch
Posts: 197
|
вообще я бы заменил
void SkipChecking()
{ asm("mov $3, %eax"); asm("mov %eax, 0x67F554");
}
на
void SkipChecking()
{ *(DWORD*)0x67F554 = 3;
}
а используя и HOOKTYPE_BRIDGE можно решить в плагине абсолютно любую задачу, не используя ассемблер вообще.
|
|
29.08.2011 13:34 |
|
Sav
Posts: 2180
|
baratorch Wrote:вопрос: без asm("new_luck") и ... "new_luck:
голая функция работать не будет что ли?
У меня не заработало.
baratorch Wrote:__attribute__((naked)) это как в msvc++ __declspec(naked) ?
- очевидно означает объявление "голой" функции, то есть скомпилированная она будет без всяких такм push ebp mov ebp, esp ... вначале и ... retn в конце.
У меня одинаково заработало и __attribute__((naked)), и __declspec(naked) (причём компилятор обычно выдавал warning`и, что nacked проигнорировано, но всё было нормально).
baratorch Wrote:void SkipChecking()
{ *(DWORD*)0x67F554 = 3;
}
Да, пожалуй, в данном случае лучше без ассемблера.
Вот обновлённая (UPD: и ещё раз обновлённая) версия. Как оказалось, прошлая избавляла от необходимости существования только экзешника AB: lod`ы, snd и vid считались существующими и должны были быть открыты (иначе - ошибка). С snd и vid-файлами я разобрался (вместо ошибки просто пропускаю открытие), а с lod`ами всё сложнее. Но, с другой стороны, если подгружать только конкретные lod`ы (например с плагином lods через параметры), ошибки с lod`ами и не будет.
Кстати, если в исходнике HOOKTYPE_CALL заменить на HOOKTYPE_BRIDGE (только это одно изменение), работать это не будет. Bridge требует каких-то дополнительных специальных телодвижений?
(This post was last modified: 30.08.2011 19:13 by Sav.)
|
|
29.08.2011 19:05 |
|
Berserker
Posts: 16627
|
Для моста нужно:
Code:
__stdcall LONGBOOL Sav (PHookHandlerArgs Context)
{
// Поменяем регистры:
Context->EAX = 777;
// Адрес возврата тоже сменим
Context->RetAddr = 0;
// Ну и выполним затёртый код, 0 - не выполнять
return 1
}
Я в своё время понял, что лучше пустые лоды для случайных карт держать. Например, убирал проверки, а в меню просмотра случайных карт (список) шли вылеты на некорректных датах. Даты и сейчас там какие-то абсолютно стрёмные, но в случае нормальных лодов вылетов нет.
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
29.08.2011 21:18 |
|
Sav
Posts: 2180
|
Насчёт моста понятно, спасибо.
Berserker Wrote:Я в своё время понял, что лучше пустые лоды для случайных карт держать. Например, убирал проверки, а в меню просмотра случайных карт (список) шли вылеты на некорректных датах. Даты и сейчас там какие-то абсолютно стрёмные, но в случае нормальных лодов вылетов нет.
Создал несколько случайных карт, ни разу не было вылета в списке (AB-ские lod`ы убрал и в коде вообще не подгружал), хотя даты действительно стрёмные. Эти вылеты непостоянно случались?
(This post was last modified: 30.08.2011 00:10 by Sav.)
|
|
30.08.2011 00:10 |
|
Berserker
Posts: 16627
|
|
30.08.2011 00:17 |
|
Sav
Posts: 2180
|
Последняя версия.
Всё работает без всех файлов AB: экзешника, lod`ов, snd, vid без дополнительных плагинов. Вылетов в списке случайных карт не замечено.
От lod`ов избавился просто: убрал их номера из таблиц подгрузки для версии 3. Это чисто теоретически не очень хорошо в плане совместимости, но совместимо со всем, что существует сейчас на том направлении. Только если у кого-то такая кривая версия, что в H3ab_bmp.lod или H3ab_spr.lod хранятся файлы, которые необходимо подгрузить, с плагином у них вообще ничего не заработает, даже при наличии этих lod`ов (ибо их подгрузка в нём срезана практически начисто).
(This post was last modified: 20.09.2011 23:35 by Sav.)
|
|
30.08.2011 19:25 |
|
Berserker
Posts: 16627
|
|
30.08.2011 21:23 |
|
Berserker
Posts: 16627
|
|
30.08.2011 21:33 |
|
Sav
Posts: 2180
|
А lod`ы теперь подгружаются после OnAfterWoG что ли?
Только сейчас обратил внимание, это вообще-то делает плагин lods (вернее ту его версию, которую я ещё не выкладывал ) несовместимым с автоподгрузкой, но я могу это обойти (и, скорее всего, это обойдётся автоматически, т. к. я собираюсь переносить таблицы в dll и расширять их для vid`ов).
(This post was last modified: 31.08.2011 22:01 by Sav.)
|
|
31.08.2011 21:56 |
|
Sav
Posts: 2180
|
Глянул в исходники Эры, понял, что прав.
(This post was last modified: 01.09.2011 21:04 by Sav.)
|
|
01.09.2011 21:04 |
|
etoprostoya
Posts: 1809
|
В порядке изучения изученных внутренностей ВоГа сделал плагин, позволяющий загружать тексты из любых папок. Прописал путь к папке с текстом перевода игры в ини-файле и играй в переведённую игру, изменил расширение у плагина - играй с текстами, что в лодах или в Data.
http://zalil.ru/31657771
|
|
06.09.2011 20:12 |
|