#1 04-03-2007 06:36

xnsnet
From: CLN.RU
Registered: 24-02-2007
Posts: 19
Website

Типы данных параметров опкодов

Если не секрет, хотелось бы узнать про типы данных параметров опкодов, я конечно понимаю что этот вопрос слабо относится к программированию в SB, если только в HEX блоках, но все же.

На данный момент я определил следующие типы, те на которые наткнулся, при написании декомпилятора, и конечно могу и ошибаться по поводу их назначения, тем более что могу путать целые числа с числами с плавающей точкой:

0x00 = Пустышка, для завершения блока параметров, переменной длинны
0x01 = 32 бит целое число
0x02 = 16 бит целое число
0x03 = ?
0x04 = 8 бит целое число
0x05 = 16 бит целое число ?
0x06 = 32 бит с плавающей точкой
0x07 = ?
0x08 = ?
0x09 = Короткая строка 8 байт
0x0A = Длинная строка 16 байт
0x0B = ?
0x0C = ?
0x0D = ?
0x0E = Строка с байтовым указателем длины
0x0F = ?

Last edited by xnsnet (04-03-2007 06:50)

Offline

#2 04-03-2007 07:03

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Типы данных параметров опкодов

Зачем изобретать велосипед, формат SCM уже давно известен и описан
http://www.gtamodding.com/index.php?tit … verview%29

Offline

#3 04-03-2007 08:12

xnsnet
From: CLN.RU
Registered: 24-02-2007
Posts: 19
Website

Re: Типы данных параметров опкодов

Seemann wrote:

Зачем изобретать велосипед, формат SCM уже давно известен и описан
http://www.gtamodding.com/index.php?tit … verview%29

Да, спасибо, аналогично этому я почти в тоже самое время заглянул в проект Point и нашел все то же самое на .NET, только декомпилера нормального пока не изобрели, к сожалению... А эту страницу я как-то видел, только ведь без необходимости на нее не обратишь внимания:) Толку от нее если незнаешь к чему применить:) Уж теперь я знаю, спасибо:)

Чувствую себя детем малым в этой теме, но ничего не поделаешь, всегда нужно побыть детем, чтобы вырасти:) Рядом с большими дядьками, которые съели все овощи и фрукты раньше:) А я уже думал мне самому до всего доходить придется, без док, я могу, только время не резиновое, поэтому еще раз спасибо:)

Last edited by xnsnet (04-03-2007 08:29)

Offline

#4 04-03-2007 08:55

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Типы данных параметров опкодов

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

Пойнт на самом деле имеет декомпилятор и он, без сомнения, - лучший на данный момент (хоть и не доделан).

Offline

#5 04-03-2007 23:17

xnsnet
From: CLN.RU
Registered: 24-02-2007
Posts: 19
Website

Re: Типы данных параметров опкодов

Seemann wrote:

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

Пойнт на самом деле имеет декомпилятор и он, без сомнения, - лучший на данный момент (хоть и не доделан).

Да я видел, частично изучил, сторону декомпилятора, я на C# пишу в основном, поэтому нет более понятного языка, синтаксис .NET 1.1 мало чем глобально отличается визуально от 2.0 кроме некоторых упрощений и ухищирений:)

Тем не менее по поводу декомпилятора, некоторые мысли: Дело в том что разборщик не только должен гарантировать успешный разбор всего что ему понятно, это илюзия автоматизма, разборщик должен позволять контролировать разбор, давая возможность пользователю самому видеть в чем могут быть изъяны и недоделки. Почти то же самое видеть код в хексе, но структурированном. Например IDA это гарантирует, но IDA не гарантирует всего, например он не гарантирует обработку и разбор того кода который выполняется, для этого есть только дамп, то есть он не проходит по стопам хода выполнения, если бы он это делал, сдвигать что-либо было бы бесполезно, он бы действительно показывал все, даже зашифрованный контент, но это ассемблер, а мы говорим о более простом, о скрипте.

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

Кроме того метки, условные переходы, они могут быть более внятно интерпретированы по точкам их расположения и перехода, то есть не просто пометить тереторию, вот сюда он ссылается, а структурировать територию, вот как он работает. Декомпилятор должен представить код наиболее близко к тому виду в котором он был написан, вы возможно подумаете что это невозможно, а в реале невозможно это не предствить. Программа не может быть структурирована в разборщике, только если сборщик не структурирован, например если писать на чистом ассемблере, тогда это невозможно или почти невозможно, а в итоге все зависит от оптимизации. Если оптимизатора нет, то нет ничего проще, сравнительно. А если еще разборщик будет говорить с пользователем, что ему делать, что ему не делать, давать возможность задавать параметры для разбора, то можно понять намного больше, чем без всего этого.

