Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » X2-ASM - это проcто! | страница 11
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 11 из 12
На страницу: Пред.  1, 2, 3 ... , 10, 11, 12  След.    Перейти:   Все страницы
Поиск в этой теме:
Канал X2: The Threat: «X2-ASM - это проcто!»
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Hvala Mne :
3 уровень у любого, кто зарегестрируется на форуме ES. Если ты зарегистрируешься, будет 3-й уровень у тебя.

Да я как-то пытался, правда давно это было. Что-то ни ответа, ни привета от них не дождался. Может настойчивости не хватило Улыбка

Hvala Mne :
Кстати ES немцы, а не американцы, так что твой корреспондент не знает об ES ничего.

Я в курсе. Улыбка Это девелопер, который написал этот "warning", был амереканцем. Вроде как от официальной позиции ES. Но это все ерунда, конечно, я согласен.

Hvala Mne :
Что утечек не было, я знаю. Подмигиваю

Ну, это хорошо, это понятно. А вот ES-то почему такими вопросами озадачилась - на счет утечек? Или так, на всякий случай? Как я понял, это было главное, на что настаивал Лехан в разговоре... А все остальное - как бы "ну если что-то у вас там и получится - так и ладно, мы посмотрим ну и может быть воспользуемся.., а может и нет.." Улыбка

А что Лехан еще-то говорил. Колись. Интересно же. Может уже Х4 делают... Улыбка

PS: Хвала, скажи по-секрету, у тебя там какой левел? Улыбка Хы...
    Добавлено: 14:29 27-04-2007   
Hvala Mne
 880 EGP


Рейтинг канала: 1(3)
Репутация: 184
Сообщения: 1380
Откуда: где-то меж звезд
Зарегистрирован: 08.02.2001
CheckerTwo :
Hvala Mne :
3 уровень у любого, кто зарегестрируется на форуме ES. Если ты зарегистрируешься, будет 3-й уровень у тебя.

Да я как-то пытался, правда давно это было. Что-то ни ответа, ни привета от них не дождался. Может настойчивости не хватило Улыбка


Какой в смысле настойчивости? Заполняешь форму, получаешь e-mail с паролем. На 3 уровне, вроде, была документация по КС и база с квестами.

CheckerTwo :

Hvala Mne :
Что утечек не было, я знаю. Подмигиваю

Ну, это хорошо, это понятно. А вот ES-то почему такими вопросами озадачилась - на счет утечек? Или так, на всякий случай? Как я понял, это было главное, на что настаивал Лехан в разговоре... А все остальное - как бы "ну если что-то у вас там и получится - так и ладно, мы посмотрим ну и может быть воспользуемся.., а может и нет.." Улыбка

А что Лехан еще-то говорил. Колись. Интересно же. Может уже Х4 делают... Улыбка

PS: Хвала, скажи по-секрету, у тебя там какой левел? Улыбка Хы...


У меня 5-й. Был 6-й. Сбавили из-за "утечек". Может, это именно для меня и был намек.
_________________
скромный подданный Королевства Боронов
    Добавлено: 22:57 28-04-2007   
SD
 251 EGP


Рейтинг канала: 2(21)
Репутация: 30
Сообщения: 2400

Зарегистрирован: 05.03.2006
Пятый уровень, говоришь... Ну хорошо, давай проверим степень их открытости для зарегистрированных разработчиков. Найди, пожалуйста (я не говорю - "опубликуй") на их сайте такие веши как:
    спецификации на функции SE_FreeText(), X2Save(4 параметра);
    подробное описание работы команды START {};
    список кодов клавиатуры, передаваемыx в методы T*.Input()
    Добавлено: 06:52 03-05-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :
Какие нужны настройки и последовательность действий, чтобы "провернуть" туда и обратно?

Чуть выше по теме я предлагал один способ, позволяющий получить асм, который можно будет править. Посмотри. Улыбка
    Добавлено: 12:11 20-05-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :
Darth Revan :
Все exe-функции можно посмотрете в самом exe в X2 и X3 патчей 2.0.x (защиту сняли).


Во, об этом и речь! Как и чем (какой нужен софт, где его взять) можно это посмотреть в файле x3.exe? (не в блокноте же Гы-гы).
Может у кого есть готовый список всех ехе-функций из экзешника версии 2.0.02?

Есть 2 варианта: первый - действительно в блокноте Улыбка Потому как имена этих функций присутствуют в EXE в текстовом виде. Второй вариант - это файл (сгенеренный dobj.exe) с расширением .def. В самом начале этого файла выводится список функций, используемых в obj-скрипте.

Цитата:
Осталось два вопроса:

1. Где взять список ехе-функций? Или расскажите, чем расковырять экзешник (а еще лучше - выложить где-нить расковырянную версию, так как там кроме ехе-функций есть еще очень много интересного).


Информация по функциям (что делают, что возвращают, какие параметры и какого типа) фактически отсутствует. Для некоторых, часто используемых в obj-скриптах, можно догадаться из контекста.

Цитата:
2. Повторная декомпиляция патченых обжей невозможна? Имеется в виду - для трансляции в хс и повторной компиляции.

Возможна. В большинстве случаев - без проблем.

