Конверсия .с в .asm (проблемы с переменными)

Тема в разделе "WASM.BEGINNERS", создана пользователем Sekator, 30 авг 2009.

  1. Sekator

    Sekator New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2009
    Сообщения:
    7
    Собственно есть сишный файл с функцией на inline assembly требуется его перевод в .asm дабы была возможность скомпилть под win x64 ибо Visual Studio 2008 __asm теги игнорирует.
    Поскольку asm для меня темный лес естественно ничего не получилось вот что удалось состряпать почему не работает хз, может мега гуру мне подскажут ))


    Это вариант на «С» который полностью работает
    Код (Text):
    1. #define FSOUND_LOOP_NORMAL 0x02
    2. #define FSOUND_LOOP_BIDI 0x04
    3. #define FSOUND_OUTPUTBUFF_END 0
    4. #define FSOUND_SAMPLEBUFF_END 1
    5. #define FSOUND_MIXDIR_FORWARDS 1
    6. #define FSOUND_MIXDIR_BACKWARDS 2
    7.  
    8. extern unsigned int mix_numsamples;
    9. extern unsigned int mix_mixptr;
    10. extern unsigned int mix_mixbuffend;
    11. extern unsigned int mix_mixbuffptr;
    12. extern unsigned int mix_endflag;
    13. extern unsigned int mix_sptr;
    14. extern unsigned int mix_cptr;
    15. extern unsigned int mix_count;
    16. extern unsigned int mix_samplebuff;
    17. extern float     mix_leftvol;
    18. extern float     mix_rightvol;
    19. extern unsigned int mix_temp1;
    20. extern unsigned int mix_count_old;
    21. extern unsigned int mix_rampleftvol;
    22. extern unsigned int mix_ramprightvol;
    23. extern unsigned int mix_rampcount;
    24. extern unsigned int mix_rampspeedleft;
    25. extern unsigned int mix_rampspeedright;
    26. extern unsigned int mix_volumerampsteps;
    27. extern float     mix_1overvolumerampsteps;
    28. extern const float  mix_255;   
    29. extern const float  mix_256;
    30. extern const float  mix_1over255;
    31. extern const float  mix_1over256;
    32. extern const float  mix_1over2gig;
    33.  
    34. typedef struct FSOUND_SAMPLE {
    35.     unsigned char * buff;
    36.     unsigned int length;
    37.     unsigned int loopstart;
    38.     unsigned int looplen;
    39.     unsigned char defvol;
    40.     signed char finetune;
    41.     int deffreq;
    42.     int defpan;
    43.     unsigned char bits;
    44.     unsigned char loopmode;
    45.     unsigned char globalvol;
    46.     signed char relative;
    47.     int middlec;
    48.     unsigned int susloopbegin;
    49.     unsigned int susloopend;
    50.     unsigned char vibspeed;
    51.     unsigned char vibdepth;
    52.     unsigned char vibtype;
    53.     unsigned char vibrate;
    54.  
    55. } FSOUND_SAMPLE;
    56.  
    57. typedef struct {
    58.     int index;
    59.     int volume;
    60.     int frequency;
    61.     int pan;
    62.     int actualvolume;
    63.     int actualpan;
    64.     unsigned int sampleoffset;
    65.     FSOUND_SAMPLE * sptr;
    66.     unsigned int leftvolume;
    67.     unsigned int rightvolume;
    68.     unsigned int mixpos;
    69.     unsigned int mixposlo;
    70.     unsigned int speedlo;
    71.     unsigned int speedhi;
    72.     unsigned int speeddir;
    73.     unsigned int ramp_lefttarget;
    74.     unsigned int ramp_righttarget;
    75.     unsigned int ramp_leftvolume;
    76.     unsigned int ramp_rightvolume;
    77.     unsigned int ramp_leftspeed;
    78.     unsigned int ramp_rightspeed;
    79.     unsigned int ramp_count;
    80. } FSOUND_CHANNEL;
    81.  
    82. extern FSOUND_CHANNEL * cptr;
    83.  
    84.  
    85. void FSOUND_Mixer_FPU_Ramp() {
    86.  
    87.         __asm  {
    88.  
    89.                       //CODE HERE
    90.  
    91.         }
    92. }
    И это что получилось все компилится но при запуске полный ахтунг в смысле ошибка с закрытием
    Код (Text):
    1. .486
    2. .model flat, stdcall
    3. option casemap :none
    4.  
    5.  
    6. .data
    7.  
    8. FSOUND_LOOP_NORMAL      EQU     000000002h
    9. FSOUND_LOOP_BIDI        EQU     000000004h
    10. FSOUND_OUTPUTBUFF_END       EQU     0t
    11. FSOUND_SAMPLEBUFF_END       EQU     1t
    12. FSOUND_MIXDIR_FORWARDS      EQU     1t
    13. FSOUND_MIXDIR_BACKWARDS     EQU     2t
    14.  
    15. EXTERNDEF C mix_numsamples:DWORD
    16. EXTERNDEF C mix_mixptr:DWORD
    17. EXTERNDEF C mix_mixbuffend:DWORD
    18. EXTERNDEF C mix_mixbuffptr:DWORD
    19. EXTERNDEF C mix_endflag:DWORD
    20. EXTERNDEF C mix_sptr:DWORD
    21. EXTERNDEF C mix_cptr:DWORD
    22. EXTERNDEF C mix_count:DWORD
    23. EXTERNDEF C mix_samplebuff:DWORD
    24. EXTERNDEF C mix_leftvol:REAL4
    25. EXTERNDEF C mix_rightvol:REAL4
    26. EXTERNDEF C mix_temp1:DWORD
    27. EXTERNDEF C mix_count_old:WORD
    28. EXTERNDEF C mix_rampleftvol:DWORD
    29. EXTERNDEF C mix_ramprightvol:DWORD
    30. EXTERNDEF C mix_rampcount:DWORD
    31. EXTERNDEF C mix_rampspeedleft:DWORD
    32. EXTERNDEF C mix_rampspeedright:DWORD
    33. EXTERNDEF C mix_volumerampsteps:DWORD
    34. EXTERNDEF C mix_1overvolumerampsteps:REAL4
    35. EXTERNDEF C mix_255:REAL4
    36. EXTERNDEF C mix_256:REAL4
    37. EXTERNDEF C mix_1over255:REAL4
    38. EXTERNDEF C mix_1over256:REAL4
    39. EXTERNDEF C mix_1over2gig:REAL4
    40.  
    41. @t_0        TYPEDEF     PTR BYTE
    42. FSOUND_SAMPLE       STRUCT 2t
    43. buff        @t_0        ?
    44. _length     DWORD       ?
    45. loopstart       DWORD       ?
    46. looplen     DWORD       ?
    47. defvol      BYTE        ?
    48. finetune        SBYTE       ?
    49. deffreq     SDWORD      ?
    50. defpan      SDWORD      ?
    51. bits        BYTE        ?
    52. loopmode        BYTE        ?
    53. globalvol       BYTE        ?
    54. relative        SBYTE       ?
    55. middlec     SDWORD      ?
    56. susloopbegin        DWORD       ?
    57. susloopend      DWORD       ?
    58. vibspeed        BYTE        ?
    59. vibdepth        BYTE        ?
    60. vibtype     BYTE        ?
    61. vibrate     BYTE        ?
    62. FSOUND_SAMPLE       ENDS
    63.  
    64. @t_1        TYPEDEF     PTR FSOUND_SAMPLE
    65. @tag_0      STRUCT 2t
    66. index       SDWORD      ?
    67. volume      SDWORD      ?
    68. frequency       SDWORD      ?
    69. pan     SDWORD      ?
    70. actualvolume        SDWORD      ?
    71. actualpan       SDWORD      ?
    72. sampleoffset        DWORD       ?
    73. sptr        @t_1        ?
    74. leftvolume      DWORD       ?
    75. rightvolume     DWORD       ?
    76. mixpos      DWORD       ?
    77. mixposlo        DWORD       ?
    78. speedlo     DWORD       ?
    79. speedhi     DWORD       ?
    80. speeddir        DWORD       ?
    81. ramp_lefttarget     DWORD       ?
    82. ramp_righttarget        DWORD       ?
    83. ramp_leftvolume     DWORD       ?
    84. ramp_rightvolume        DWORD       ?
    85. ramp_leftspeed      DWORD       ?
    86. ramp_rightspeed     DWORD       ?
    87. ramp_count      DWORD       ?
    88. @tag_0      ENDS
    89.  
    90. FSOUND_CHANNEL      TYPEDEF     @tag_0
    91. EXTERNDEF       C cptr:PTR FSOUND_CHANNEL
    92.  
    93. .code
    94.  
    95.  
    96. FSOUND_Mixer_FPU_Ramp2 proc EXPORT
    97.  
    98.           ;CODE HERE
    99.  
    100. FSOUND_Mixer_FPU_Ramp2 endp
    101. END
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    странно, что без единой строчки кода и кучей констант и переменных, это вообще хоть как-то работает. а по конкретней. с закрытием чего ошибка?
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    уточню (для придирчивых к словам)
     
  4. Sekator

    Sekator New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2009
    Сообщения:
    7
    Как говорил ранее не шарю в асм но думал что код не может быть причиной кроме того он немалый, но если просите приатачил вариант на «С». Это кстати адаптированная часть из minifmod

    А ошибка просто программа выполнила недопустимую операцию если отладить он ссылается на грабли именно в этой функции а где именно и что конкретно непонятно.
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    614-89=525 строк с не малым количеством комментариев это большой код (да на форум не выложишь, но кодес не особо и большой)
    а вы позвольте поинтересоваться так его и вставляете, как есть?
    просто в конце должна быть команда возврата это раз, c++ генерирует прологи и эпилоги (но это компенсируется) это два, можно попробовать дополнительно обернуть это в свой обработчик ошибки и поправить это (если возможно) это три, но скорее всего на первый взгляд первое
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    после pop ebp поставьте команду ret в ассемблерном варианте
     
  7. Sekator

    Sekator New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2009
    Сообщения:
    7
    Да так и вставляю..
    О спасибо вы мега гуру, просто в C,C++ если void то как бы no return… Заработало но блин не так как надо а это еще хуже чем неработающий код ))) музыка играет но одними ударными или вроде как не хватает одного канал при воспроизведении или несколько сейчас по экспериментирую чтобы понять что выпало может поможет в разборках.

    Есть еще варианты ? что не так с кодом или переменными ?
     
  8. Sekator

    Sekator New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2009
    Сообщения:
    7
    В общем покопался немного как-то странно играется пару каналов более менее правильно и темп и все такое но другие как-то скомкано короче тяжело передать, могу дать послушать. И все это в режиме debug в нормальном ничего не играется и программа уходит в какие-то бесконечные вычисления. Короче засада.
     
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Размерность указателя в х64 – 64 бита. Сюрприз, ага.
    Поясним: для buf, sptr и прочих указателей нужно использовать уже не DWORD, а QWORD.
    Видимые варианты исправления (либо-либо):
    0. Аккуратно переделать ассемблерный код.
    1. Переписать всё на Си, без ассемблера (можно попробовать использовать IDA-плагин Hex-Rays для воссоздания Си-кода).
    2. Размещать все используемые данные ниже 4х гигабайт, а в сишных структурах (если они используются из Си) объявить указатели с модификатором __ptr32 – в этом случае они будут 32х-битными. Это ужасный хак, но всё же.
    3. Оставить программу как есть – в конце всего, х32-приложения отлично работают на х64 винде.
     
  10. Sekator

    Sekator New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2009
    Сообщения:
    7
    Так все равно пока на х32 делается все, потом уже буду кутить на х64. И собственно хотелось иметь библиотечку для проигрывания xm файлов прямое использование конечно кейгены мини приложения демки и т.д
    Но дело не в этом непонятно почему нужно что-то переделывать если код и так работает в Inline режиме что есть разница какая-то ? или я чего-то не понимаю ?
     
  11. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    >Так все равно пока на х32 делается все
    Ясно. Тогда сейчас не получится сказать, где ошибка.

    >код и так работает в Inline режиме что есть разница какая-то ?
    Разница только в добавляемых инструкциях в прологе\эпилоге – но это зело несущественно и можно сказать, что разницы нет.

    >непонятно почему нужно что-то переделывать
    Чтобы было проще портировать на х64. Ассемблерный код – он специфичен для конкретной архитектуры и, скорее всего, в данном случае будет не так уж просто увидеть всякие тонкие моменты при использовании его в другом контексте (тот же размер указателей, другая ABI и всё такое).

    >иметь библиотечку для проигрывания xm файлов прямое использование конечно кейгены мини приложения демки
    >asm для меня темный лес
    Необъяснимое расхождение.
     
  12. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Самый простой способ - заставь свой компилер сгенерить асм-код по сишному коду. А дальше правь уже нагенерированный код как хочешь. Думаю, это будет проще, чем натыкаться на грабли, связанные с особенностями компилятора языка.
    GCC, Borland и Watcom умеют генерить ассемблерные файлы (именно файлы, а не листинги). Думаю, и MSVC должен уметь. Или какой там у тебя компилятор?
     
  13. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Sekator
    Выравнивание в структуре проверить надо. Компилируй в C с опцией генерации ассемблера.
     
  14. Sekator

    Sekator New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2009
    Сообщения:
    7
    Помогло там оказывается надо было выровнять на 4t и второй нюанс это оптимизация пришлось немного подправить код .asm вроде все заработало.


    Всем огромное спасибо за помощь! Буду доводить библиотеку доума потом наверно начну пристовать с вопросами про x64 :))