asm2C: DIV-ы

Тема в разделе "WASM.BEGINNERS", создана пользователем noonv, 3 авг 2005.

  1. noonv

    noonv Member

    Публикаций:
    0
    перевести программу с асм-а на С:

    mov ecx, ccptr

    mov ebx, FSOUND_MixRate

    mov eax, freq

    xor edx, edx

    div ebx

    mov [ecx].speedhi, eax

    div ebx

    mov [ecx].speedlo, eax

    а то я уже с div-ами запарился :))
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    А div_t div(int numer, int denom); не поможет?
     
  3. noonv

    noonv Member

    Публикаций:
    0
    нет - что-то не помогает :dntknw:(((
     
  4. noonv

    noonv Member

    Публикаций:
    0
    // ccptr - это структура

    _структура_* c = ccptr;

    int b = FSOUND_MixRate;

    int a = freq;

    int d=a%b; // сохраняем остаток от деления

    a/=b;

    c->speedhi=a;

    d<<16;

    a|=d;

    a/=b;

    c->speedlo=a;



    но код работает как-то не так :dntknw:(((((((((((((

    в чём трабл?
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Делимое должно быть 64-битным, т.е. нужно так:
    Код (Text):
    1. _int64 a,d;
    2. // ***
    3. d<<32;
    4. a &= 0xFFFFFFFF;
    5. a |= d;
    6. a /= b;


    Но этот код не будет работать, т.к. ANSI C не имеет стандартных 64-битных типов. Хотя VC и поддерживает _int64, но логические операции над ними врядли будут корректно работать.



    Вы решили портировать minifmod и нужен чистый C? А как же FPU ramp? - там ассемблерного кода куда больше.
     
  6. noonv

    noonv Member

    Публикаций:
    0
    ;а вот такой код:

    ;------------

    mov eax, srcptr

    fld [eax]

    add srcptr, 4

    fistp val

    ;------------

    // в такой:

    //

    float * a=srcptr;

    float var= *a;

    a++;



    :))))))))
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0


    Неправильно!
    Код (Text):
    1. int val = (int)(*srcptr);


    srcptr указывает на float.
     
  8. noonv

    noonv Member

    Публикаций:
    0
    2Quantum

    >Вы решили портировать minifmod и нужен чистый C? А как же >FPU ramp? - там ассемблерного кода куда больше.

    так точно! а что делать :derisive:

    этим уже кто-нибудь занимался? что посоветуете?
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    noonv



    Значит портируете... Кроме FPU ramp есть ещё 2 проблемы:

    1. Если вы портируете в не-Win32 среду (а так оно, видимо, и есть), то придётся вам разобраться с WINMM (звук через эту АПИ идёт) и поискать эквивалент WINMM для той платформы, в которую собираетесь портировать. Кстати, minifmod давно есть для Линукса (GCC).

    2. Если вы портируете в не-x86 архитектуру, то перевод на чистый C вам не поможет, т.к. в коде полно зависимостей от little endian и вообще он расчитан на то, что int должен быть 32-битным.





    Кое-кто занимается противоположной задачей - портирование этой либы в чистый asm.
     
  10. noonv

    noonv Member

    Публикаций:
    0
    Quantum

    Линуксовый порт есть. Но он не поможет ибо там тоже есть asm.

    По поводу вопросов.

    1. Здесь проблем не предвидется. Для нашей платформы соответствующий апи есть. Прикрутить его будет не слишком сложно.

    2. Целевая платформа работает на SPARC процессорах. int 32 битный. Используется little endian.
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Не хочу показаться пессимистом, но я бы "ниасилил" перевод FPU ramp на чистый C.