Разбираемся в HEX коде SCM
В этой статье мы подробно разберёмся в устройстве файлов *.SCM.
Надеюсь, вы знаете, что такое HEX код, но для тех, кто не в курсе объясню.
Hex – это шестнадцатеричная система исчисления. Объясняю на примере:
Есть ещё двоичная(Bin), но нам она не понадобится ;)
Также есть специальные Hex-редакторы, например, WinHex и другие :)
В этом деле они вам пригодятся.
Также объясню, что такое little-endian:
некоторые процессоры такие как, например, Intel®, считывают информацию с наибольшего значащего байта, и чтобы они понимали записанную информацию, приходится хранить её в таком порядке: например, число 12 34 56 78 хранится как 78 56 34 12.
Объясняю устройство scm файлов.
Для примера использую оригинальный main.scm.
В начале файла идёт опкод 0002:
02 00 01 20 AB 00 00
Воспринимать это надо так:
0002: 01 0000AB20 то же самое, что и 0002: jump ЈЈSecond_Segment в MB
0002: – это опкод (max 2 byte)
01 – тип данных (max 1 byte)
0000AB20 – адрес, т. е. offset (max 4 byte)
После идёт сегмент, который указывает, сколько байтов памяти надо выделить для глобальных значений. Например, глобальная переменная $102 имеет самый большой offset, значит памяти надо 400 байт (102*4-8), т. к. на каждую переменную выделяется минимум 4 байта, а первые 8 байтов занимает jump и указатель на сегмент.
Потом идёт опять jump (offset AB20), а затем сегмент объявленных объектов.
На каждое имя объекта выделяется не больше 24 байт.
Offset CFA4: Опять jump, затем сегмент объявленных миссий
Offset D1DF: jump, затем сегмент объявленных внешних скриптов
Offset DA8C: jump, затем неизвестный сегмент
Offset DA98: jump, затем ещё один неизвестный сегмент
Offset DAA9: главный поток «MAIN»