Цитата:
Как dobj, так и xa2c, матюкаются и отказываются работать с ними.
dobj выдаёт такие ошибки:

Error : "Warn : xjump : npar =1 <> epar 19"
Error : "Warn : xjump : npar =163 <> epar 1368"
Error : "The stack has incorrect value on instruction at address = 001186E6; stack =18."

Первые 2 ошибки - это dobj не смог правильно расчитать размер таблицы переходов по коду, который стоит перед командой xjump. Поиск размера этой таблицы заточен на код компилятора КС by Egosoft, с его косяками в кодогенераторе. Если писать код ручками, то в некоторых случаях dobj ругается, хотя сам код рабочий. Увы.
Третья ошибка - это уже смотреть надо. Выдается трассировщиком кода. Т.е. dobj пытается прогнать код функции на упрощенной виртуальной машине и исполняет каждую команду, проверяя состояние стека. При достижении команды ret выполняется проверка указателя стека. Если в стеке остаются какие-то данные или наоборот, вытолкнуто из стека слишком много - dobj ругается. В реале это приведет, скорее всего, к вылету игрухи...

Цитата:
а ха2с не может обнаружить новые функции, которые были добавлены патчем, говорит "фатал еррор, код функций не сгенерирован".

М-м-м.. Тут начальник нужен!
Улыбка
    Добавлено: 11:20 25-05-2007   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31382

Зарегистрирован: 26.10.2003
CheckerTwo :
Возможна. В большинстве случаев - без проблем.


А по факту - как раз проблемы Расстроен Пробовал на почти всех патчах от Шадди и Дарт Ревана - всегда добж сыплет ошибки.
Если нужно - пиши адрес в личку - пришлю последний патчик для х3 для тестов.

CheckerTwo :
Третья ошибка - это уже смотреть надо.


Я посмотрел, только не понял ничего Озадачен
Сравнивал с оригинальным обжем той же версии - такое ощущение, что при асемблировании патча метки выставились от балды, а не там где должны были быть, в результате получились непредсказуемые последствия.

Кусок патченного обжа после работы dobj:
Цитата:

001186AE: 002B 0053 | 1 write TMENU_WEAPONS.mew_Turret ; [83d ; 53h]
001186B2: 002C | 1 pop
001186B4: 0009 | 0 push 0
001186B6: 002B 0054 | 1 write TMENU_WEAPONS.mew_Slot ; [84d ; 54h]
001186BA: 002C | 1 pop
001186BC: 0001 FFFE | 0 push -2d ; 0FFFEh
001186C0: 002B 0055 | 1 write TMENU_WEAPONS.mew_CurSel ; [85d ; 55h]
001186C4: 002C | 1 pop
001186C6: 0009 | 0 push 0
001186C8: 003C | 1 get_object
001186CA: 0057 0000AC5A | 2 call TMENU_WEAPONS.GetLaserArray ; 0000AC5A
001186D0: 002B 0052 | 19 L001186D0: write TMENU_WEAPONS.mew_LaserList ; [82d ; 52h]
001186D4: 002C | 19 pop
001186D6: 0009 | 18 push 0
001186D8: 0001 08A2 | 19 push 2210d ; 08A2h
001186DC: 0057 0000A2F6 | 20 call TMENU_ID.SpecialMenu ; 0000A2F6
001186E2: 002C | 19 pop
001186E4: 0009 | 18 push 0
001186E6: 0035 | 19 ret
;Error: function at addr = 001186E6 has corrupted stack (18).


А вот это в оригинальном обже:

Цитата:

001186AE: 002B 0053 | 1 write TMENU_WEAPONS.mew_Turret ; [83d ; 53h]
001186B2: 002C | 1 pop
001186B4: 0009 | 0 push 0
001186B6: 002B 0054 | 1 write TMENU_WEAPONS.mew_Slot ; [84d ; 54h]
001186BA: 002C | 1 pop
001186BC: 0001 FFFE | 0 push -2d ; 0FFFEh
001186C0: 002B 0055 | 1 write TMENU_WEAPONS.mew_CurSel ; [85d ; 55h]
001186C4: 002C | 1 pop
001186C6: 0009 | 0 push 0
001186C8: 003C | 1 get_object
001186CA: 0057 0000AC5A | 2 call TMENU_WEAPONS.GetLaserArray ; 0000AC5A
001186D0: 002B 0052 | 1 write TMENU_WEAPONS.mew_LaserList ; [82d ; 52h]
001186D4: 002C | 1 pop
001186D6: 0009 | 0 push 0
001186D8: 0001 08A2 | 1 push 2210d ; 08A2h
001186DC: 0057 0000A2F6 | 2 call TMENU_ID.SpecialMenu ; 0000A2F6
001186E2: 002C | 1 pop
001186E4: 0009 | 0 push 0
001186E6: 0035 | 1 ret


Здесь метки нету и результаты другие.

CheckerTwo :
М-м-м.. Тут начальник нужен!


И тебе занятие найдётся Гы-гы

Последний раз редактировалось: AlexYar (17:34 27-05-2007), всего редактировалось 1 раз
    Добавлено: 13:29 25-05-2007   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31382

