Войти
ПрограммированиеФорумОбщее

Сегмент данных на ассемблере переписать(заскриптовать) на Си. Реально ли?

Advanced: Тема повышенной сложности или важная.

#0
(Правка: 4:07) 4:06, 1 авг. 2021

Есть сегмент данных, написанный на ассемблере.

Там располагаются байты с метками на данные, которые используются компилятором С/C++ как внешние переменные или массивы.

Изображение

Некоторые данные вычисляются при ассемблировании, тоесть не постоянные - плавают при линковке:

Изображение

С точки зрения С/C++ они сейчас объявлены как внешние - массивы и переменные:

extern "C" int _STACKLOW;
extern "C" char polypoints[];


Вопрос собственно такой:  как объявить эту байду на Си, чтобы сохранилось взаимное расположение данных и их тип (с точки зрения С++) ?

Автоматизация процеса(скрипты) возможна?

P.S. Данная байда - от дизассемблированной игры.


#1
4:25, 1 авг. 2021

Gradius
> Вопрос собственно такой: как объявить эту байду на Си, чтобы сохранилось
> взаимное расположение данных и их тип (с точки зрения С++) ?

Си не гарантирует как располагаются свободные переменные.
Единственная гарантия по взаимному расположению есть у полей структур и у элементов массивов разумеется.
dd offsetof x это просто указатель на что-то, например в массиве таких указателей инициализатор: { &anim_order1, &anim_order2, ... }
Но чтобы предложить конкретное представление надо иметь реальный пример конкретных данных.

#2
6:46, 1 авг. 2021

=A=L=X=
> Но чтобы предложить конкретное представление надо иметь реальный пример
> конкретных данных.

Вопрос решён.  Правда, немного другим способом.

Полученный объектник от ваткомовского асма(формат OMF), был сконверчен утилитой objconv.exe в формат elf32.

После этого, тулчейн под винду mingw при линковке стал понимать объектник.

Ниже пример.

Программа:

#include <stdio.h>
#include <conio.h>

extern "C" char aCongratulation[];  //строка из объектника

int main(void)
{
 printf("%s",(char*)aCongratulation);
 getch();
}

Компиляция:

g++ -c test.cpp
g++ -O3 -Ofast -o test.exe test.o new.obj

Перегон OMF в ELF32:

objconv.exe -felf32 DSEG.obj new.obj

Утилита с описанием как пользоваться objconv.exe  тут: https://www.agner.org/optimize/#objconv

Надеюсь, elf32-объектник с чисто-данными будет пониматься тулчейнами ARM-gcc и C6000-cc.
Проверка objdump (mingw):

objdump -S new.obj

Результат программы:

1 | Сегмент данных на ассемблере переписать(заскриптовать)  на Си.  Реально ли?
#3
(Правка: 8:39) 8:38, 8 авг. 2021

Проблема вновь актуальна.

Делаю Web-порт игры через emscripten.  А он не понимает ELF32 object files.  И это странно,  ведь там одни данные.  Маш-кода нет вообще. Заглянул в хекс-редакторе,  да - у emscripten свoи объектники внутренностям сильно отличающиеся от elf-obj.

#4
(Правка: 17:46) 17:45, 8 авг. 2021

Gradius
> Автоматизация процеса(скрипты) возможна?

Отвечу самому себе - возможна!  И уже идёт полным ходом.

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

При таком подходе,  сохранятся взаимные расположения сущностей.  А чтобы ручки не отсохли - пишу скрипты-конвертеры.

Было так:

Изображение

Станет так (оффсеты пока не заполнены и равны 0 ):

Изображение
#5
10:47, 9 авг. 2021

Gradius
> Некоторые данные вычисляются при ассемблировании, тоесть не постоянные -
> плавают при линковке:

Эти оффсеты пришлось проинициализировать:

1 | Сегмент данных на ассемблере переписать(заскриптовать)  на Си.  Реально ли?

Успешно избавился от сегментов данных на ассемблере и от объектников всяких.  Концепция псевдо-переменных работает.  Игра теперь чисто на Си/C++.

ПрограммированиеФорумОбщее