Собственно есть сишный файл с функцией на inline assembly требуется его перевод в .asm дабы была возможность скомпилть под win x64 ибо Visual Studio 2008 __asm теги игнорирует. Поскольку asm для меня темный лес естественно ничего не получилось вот что удалось состряпать почему не работает хз, может мега гуру мне подскажут )) Это вариант на «С» который полностью работает Код (Text): #define FSOUND_LOOP_NORMAL 0x02 #define FSOUND_LOOP_BIDI 0x04 #define FSOUND_OUTPUTBUFF_END 0 #define FSOUND_SAMPLEBUFF_END 1 #define FSOUND_MIXDIR_FORWARDS 1 #define FSOUND_MIXDIR_BACKWARDS 2 extern unsigned int mix_numsamples; extern unsigned int mix_mixptr; extern unsigned int mix_mixbuffend; extern unsigned int mix_mixbuffptr; extern unsigned int mix_endflag; extern unsigned int mix_sptr; extern unsigned int mix_cptr; extern unsigned int mix_count; extern unsigned int mix_samplebuff; extern float mix_leftvol; extern float mix_rightvol; extern unsigned int mix_temp1; extern unsigned int mix_count_old; extern unsigned int mix_rampleftvol; extern unsigned int mix_ramprightvol; extern unsigned int mix_rampcount; extern unsigned int mix_rampspeedleft; extern unsigned int mix_rampspeedright; extern unsigned int mix_volumerampsteps; extern float mix_1overvolumerampsteps; extern const float mix_255; extern const float mix_256; extern const float mix_1over255; extern const float mix_1over256; extern const float mix_1over2gig; typedef struct FSOUND_SAMPLE { unsigned char * buff; unsigned int length; unsigned int loopstart; unsigned int looplen; unsigned char defvol; signed char finetune; int deffreq; int defpan; unsigned char bits; unsigned char loopmode; unsigned char globalvol; signed char relative; int middlec; unsigned int susloopbegin; unsigned int susloopend; unsigned char vibspeed; unsigned char vibdepth; unsigned char vibtype; unsigned char vibrate; } FSOUND_SAMPLE; typedef struct { int index; int volume; int frequency; int pan; int actualvolume; int actualpan; unsigned int sampleoffset; FSOUND_SAMPLE * sptr; unsigned int leftvolume; unsigned int rightvolume; unsigned int mixpos; unsigned int mixposlo; unsigned int speedlo; unsigned int speedhi; unsigned int speeddir; unsigned int ramp_lefttarget; unsigned int ramp_righttarget; unsigned int ramp_leftvolume; unsigned int ramp_rightvolume; unsigned int ramp_leftspeed; unsigned int ramp_rightspeed; unsigned int ramp_count; } FSOUND_CHANNEL; extern FSOUND_CHANNEL * cptr; void FSOUND_Mixer_FPU_Ramp() { __asm { //CODE HERE } } И это что получилось все компилится но при запуске полный ахтунг в смысле ошибка с закрытием Код (Text): .486 .model flat, stdcall option casemap :none .data FSOUND_LOOP_NORMAL EQU 000000002h FSOUND_LOOP_BIDI EQU 000000004h FSOUND_OUTPUTBUFF_END EQU 0t FSOUND_SAMPLEBUFF_END EQU 1t FSOUND_MIXDIR_FORWARDS EQU 1t FSOUND_MIXDIR_BACKWARDS EQU 2t EXTERNDEF C mix_numsamples:DWORD EXTERNDEF C mix_mixptr:DWORD EXTERNDEF C mix_mixbuffend:DWORD EXTERNDEF C mix_mixbuffptr:DWORD EXTERNDEF C mix_endflag:DWORD EXTERNDEF C mix_sptr:DWORD EXTERNDEF C mix_cptr:DWORD EXTERNDEF C mix_count:DWORD EXTERNDEF C mix_samplebuff:DWORD EXTERNDEF C mix_leftvol:REAL4 EXTERNDEF C mix_rightvol:REAL4 EXTERNDEF C mix_temp1:DWORD EXTERNDEF C mix_count_old:WORD EXTERNDEF C mix_rampleftvol:DWORD EXTERNDEF C mix_ramprightvol:DWORD EXTERNDEF C mix_rampcount:DWORD EXTERNDEF C mix_rampspeedleft:DWORD EXTERNDEF C mix_rampspeedright:DWORD EXTERNDEF C mix_volumerampsteps:DWORD EXTERNDEF C mix_1overvolumerampsteps:REAL4 EXTERNDEF C mix_255:REAL4 EXTERNDEF C mix_256:REAL4 EXTERNDEF C mix_1over255:REAL4 EXTERNDEF C mix_1over256:REAL4 EXTERNDEF C mix_1over2gig:REAL4 @t_0 TYPEDEF PTR BYTE FSOUND_SAMPLE STRUCT 2t buff @t_0 ? _length DWORD ? loopstart DWORD ? looplen DWORD ? defvol BYTE ? finetune SBYTE ? deffreq SDWORD ? defpan SDWORD ? bits BYTE ? loopmode BYTE ? globalvol BYTE ? relative SBYTE ? middlec SDWORD ? susloopbegin DWORD ? susloopend DWORD ? vibspeed BYTE ? vibdepth BYTE ? vibtype BYTE ? vibrate BYTE ? FSOUND_SAMPLE ENDS @t_1 TYPEDEF PTR FSOUND_SAMPLE @tag_0 STRUCT 2t index SDWORD ? volume SDWORD ? frequency SDWORD ? pan SDWORD ? actualvolume SDWORD ? actualpan SDWORD ? sampleoffset DWORD ? sptr @t_1 ? leftvolume DWORD ? rightvolume DWORD ? mixpos DWORD ? mixposlo DWORD ? speedlo DWORD ? speedhi DWORD ? speeddir DWORD ? ramp_lefttarget DWORD ? ramp_righttarget DWORD ? ramp_leftvolume DWORD ? ramp_rightvolume DWORD ? ramp_leftspeed DWORD ? ramp_rightspeed DWORD ? ramp_count DWORD ? @tag_0 ENDS FSOUND_CHANNEL TYPEDEF @tag_0 EXTERNDEF C cptr:PTR FSOUND_CHANNEL .code FSOUND_Mixer_FPU_Ramp2 proc EXPORT ;CODE HERE FSOUND_Mixer_FPU_Ramp2 endp END
странно, что без единой строчки кода и кучей констант и переменных, это вообще хоть как-то работает. а по конкретней. с закрытием чего ошибка?
Как говорил ранее не шарю в асм но думал что код не может быть причиной кроме того он немалый, но если просите приатачил вариант на «С». Это кстати адаптированная часть из minifmod А ошибка просто программа выполнила недопустимую операцию если отладить он ссылается на грабли именно в этой функции а где именно и что конкретно непонятно.
614-89=525 строк с не малым количеством комментариев это большой код (да на форум не выложишь, но кодес не особо и большой) а вы позвольте поинтересоваться так его и вставляете, как есть? просто в конце должна быть команда возврата это раз, c++ генерирует прологи и эпилоги (но это компенсируется) это два, можно попробовать дополнительно обернуть это в свой обработчик ошибки и поправить это (если возможно) это три, но скорее всего на первый взгляд первое
Да так и вставляю.. О спасибо вы мега гуру, просто в C,C++ если void то как бы no return… Заработало но блин не так как надо а это еще хуже чем неработающий код ))) музыка играет но одними ударными или вроде как не хватает одного канал при воспроизведении или несколько сейчас по экспериментирую чтобы понять что выпало может поможет в разборках. Есть еще варианты ? что не так с кодом или переменными ?
В общем покопался немного как-то странно играется пару каналов более менее правильно и темп и все такое но другие как-то скомкано короче тяжело передать, могу дать послушать. И все это в режиме debug в нормальном ничего не играется и программа уходит в какие-то бесконечные вычисления. Короче засада.
Размерность указателя в х64 – 64 бита. Сюрприз, ага. Поясним: для buf, sptr и прочих указателей нужно использовать уже не DWORD, а QWORD. Видимые варианты исправления (либо-либо): 0. Аккуратно переделать ассемблерный код. 1. Переписать всё на Си, без ассемблера (можно попробовать использовать IDA-плагин Hex-Rays для воссоздания Си-кода). 2. Размещать все используемые данные ниже 4х гигабайт, а в сишных структурах (если они используются из Си) объявить указатели с модификатором __ptr32 – в этом случае они будут 32х-битными. Это ужасный хак, но всё же. 3. Оставить программу как есть – в конце всего, х32-приложения отлично работают на х64 винде.
Так все равно пока на х32 делается все, потом уже буду кутить на х64. И собственно хотелось иметь библиотечку для проигрывания xm файлов прямое использование конечно кейгены мини приложения демки и т.д Но дело не в этом непонятно почему нужно что-то переделывать если код и так работает в Inline режиме что есть разница какая-то ? или я чего-то не понимаю ?
>Так все равно пока на х32 делается все Ясно. Тогда сейчас не получится сказать, где ошибка. >код и так работает в Inline режиме что есть разница какая-то ? Разница только в добавляемых инструкциях в прологе\эпилоге – но это зело несущественно и можно сказать, что разницы нет. >непонятно почему нужно что-то переделывать Чтобы было проще портировать на х64. Ассемблерный код – он специфичен для конкретной архитектуры и, скорее всего, в данном случае будет не так уж просто увидеть всякие тонкие моменты при использовании его в другом контексте (тот же размер указателей, другая ABI и всё такое). >иметь библиотечку для проигрывания xm файлов прямое использование конечно кейгены мини приложения демки >asm для меня темный лес Необъяснимое расхождение.
Самый простой способ - заставь свой компилер сгенерить асм-код по сишному коду. А дальше правь уже нагенерированный код как хочешь. Думаю, это будет проще, чем натыкаться на грабли, связанные с особенностями компилятора языка. GCC, Borland и Watcom умеют генерить ассемблерные файлы (именно файлы, а не листинги). Думаю, и MSVC должен уметь. Или какой там у тебя компилятор?
Помогло там оказывается надо было выровнять на 4t и второй нюанс это оптимизация пришлось немного подправить код .asm вроде все заработало. Всем огромное спасибо за помощь! Буду доводить библиотеку доума потом наверно начну пристовать с вопросами про x64 )