Зарегистрирован: 26.10.2003
Касаемо этой ошибки дальше копнул. Вот листинг данных кусков (оригинал и патченый) на хс.

Оригинал:

function TMENU_WEAPONS.SpecialMenu()
{
TMENU.me_Title=SE_ReadText(35,831);
TMENU.me_TopLineInfo=0;
TMENU.me_PageLinesInfo=3;
TMENU.me_TopLineSelect=4;
TMENU.me_PageLinesSelect=(TMENU.me_VirtualTexHeight-49)/TMENU.me_YSpacing-4;
TMENU_WEAPONS.mew_Turret=0;
TMENU_WEAPONS.mew_Slot=0;
TMENU_WEAPONS.mew_CurSel=-2;
TMENU_WEAPONS.mew_LaserList=this->GetLaserArray();
2210->SpecialMenu();
return(0);
}

А вот после патча значение xa2c определить не смог, на что ругнулся:
"Error: function TMENU_WEAPONS.SpecialMenu(): Cound'n find value in stack for argument. Substituted by '?^."

И выдал такое:

function TMENU_WEAPONS.SpecialMenu()
{
TMENU.me_Title=SE_ReadText(35,831);
TMENU.me_TopLineInfo=0;
TMENU.me_PageLinesInfo=3;
TMENU.me_TopLineSelect=4;
TMENU.me_PageLinesSelect=(TMENU.me_VirtualTexHeight-49)/TMENU.me_YSpacing-4;
TMENU_WEAPONS.mew_Turret=0;
TMENU_WEAPONS.mew_Slot=0;
TMENU_WEAPONS.mew_CurSel=-2;
{
var loc19=this->GetLaserArray();
}

TMENU_WEAPONS.mew_LaserList=???;
2210->SpecialMenu();
return(0);
}


В чём может быть причина? Откуда "фантом" (синий) появился?
    Добавлено: 14:31 25-05-2007   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31382

Зарегистрирован: 26.10.2003
Цитата:
case 339:
CM0438_00: (arg1:22, arg2:23, loc1:18, loc2:17, loc6:13, loc7:12, loc16:3, loc17:2, loc18:1, loc19:0)
{
бла-бла-бла...
break;
}
case 340:



А чем чревато такое написание на xc? Есть какие-нибудь возможные негативные последствия, или это вполне нормальное написание?
(транслятор не ругается, асемблер тоже, игра не вылетает, команда работает).

Кто-нить может перевести на "русский", что означает (как читается) вторая строка (CM0428_00:...) ? В теме по транслятору описано крайне туманно, чтобы можно было что-то понять Расстроен


Вопрос2: Как сделать патч так, чтобы можно было переопределять имеющиеся в обже функции? Метод, описанный Реваном, нерабочий (ассемблер валится с ошибкой). (еще бы он не валился, если удаляются объявления и код функций, на которые ссылаются другие функции в обже...).

Вопрос3: Что будет, если поверх перекомпилированного обжа накатить патч, внутри которого изменённая копия функции, уже имеющейся в игре?
Т.е. если я буду функцию править не в обжем обже, а только в патче, а потом накатывать на обж. Что будет происходить, куда будет писаться новая версия функции, а если её размер больше, чем был у стандартной функции?
Или патч просто допишется в конец обжа и изменится точка входа на новую версию функции?

ХС не ругается, ХА_ASM - тоже не ругается, но как я уже понял - это не залог того, что всё ок Гы-гы
    Добавлено: 18:35 28-05-2007   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31382

Зарегистрирован: 26.10.2003
CheckerTwo :
AlexYar :
2. Повторная декомпиляция патченых обжей невозможна? Имеется в виду - для трансляции в хс и повторной компиляции.


Возможна. В большинстве случаев - без проблем.


Зато повторная декомпиляция перекомпелированных обжей - невозможна вообще Улыбка

CheckerTwo :
это dobj не смог правильно расчитать размер таблицы переходов по коду, который стоит перед командой xjump. Поиск размера этой таблицы заточен на код компилятора КС by Egosoft, с его косяками в кодогенераторе. Если писать код ручками, то в некоторых случаях dobj ругается, хотя сам код рабочий.


Пока по нему опять не пройтись добжем...

Тогда валится гора ошибок, а дизасемблированный файл оказывается битым (нерабочим). И соот-но xa2c.exe тоже говорит, что переходы кривые и что половину функций сгенерировать не удалось Расстроен

Причем что странно - вся "нерабочесть" переходов касается исключительно функций классов TObj* и TQuest*, и больше никаких!

Что наводит на мысль, что косяк где-то на "нашей" стороне Подозрение.

зыж А может это типа "защиты" от Егософта, чтобы в код ежей не подглядывали? Гы-гы
    Добавлено: 20:12 28-05-2007   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31382

Зарегистрирован: 26.10.2003
AlexYar :
Причем что странно - вся "нерабочесть" переходов касается исключительно функций классов TObj* и TQuest*, и больше никаких!


Уточняю - нерабочесть касается абсолютно всех функций, в которых есть конструкции switch-case. Все эти функции просто убиваются, и xa2c их не генерит.
    Добавлено: 01:20 31-05-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :
