Wake of Gods Forum | Форум Во Имя Богов

Full Version: ERA II
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
baratorch Wrote:а че такое $3, и зачем перед еах - % ?
я какбэ и в msvs достаточно с асмом поработал и тут недавно masm32 и fasm скачал, попрактиковался. но процитированный код меня пугает.

Это Dev c++ и at&t ассемблер.
$3 - константа, % - потому что такой синтаксис, а самое кошмарное то, что в mov первый операнд записывается во второй, а не наоборот. Меня этот код тоже пугает, если честно. Sm
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
);
Понятно, спасибо.

А что означают __attribute__((naked)) и asm("new_luck") в объявлении функции?
__attribute__((naked)) это как в msvc++ __declspec(naked) ?
- очевидно означает объявление "голой" функции, то есть скомпилированная она будет без всяких такм push ebp mov ebp, esp ... вначале и ... retn в конце.

я вот вижу не только асм кривой в гсс... зочем такое извращение как двойные скобки после __attribute__?

кстати здесь на форуме отдельная тема по программированию есть, а то офф. пошел..

вопрос: без asm("new_luck") и ... "new_luck:
голая функция работать не будет что ли?
вообще я бы заменил

void SkipChecking()
{
   asm("mov $3, %eax");
   asm("mov %eax, 0x67F554");
}

на

void SkipChecking()
{
   *(DWORD*)0x67F554 = 3;
}

а используя и HOOKTYPE_BRIDGE можно решить в плагине абсолютно любую задачу, не используя ассемблер вообще.
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 требует каких-то дополнительных специальных телодвижений?
Для моста нужно:
Code:
__stdcall LONGBOOL Sav (PHookHandlerArgs Context)
{
  // Поменяем регистры:
  Context->EAX = 777;
  // Адрес возврата тоже сменим
  Context->RetAddr = 0;
  // Ну и выполним затёртый код, 0 - не выполнять
  return 1
}

Я в своё время понял, что лучше пустые лоды для случайных карт держать. Например, убирал проверки, а в меню просмотра случайных карт (список) шли вылеты на некорректных датах. Даты и сейчас там какие-то абсолютно стрёмные, но в случае нормальных лодов вылетов нет.
Насчёт моста понятно, спасибо.

Berserker Wrote:Я в своё время понял, что лучше пустые лоды для случайных карт держать. Например, убирал проверки, а в меню просмотра случайных карт (список) шли вылеты на некорректных датах. Даты и сейчас там какие-то абсолютно стрёмные, но в случае нормальных лодов вылетов нет.
Создал несколько случайных карт, ни разу не было вылета в списке (AB-ские lod`ы убрал и в коде вообще не подгружал), хотя даты действительно стрёмные. Эти вылеты непостоянно случались?
Постоянно. У меня даже есть патч, убирающий получение дат. Но раз у тебя не вылетает, то хорошо.
Последняя версия.
Всё работает без всех файлов AB: экзешника, lod`ов, snd, vid без дополнительных плагинов. Вылетов в списке случайных карт не замечено.

От lod`ов избавился просто: убрал их номера из таблиц подгрузки для версии 3. Это чисто теоретически не очень хорошо в плане совместимости, но совместимо со всем, что существует сейчас на том направлении. Sm Только если у кого-то такая кривая версия, что в H3ab_bmp.lod или H3ab_spr.lod хранятся файлы, которые необходимо подгрузить, с плагином у них вообще ничего не заработает, даже при наличии этих lod`ов (ибо их подгрузка в нём срезана практически начисто). Sm
Глянул Арсенал, код едва ли поддаётся изменениям. В Фениксе сделаем тогда DL-диалог, скорее всего.
Обновление: Эра 1.91
Размер: 169 KB.
Ссылка: MultiUpload
Описание:
Code:
[Era 1.91 - 30.08.2011]
+) Эра полностью поддерживает ert-строки в командах (z[>1000]).
+) Встроена поддержка карт любого размера для команды PO.
-) Не очищалась дополнительная память SN:M/W при старте карты.
А lod`ы теперь подгружаются после OnAfterWoG что ли?
Только сейчас обратил внимание, это вообще-то делает плагин lods (вернее ту его версию, которую я ещё не выкладывал Sm) несовместимым с автоподгрузкой, но я могу это обойти (и, скорее всего, это обойдётся автоматически, т. к. я собираюсь переносить таблицы в dll и расширять их для vid`ов).
Глянул в исходники Эры, понял, что прав.
В порядке изучения изученных внутренностей ВоГа сделал плагин, позволяющий загружать тексты из любых папок. Прописал путь к папке с текстом перевода игры в ини-файле и играй в переведённую игру, изменил расширение у плагина - играй с текстами, что в лодах или в Data.
http://zalil.ru/31657771
Reference URL's