Я предполагаю, что вы не хотите иметь программу на C ++, которая читает этот документ формата файла при запуске, а затем анализирует фактический файл данных на этой основе.Вместо этого вам нужна программа на C ++, предназначенная для чтения текущей версии этого формата файлов?(Это намного проще и будет работать быстрее).Вам не нужно использовать ASM.Что вам нужно сделать, это определить типы C ++, которые эквивалентны именам, используемым в файле формата.Например, я думаю, что DWORD используется в языках Microsoft для обозначения целого числа определенного размера - может быть, 32 или 64 бита.Отследите этот материал, а затем создайте структуры C ++ с эквивалентными элементами.
Например:
#include <inttypes.h> // if on Windows, try __int32, __int64 etc. instead
typedef int64_t DWORD; // or whatever width you find it's meant to be
typedef int32_t WORD;
typedef ??? ZSTR; // google it...?
typedef float FLOAT;
struct dds
{
ZSTR path;
WORD is_skin;
WORD alpha_enabled;
WORD two_sided;
WORD alpha_test_enabled;
WORD alpha_ref;
WORD z_write_enabled;
WORD z_test_enabled;
WORD blending_mode; // None = 0, Custom = 1, Normal = 2, Lighten = 3
WORD specular_enabled;
FLOAT alpha;
WORD glow_type; // None = 0, NotSet = 1, Simple = 2, Light = 3, Texture = 4, TextureLight = 5, Alpha = 6
FLOAT red;
FLOAT green;
FLOAT blue;
};
// point p at the entire input, which you'll have loaded into memory somewhere
// (e.g. f/stat() the file size then allocate heap and read into it, or memory map)
const char* p = input;
DWORD mesh_count = *(const DWORD*)p;
p += sizeof(DWORD);
for (int i = 0; i < mesh_count; ++i)
{
const dds& d = *(const dds*)p;
// you can use d.red, d.alpha etc. here to do anything you like
p += sizeof dds;
}
// continue processing effect count etc... in same style
HTH, Tony