CheckerTwo :
В текущий момент есть только одно соображение: большинство патчей заточено на определенные адреса в коде. После работы дизассемблера/ассемблера адреса могут измениться. Это связано с тем, что ассемблер может вставлять более короткие команды вместо длинных, например для push sp[0]. После этого, если патч завязан на адреса и в нем есть конструкции вида
$ = const
.. cod ...
то возможны переналожения и вообще не предсказуемый результат.

Дык сделал бы отключение этой фишки в ассемблере, чтобы стандартно "по егософтски" код генерил

Сделать сие сейчас весьма затруднительно. Код, генерируемый КС формируется из "заготовок". В некоторых случаях вставляется один вид команды push sp[0], в других другой, вперемежку. Команды функционально эквиволентны, но имеют разную длину. После длительных дебатов решили, что пусть дизассемблер обзывает их одной командой - push. Ассемблер вставляет короткий вариант, для оптимизации, или длинный, для отладки и тестирования - если в ini-файле стоит OptPush = false. А вот так, что бы как у Egosofta - надо переделывать dobj/xasm и переобзывать варианты этих команд.

AlexYar :
В добже настройка "XJUMP = On" не работает.

Почему не работает? Если Off - генерится switch/case jump, если On - xjump @sp + таблица переходов. В ассемблере, кажется, убрал команду switch из-за невозможности нормально написать даже простенький патчик, кроме того, эта конструкция в патчах Shaddie приводила к фатальной ошибке - парсеру внутреннего стека не хватало. Ой, не могу!..

AlexYar :

А шаги простые -
1. накатываю патч Шадди на оригинальный обж.
2. Декомпилю обж добжем (ошибки х-джампа и косяк со стеком, но его причина может быть в патче).
3. xa2c - транслирует в хс не полностью.

Угу. Так и должно быть. Проблема проста оригинальные obj-файлы содержат кучу ошибок, которые не позволяют просто так перетранслировать их. Как следствие, дизассемблированный оригинальный файл с трудом понимает транслятор. Патч Shaddie предназначен для оригинального obj-а и жестко завязан на адреса функций/переходов. Он не устраняет косяки Egosoft-а. Как следствие после дизассемблирования число косяков никак не должно изменится, потому как Shaddie вроде как на несколько раз все проверял...
Но! Косяки будут..

AlexYar :
Путь второй (с перекомпиляцией).
1. Беру оригинальный обж.
2. Добжу.
3. Транслирую xa2c x3story addx3.txt (заглушка ставится автоматом).
4. Транслирую обратно xc x3story.cpp
5. Асмлю xa_asm x3story.inc
6. Всё ок, ошибок нет, х3 не вылетает вроде (новую игру начинал).

Что за заглушка? Что там? Она исправляет косяки EgoSoft-а? Честно скажу, я этот патчик не смотрел - машинка слабенькая и Х3 идет - как будто диафильмы просматриваешь... Улыбка
AlexYar :

7. Добжу перекомпиленный обж (140 с лишним килобайт ошибок, все с работой х-джампа).
8. Пытаюсь транслировать xa2c - куча ошибок, половина функций не сгенерирована. В основном это TQUEST{цифра}(TObj{цифра}) - функции или наоборот TObj{цифра}(TQUEST{цифра}) - функции, других в ошибках xa2c не видел (плохо, что он в лог ошибки не сбрасывает, а на экране хрен чего найдёшь конекретного).

dobj хоть и ругается на xjump, когда встречает непонятный ему код, все же редко ошибается. Алгоритм там такой: когда встретилась команда xjump, просматривается код, который стоит перед этой командой. Делаются примерные выводы о размере таблицы переходов. Для Х2 и Х3 размеры этих таблиц отличаются (в большинстве случаев) в 2 раза. Это старый косяк КС, исправленный в Х3. После этого таблица переходов тщательно проверяется, что бы все переходы указывали на рабочий код. Вот если "вычесленный" размер таблицы не соответствует размеру оттрассированной таблице, вот тогда dobj выводит это предупреждение. В общем случае на него можно не обращать внимания. Это касается сообщений вроде "Warn : xjump : npar =1 <> epar 18". Это все проходит только в случае, если дизассемблировать стандартные файлы. Для патчей Shaddie и Darth Revan-а есть своя особенность Улыбка Из-за отличия файлов Х2 и Х3, по коду, предшествующему xjump, невозможно 100% прогнозировать размер таблицы переходов. Поэтому дополнительно просматриваются все команды jump, окружающие эту таблицу. Не очень оптимальный вариант решения, но в голову ничего умного не пришло... Так вот для ручных патчей это все плохо срабатывает, или вообще не работает. Можешь назвать это как хочешь - вплоть до "защиты кода", хотя это просто косяк дизассемблера. Улыбка Короче, если после таблицы переходов поместить код, на который нет явных ссылок, то этот код воспримется как часть таблицы переходов. Например, в патче Darth Revana Х3 версии 1.4.02/03 после таблицы находится отладочный кусок CM04a1_createMenu, который и приводит к этому безобразию... Можно поправить вот так:
Код:

           case_jump CM04a1_GetStatCounter            ;151

.if (0)    ; условие не выполняется - код пропускается
CM04a1_createMenu:
        push       1 ; 1
        push       1 ; 1