Я не говорю что все это определенно, в нашей работе и без того масса неопределенностей, я лишь говорю о том, что это возможно, смотреть на суть вопроса можно по разному, в зависимости от достатка информации, можно делать совершенно разные выводы, к которым можно и не придти. Короче, смотрите на мир шире, чем вы на него смотрите, хотя бы старайтесь:)

Last edited by xnsnet (05-03-2007 01:18)

Offline

#6 05-03-2007 07:24

xnsnet
From: CLN.RU
Registered: 24-02-2007
Posts: 19
Website

Re: Типы данных параметров опкодов

Кстати если сравнить мой текущий декомпилер с пойнтом, то я пошел дальше, я привел каждый тип данных к аналогичным структурным типам данных в .NET, для массивов соответственно классы. Так проще управлять типами и каждый тип можно в идеале контролировать. Вобщем новые билды штампую конвеером, как только внидряю что-то новое и протестированное соответственно, бурная деятельность у меня сейчас в этом направлении.

Пока что программа базируется здесь: http://gtamaps.net/forum/index.php?show … t&p=210354

Только ини файлы мне совсем ненравятся, для полного описания опкода и его параметров, включая всякую шнягу нужно несколько INI файлов, но если делать все по человечески достаточно перевести всю информацию в один XML файл и им управлять из программы, редактировать, дополнять и описывать все что надо. Пока что мне не до этого, но со временем думаю это сделать. А пока что я просто интерпритировал SASCM.INI методом быстрой правки, к тому который меня больше устраивает в форматировании.

Естественно что все что выводит программа в таблице о скрипте, мне нужно для проверки целостности и речи не идет о том что это и есть тот вид в котором будет все это удобно просматривать, просто это самое простое что мне пришло на ум, чтобы получить результат на скорую руку.

Длительные проекты в одиночку делать сложно поэтому стараюсь расширятся оправдано, не хочется с этим делом затягивать на долго, ведь как только расслабишься, интерес пропадет и делать ничего не захочется.

Я ща вожусь с переходами:
jump - С самого начала прошел легко.
jamp_if_false - Сегодня включил, со вторым проходом, думал сначала в отдельном потоке проходить вторую часть кода, потом решил не плодить потоки ради такой мелочи, было бы на что поток открывать.

На счет gosub и return, я их учел, вход и выход из процедуры, но пока не вошел не в одну процедуру в исходном скрипте. Чтобы это оттестировать.

Предпологаю что надо печся об переходах в направлении: init_jump_table и jump_table_jumps

Я сделал некое подобие атрибутных процедур, которые используют опкоды, так что пройти любой опкод на уровне выполнения не проблемма, проблемма в том что выполнять, с переходами понятно, я просто оффсет в потоке сдвигаю, а на счет всего остального не думаю что надо хотя можно ради прикола проверять условия, или построить отладчик, но думаю что это более важная задача для компилятора, нежели декомпилятора.

Вот еще вопрос, не совсем понял с минусовыми переходами, по сути я так понимаю это шаг назад на столько-то байт, но в имидже есть джамп который шагает слишком далеко назад выходя назад аж за нулевой оффсет, значит он шагает в main.scm на уровне вызова или я это неправельно понял? Я не подгружал скрипты из имиджа к основному скрипту, но уже думаю что это необходимо чтобы проверить целостность.

Last edited by xnsnet (05-03-2007 08:32)

Offline

#7 05-03-2007 09:05

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Типы данных параметров опкодов

Так ты уже от написания мультиплеера перешел к созданию нового декомпилятора скриптов? Я правильно понял? Или это лишь шаг к созданию мультиплеера?
Чем мне нравится декомпилятор Пойнта, это тем что получается в итоге: абсолютно высокоуровневый код, похожий на Си. Никаких опкодов, DEFINE MISSION и прочего. Появляются конструкции if {}, switch, функции и прочие вкусности. Даже жалко, что Джон не довел свою разработку до ума.
Так вот, там же есть исходники, тебе они должны быть понятны, зачем начинать все с нуля?

не совсем понял с минусовыми переходами, по сути я так понимаю это шаг назад на столько-то байт

это переход на N байт вперед от начала миссии/скрипта. Отрицательные они для того чтобы отличить от глобальных меток в майне.

в имидже есть джамп который шагает слишком далеко назад выходя назад аж за нулевой оффсет, значит он шагает в main.scm на уровне вызова или я это неправельно понял?

не встречал

Offline

#8 05-03-2007 09:30

xnsnet
From: CLN.RU
Registered: 24-02-2007
Posts: 19
Website

Re: Типы данных параметров опкодов