......... вырезано .............
        pop
        jump CM04a1_retNull
.endif


Далее, если просмотреть сообщения об ошибках, то там могут встречаться что-то вида "Error : The stack has incorrect value on instruction (phase error) at address = 0008BE34; stack (12 <> 19)." А вот такие сообщения игнорировать не стоит. Дело в следующем. Трассировщик дизассемблера проверяет все ветки и переходы, просчитывая текущий стек при выполнении команд. Если несколько веток алгоритма, наконец, сходятся, значение стека должно быть одинаково, иначе выдается вот такое сообщение об ошибке.

AlexYar :

1. В патче Шадди и Ревана есть хс-код для команд скриптредактора такого вида:
CM0428_00: (arg1:22, arg2:23, loc1:18, loc2:17, loc6:13, loc7:12, loc16:3, loc17:2, loc18:1, loc19:0)
{
var loc20=loc16[1];

Ммм. Это не хорошо, такого быть не должно. Транслятор почему-то пытается оформить заголовок процедуры, но по коду там таковой нет. Есть переход на метку CM0428_00 из таблицы xjump. Т.е. транслятор не смог корректно разобрать код. Ошибка может быть и в дизассемблерном файле и в самом трансляторе. Числа после двоеточия - это положение в стеке. Естественно, что транслироваться обратно в асм не будет или, если странслируется, будут чудовищные глюки... Возможно не соответствуют версии xNstory.obj и патча. Или косяк описанный выше...

AlexYar :
2. Экзешник я всё-таки расковырял (блокнот рулит Гы-гы), даже не подозревал, что там так много интерсного есть. Но все-ли перечисленные там команды работают?

Скорее всего работать-то должны все, вот параметры подобрать для них - вот проблема...

AlexYar :
3. Как игра определяет папку с сейвами? Как я понял - это всё в экзешнике зашито, но обойти всё равно можно, написав новую обж-функцию и изменив стандартные doSaveGame и doLoadGame

Да, но doSaveGame() использует X2_Save(), которая собственно и записывает save-файл... Т.е. это нужно сам exe править...

Последний раз редактировалось: CheckerTwo (18:42 04-07-2007), всего редактировалось 1 раз
    Добавлено: 18:18 04-07-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :

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

Кусок патченного обжа после работы dobj:
Код:

001186AE: |  1            write      TMENU_WEAPONS.mew_Turret ; [83d ; 53h]
001186B2: |  1            pop
001186B4: |  0            push       0
001186B6: |  1            write      TMENU_WEAPONS.mew_Slot ; [84d ; 54h]
001186BA: |  1            pop
001186BC: |  0            push       -2d ; 0FFFEh
001186C0: |  1            write      TMENU_WEAPONS.mew_CurSel ; [85d ; 55h]
001186C4: |  1            pop
001186C6: |  0            push       0
001186C8: |  1            get_object
001186CA: |  2            call       TMENU_WEAPONS.GetLaserArray ; 0000AC5A
;
; !переход внутрь процедуры из неправильного jump-а!
001186D0: | 19 L001186D0: write      TMENU_WEAPONS.mew_LaserList ; [82d ; 52h]
001186D4: | 19            pop
001186D6: | 18            push       0
001186D8: | 19            push       2210d ; 08A2h
001186DC: | 20            call       TMENU_ID.SpecialMenu ; 0000A2F6
001186E2: | 19            pop
001186E4: | 18            push       0
001186E6: | 19            ret
;Error: function at addr = 001186E6 has corrupted stack (18).


Мда. Вот это у же проблема.

1. Дизассемблер не плюнулся на ошибку стека в 001186D0. Расстроен Недоработка...

2. Вообще отловить такого рода ошибки черезвычайно сложно. Если, к примеру, в патче указан неверный jump и переход выполняется в середину чужой процедуры - глюков будет море. Ладно вот здесь - дизассемблер плюнулся на большой стек при выходе из процедуры. Посмотрел - и видно эту ошибку, а вот если стеки 2х веток алгоритма примерно равны, найти этот косяк будет почти невозможно... Расстроен

Может dobj-у какую-то диагностику выдавать, если выполняется jump в середину чужой процедуры?

Последний раз редактировалось: CheckerTwo (07:55 05-07-2007), всего редактировалось 1 раз
    Добавлено: 07:16 05-07-2007   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31382

Зарегистрирован: 26.10.2003
CheckerTwo :
1. Дизассемблер не плюнулся на ошибку стека в 001186D0. Недоработка...


Это наверное Шадди немного промахнулся с адресом в патче.

Патч я полностью переделал, теперь для х3 он на перекомпилированном обже. Сам патч работает 100%, однако dobj при декомпиляции выдаёт ошибок 134 килобайт и такое:

Error : "Warn : xjump : npar =4 <> epar 30"
Error : "Warn : xjump : npar =4 <> epar 20"
Error : "Warn : xjump : npar =4 <> epar 19; case = 0"
Error : "Warn : xjump : npar =19 <> epar 4; case = 1"
Error : "Warn : xjump : npar =4 <> epar 20"
Error : "Warn : xjump : npar =4 <> epar 19; case = 0"
Error : "Warn : xjump : npar =19 <> epar 4; case = 1"
Error : "Warn : xjump : npar =5 <> epar 30"
Error : "Warn : xjump : npar =5 <> epar 17; case = 0"
Error : "Warn : xjump : npar =17 <> epar 5; case = 1"
Error : "Warn : xjump : npar =11 <> epar 30"
Error : "Warn : xjump : npar =6 <> epar 41"
Error : "Warn : xjump : npar =6 <> epar 26; case = 0"
Error : "Warn : xjump : npar =26 <> epar 6; case = 1"
Error : "Warn : xjump : npar =38 <> epar 45"

там по всему err-файлу.

Попробуй декомпилировать сам патч:

http://alexyar.fromru.com/files/x3patch_2002_to_2002ext_b4.7z


Кстати, глянь ещё в теме транслятора, что я там по переходам написал (Реван писал, что переходы swith/case работают не как в C++, а на самом деле они работают именно так).
Если в конфиге транслятора поставить swith autobreaks, то выходной асм-файл будет полностью убит, так как испортятся все переходы. Если же не ставить - всё ок, всё работает, но добж при декомпиляции генерит код неправильно.

Другими словами - ошибки декомпиляции именно из-за того, что алгоритмы генерации кода у xa_asm и dobj - разные, поэтому dobj и не понимает, что сгенерировал xa_asm Улыбка

Если подвести их друг под друга проблематично, то и нафиг не нужно тогда, пусть как защита будет Улыбка
    Добавлено: 11:48 05-07-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :
Патч я полностью переделал, теперь для х3 он на перекомпилированном обже. Сам патч работает 100%, однако dobj при декомпиляции выдаёт ошибок 134 килобайт и такое:

Error : "Warn : xjump : npar =4 <> epar 30"
..........
там по всему err-файлу.

Не, выдает всего 799 строчек. И это не ошибки, а предупреждения.
AlexYar :
Попробуй декомпилировать сам патч: x3patch_2002_to_2002ext_b4.7z

Дизассемблировал, asm-файл нормально компилируется с заглушкам.
Сейчас еще потестирую, выложу немного подправленный dobj. Немного подправил вывод в файл ошибок, определение функция/процедура, обнаружение ошибок на стеке, как в описанном выше примере..
AlexYar :

Кстати, глянь ещё в теме транслятора, что я там по переходам написал

Угу...
---------
EDIT
dobj версия 03.27
на народе зеркало тоже обновил..

Последний раз редактировалось: CheckerTwo (17:26 05-07-2007), всего редактировалось 1 раз
    Добавлено: 16:50 05-07-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :
Если в конфиге транслятора поставить swith autobreaks, то выходной асм-файл будет полностью убит, так как испортятся все переходы. Если же не ставить - всё ок, всё работает, но добж при декомпиляции генерит код неправильно.

Чет не вьеду. Расстроен
Какая связь между switсh autobreaks у транслятора и дизассемблером dobj?
В смысле "генерит код неправильно"?
AlexYar :
Другими словами - ошибки декомпиляции именно из-за того, что алгоритмы генерации кода у xa_asm и dobj - разные, поэтому dobj и не понимает, что сгенерировал xa_asm Улыбка

Не могёт такого быть. Процесс dobj -> xasm -> dobj ... ничего практически не меняет. На первых этапах только, когда из кода убирается неиспользуемый код. После 2й итерации все стабилизируется. Друг друга вполне понимают...
AlexYar :
Если подвести их друг под друга проблематично, то и нафиг не нужно тогда, пусть как защита будет Улыбка

Ну-ка, для меня, для тормоза, еще раз и по-подробнее. Почему и как косяки возникают в связке dobj-xasm...
    Добавлено: 18:33 05-07-2007   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31382

Зарегистрирован: 26.10.2003
CheckerTwo :
Не, выдает всего 799 строчек. И это не ошибки, а предупреждения.


А я читаю, как написано, Error - значит ошибка Гы-гы
Можно тогда в лог писать типа "Warning" или "Attention".

CheckerTwo :
Дизассемблировал, asm-файл нормально компилируется с заглушкам.


А транслятором после дизасма?

CheckerTwo :
Какая связь между switсh autobreaks у транслятора и дизассемблером dobj?


Я пишу на хс, асм для меня пока тёмный лес. Поэтому если связка xc->asm->obj->asm->xc не работает, значит с моей позиции всё не работает Гы-гы А что виновато, асемблер или транслятор - мне определить проблематично. Поэтому и спрашиваю.

CheckerTwo :
Процесс dobj -> xasm -> dobj ... ничего практически не меняет.


Меняет то, что транслятор "asm->xc" вторичный обж уже не понимает. А первичный - без проблем Улыбка
    Добавлено: 23:43 05-07-2007   
Chem
 780 EGP


Скрипт-мастер
Репутация: 248
Сообщения: 4751
Откуда: Киев
Зарегистрирован: 08.01.2007
кстати, вопрос.
Дизассемблю оригинальный x3story.obj.
настройки-
dobj.ini :

[System]
ErrExt = ".err"
OutFmt = DEC ;HEX
Tracer = On
RenameClass = On
OutExtern = On
OutDASM = ".out", On ; вывод файла дизассемблера
OutDEF = ".def", On ; вывод описания объектов
OutSYMB = ".sym", On ; вывод секции SYMB
OutVARS = ".var", On ; вывод секции VARS
OutPTCH = ".pct", On ; вывод секции PTCH
OutSTRG = ".str", On ; вывод секции STRG
OutLABS = ".lab", On ; Метки
OutASM = ".asm", On ; файл ассемблера (без hex-кодов)
OutMOD = "output\", "T", ".txt", Off
OutSplit = On, On
RemarkNoUse = On
RemarkIfConst = Off
XJUMP = On
ForcePush = On

есть такие ошибки (202)-
x3story.err :

Error: Overflow stack at command addr = 00005670; stack = 1 limit = 0
....
Error: Overflow stack at command addr = 0024DCBC; stack = 1 limit = 0

_________________
Умножим энтропию на 0 :-)

Последний раз редактировалось: Chem (00:18 13-07-2007), всего редактировалось 1 раз
    Добавлено: 00:02 13-07-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Chem :
кстати, вопрос.
Дизассемблю оригинальный x3story.obj.
........................
есть такие ошибки (202)-
x3story.err :

Error: Overflow stack at command addr = 00005670; stack = 1 limit = 0
....
Error: Overflow stack at command addr = 0024DCBC; stack = 1 limit = 0


Это нормально. Вероятнее всего в КС объявление было такое, или нечто похожее:
Код:

void TPATCH::Patch13(void)
{
}

Что транслировалось вот в такой код:
Код:

                                 |      TPATCH.Patch13:
0000566C: 0055 0000              |    0            setmem     0
00005670: 0009                   |    0            push       0
;Error: stack overflow condition at command addr = 00005670;  stack = 1  limit = 0
00005672: 0035                   |    1            ret


При этом в процедуре не резервируется место под локальные стековые переменные - setmem 0, а потом вгоняется в стек 0 (push 0). В результате dobj выводит сообщение об ошибке. Несмотря на то, что виртуальная машина в Х это дело молча проглатывает, все же считаю это косяком.
    Добавлено: 08:01 13-07-2007   
Chem
 780 EGP


Скрипт-мастер
Репутация: 248
Сообщения: 4751
Откуда: Киев
Зарегистрирован: 08.01.2007
CheckerTwo :