Моя цель руководствуется прежде всего интересом в данном направлении:) Дописывать чужие творения очень сложно когда чего-то непонимаешь, согласись, проще написать что-то свое, тем более войти за счет этого в дело и даже возможно расширить кругозор не только свой:) А когда все понимаешь, сам знаешь все проще на порядок:)

Что касаемо пойнта, есть еще одно но, я слабо понимаю смысл того что Джон написал, может это как раз из-за того что я много другого пока не понимаю:) Вроде бы он и придерживается стандартов написания, но пишет на C# так как буд-то это C++, например сравниваю макросы С++ с его почерком, одно наименование процедуры MakeGlobal об этом кричит не говоря уже о сути операции в этой процедуре:)

На счет минусовых переходов, спасибо за подтверждение моей догадки, я как раз копался в хексе, и об этом думал:) Уже кое что:) Слава богу что скрипты до такой степени не соприкосаются между собой:)

Кстати если я понимаю что такое начало скрипта, то что ты имеешь ввиду под началом миссии?

Что касаемо C эквивалента скрипта, да мне тоже это нравится, если ты правельно понял, то я этот эквивалент хочу зарядить аж на уровень .NET, если ты смотрел пойнт в исходном коде в визуальной студии, то ты понимаешь что такое эквивалент в аналогичном исходном коде, цель даже не редактор, как Point, цель адаптировать скрипт к исходному коду для которого редактором будет сама визуальная студия, теперь ты пониял? А декомпилятор, заодно так, разберет скрипт который существует по заказу в этот редактор или в другой, поэтому я и пишу декомпилятор, чтобы удовлетворить самое необходимое на мой взгляд, а поддержать скажем твой редактор или любой другой не сложно, адаптер есть адаптер.

Ага а вот я и сабы оттестирую теперь в ammu.scm встретился, все же минусовой оффсет это весело:)

		[SaMethod( 0x0002, 1 )]
		public bool Goto( ScmInt32 iOffset ) {
			if ( iOffset < 0 ) {
				iOffset =~ iOffset.Value;
				iOffset++;
			}
			Offset = iOffset;
			return true;
		}

Если есть желание разобраться в .NET могу поделится проектным исходным кодом, скрывать то вобщем-то нечего, нужна VS.NET 2005 и немножко терпения, пока проект маленький, не такой громоздкий как Point разобраться еще можно, без больших проблемм.

Last edited by xnsnet (05-03-2007 11:15)

Offline

#9 05-03-2007 11:38

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Типы данных параметров опкодов

что ты имеешь ввиду под началом миссии?

начало миссии/внешнего скрипта определяется командой DEFINE в начале исходника

Если есть желание разобраться в .NET могу поделится проектным исходным кодом

у меня нет ни VS.NET ни желания в чем-то разбираться. У меня самого с мая прошлого года лежит исходник компилятора Sanny Builder 3 в 4.000 строк и я все никак не могу вернуться к нему...

Хотя выложить можешь, вдруг кто-то еще заинтересуется

Offline

#10 05-03-2007 11:59

xnsnet
From: CLN.RU
Registered: 24-02-2007
Posts: 19
Website

Re: Типы данных параметров опкодов

начало миссии/внешнего скрипта определяется командой DEFINE в начале исходника

Ладно, разберемся:)

у меня нет ни VS.NET ни желания в чем-то разбираться. У меня самого с мая прошлого года лежит исходник компилятора Sanny Builder 3 в 4.000 строк и я все никак не могу вернуться к нему...

Хотя выложить можешь, вдруг кто-то еще заинтересуется

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

Выложу, при первом полноценном билде, по которому можно будет сказать, да это полноценный разборщик, без непоняток и стопоров, сразу на GTAForums, а пока он всего лишь на половину работает, выкладывать нечего, только факт, а для факта хватит и рантайма:) Логика у меня странная временами, выкладываю только полноценные сурсы:) Наверное не хочу показаться ламером для всех:)

Last edited by xnsnet (05-03-2007 12:04)

Offline

#11 07-03-2007 11:42

xnsnet
From: CLN.RU
Registered: 24-02-2007
Posts: 19
Website

Re: Типы данных параметров опкодов

Я наконец разрадился на собственные форумы или вернее сервер сообщества, http://community.xnsnet.ru/ поэтому базовое место где будут новые творения будет здесь, не буду больше писать не по теме, это не означает что я вас не буду посещать, у вас есть много интересного, просто я наконец обосновался на своем собственном сервере, раньше что-то не получалось никак, желания не хватало, возможности были всегда:(

Реклама собственных сайтов крайне не желательна! Для этого - приват
-= Capushon =-

Last edited by xnsnet (07-03-2007 11:47)

Offline

Board footer

Powered by FluxBB