Это нормально. Вероятнее всего в КС объявление было такое, или нечто похожее:
Код:


void TPATCH::Patch13(void)
{
}

Что транслировалось вот в такой код:
Код:


                                 |      TPATCH.Patch13:
0000566C: 0055 0000              |    0            setmem     0
00005670: 0009                   |    0            push       0
;Error: stack overflow condition at command addr = 00005670;  stack = 1  limit = 0
00005672: 0035                   |    1            ret


При этом в процедуре не резервируется место под локальные стековые переменные - setmem 0, а потом вгоняется в стек 0 (push 0). В результате dobj выводит сообщение об ошибке. Несмотря на то, что виртуальная машина в Х это дело молча проглатывает, все же считаю это косяком.

А может его тогда менять на правильный код , например сделать параметр, как поступать с таким кодом?
_________________
Умножим энтропию на 0 :-)
    Добавлено: 14:13 30-07-2007   
Darth Revan
 345 EGP


Рейтинг канала: 5(153)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
Декомпилятор xa2c предназначен исключительно для детрансляции кода, сгенерированного Egosoft KC. Т.е. я сначала поизучал дизассмеблинг обжей, сгенерированных KC, разобрался, как он транслирует C-инструкции, а затем, пользуясь этой инфой, восстанавливал код. XC транслирует инстукции по другому (особенно switch), соответственно, xa2c уже не сможет работать с кодом, траслированным XC. То же самое относиться к патчам оригинального обжа. Вставка переходов в код и прочее не распознаётся и вызывает ошибки разной степени тяжести. Оно и понятно. Патч может не иметь сишног эквивалента. Тем более XC-эквивалента. XC ведь - это не полноценный компилятор и не компилятор вообще, а просто транслятор текста. Ни а каком контроле типов речь не идёт. Даже имена фукций не проверяются.
Поделка с минимумом функциональности и контролем ошибок не более чем достаточным лоя того, чтобы не ошибиться в букве имени переменной, выражениях и т.п. Т.е. писать нужно аккуратно. Точно также нет в XC, например, такой вещи, как безусловный переход (хотя я не уверен, что оный в KC есть). Т.е. просто jumpы с ассемблера не конвертируюся в XC, особенно на пол обжа длиной.

AlexYar :

1. В патче Шадди и Ревана есть хс-код для команд скриптредактора такого вида:
CM0428_00: (arg1:22, arg2:23, loc1:18, loc2:17, loc6:13, loc7:12, loc16:3, loc17:2, loc18:1, loc19:0)
{
var loc20=loc16[1];

Это не заголовок процедуры. Это метка, а в скобках - адреса в стеке для переменных. Удобно как раз там, где нет процедуры, а нужно заменить на использовать XC код. Т.е. там огромная процедура (на солидную часть обжа), а патч у обж у меня уже правленый на асме был, так что я меняд на XC его кусками. И вот чтобы кусочек (а именно, обработчик соответствующей скрипт-команды) переписать, я его удаляю в асме обжа, и добавляю из декомпилированного xa2c кода оригинального обжа. И вот тут требуется указывать, где в стеке ледат переменные, что собственно, в скобках и перечисляется.

CheckerTwo :
Может dobj-у какую-то диагностику выдавать, если выполняется jump в середину чужой процедуры?

На самом деле, переход в середину чужой процедуры - полезная штука. Если хочется пропатчить кусок метода класса, то патчик должен быть тоже в методе этого класса, чтобы xasm распознавал имена свойств класса, к которым в патче обращаемся. До какой-то версии асмы патч работал в произвольном месте, а затем пришлось создавать функции, в которые и пихать все патчи.

AlexYar :
Я пишу на хс, асм для меня пока тёмный лес. Поэтому если связка xc->asm->obj->asm->xc не работает, значит с моей позиции всё не работает

Эта связка и не может работать. Я не могу в xc привести произвольный код. Можно теоретически обратно из асмы после xc обратно восстановить xc код, только не понятно зачем. Т.е. понятно, наверное, если хочется восстановит xc-код пропатченного обжа, но это не практически невозможно. Я не был даже уверен, что задача декомпиляции обжа от KC разрешима. Так что лучше рисать сразу на XC и не писать на асме вообще. Т.е. начинать либо сразу с XC кода оригинального обжа, либо с его asm-кода и, смотря на xc-код, заменять нужные места. Т.е. удалять из asm-файла, вставлять код в xc, а затем править. Последним способом я и делаю (как уже говорил, начинал не с оригинального, так что xa2c уже не работает; да и надёжность выше Улыбка ).

Цитата:
Это нормально. Вероятнее всего в КС объявление было такое, или нечто похожее...

Это действительно нормально. У меня сложилось подозрение, что виртуальная машина одно значение в стеке при переходе резервирует специально на такой случай. Или, что похоже на правду, место для возвращаемого значения резервируется при вызыве, соответственно, в число при setmem оно не входит.

AlexYar :
case 339:
CM0438_00: (arg1:22, arg2:23, loc1:18, loc2:17, loc6:13, loc7:12, loc16:3, loc17:2, loc18:1, loc19:0)
{
бла-бла-бла...
break;
}
case 340:


А чем чревато такое написание на xc? Есть какие-нибудь возможные негативные последствия, или это вполне нормальное написание?
(транслятор не ругается, асемблер тоже, игра не вылетает, команда работает).

Кто-нить может перевести на "русский", что означает (как читается) вторая строка (CM0428_00:...) ? В теме по транслятору описано крайне туманно, чтобы можно было что-то понять.


CM0438_00 - имя метки. Переход на неё в другом месте - asm-командой jump.
В скобках имена переменных и их адреса в стеке:
arg1:22 - переменная arg1 находится в SP[22]
arg2:23 - переменная arg2 находится в SP[23]
loc1:18 - переменная arg2 находится в SP[18]
и т.д. до конца.
Используется всё это для того, чтобы переписать кусок asm-кода на XC. Т.е. это совершенно ленальная возможность, созданная специально для того, чтобы можно было работать с XC-кусками больших asm-функций. Как я уже говорил, вот есть патч к обжу, а его xa2c, естественно, не берёт. Берём оригинаольный обж - для него xa2c работает. Находим нужный кусок в полученном XC-тексте и в asm-тексте патченного обжа. Из второго вырезаем, XC-код добавляем. Это если патченный обж у нас в asm-виде, т.е. патч на основе подностью дезассемблированного обжа, но уже правленный на асме, или обж дезассемблировался уже патченный, а потом работаем уже с результатом. Так в последих патчах для X2. Для X3 там всё было проще. Т.е. просто патчилось место перехода на метку, в данном случае, обработки команды ScE. Соответсвенно, метка перехода в длинном switch менялась на CM0438_00. Код XC, как и ранее, брался из XC-варианта оригинального обжа, а затем правился в соответствии с нуждами. Остаётся только проставить позиции локальных переменных, что лекго по листингу дизасмы делается. Достаточно посмотреть для одной переменной, остальные задаются очевидным образом. Из примера вверху видно как. Т.е. число после loc повышается, позиция в стеке понижается на соответствующее число единиц, а аргументы проталкиваются в стек в обратном порядке, т.е. тут наоборот, и если число после arg повышается, то и положение в стеке повышается).

Цитата:
Да, но doSaveGame() использует X2_Save(), которая собственно и записывает save-файл... Т.е. это нужно сам exe править...

Да, DoSaveGame() переписать можно (для этого нужет патч на основе полностью дизассемблированного, т.е. не патчить оригинальный обж, а иметь большой asm-файл(ы) от dobj). А вот exe реализации, в частености, X2_Save() изменить невозможно.
    Добавлено: 01:32 06-08-2007   
Канал X2: The Threat: «X2-ASM - это проcто!»
На страницу: Пред.  1, 2, 3 ... , 10, 11, 12  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Какая-то дебильная тема, но лишать ее своего присутствия почему-то влом. (SunnyGale)

  » X2-ASM - это проcто! | страница 11
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18