Помогите перевести код с C++ на ассемблер(masm32)

Тема в разделе "WASM.BEGINNERS", создана пользователем Guest, 3 янв 2006.

  1. Guest

    Guest Guest

    Публикаций:
    0
    Вот столкнулся с трудностями, мало знаю систаксис с++. Помогите перевести на асм ф-и подсчета контрольной суммы для tcp/ip пакета. Вот код


    Код (Text):
    1.  
    2. USHORT checksum(USHORT *buffer, int size)
    3. {
    4.     unsigned long cksum=0;
    5.     while(size >1)
    6.     {
    7.         cksum+=*buffer++;
    8.         size -=sizeof(USHORT);
    9.     }
    10.     if(size)
    11.     {
    12.         cksum += *(UCHAR*)buffer;
    13.     }
    14.     cksum = (cksum >> 16) + (cksum & 0xffff);
    15.     cksum += (cksum >>16);
    16.     return (USHORT)(~cksum);
    17. }
    18.  




    заранее благодарю
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1.  
    2.     mov ebx,[ebp+size]
    3.     mov esi,[ebp+buffer]
    4.     xor eax,eax
    5. begin_while:
    6.     cmp ebx,1
    7.     jna short   not_while
    8.     mov dword ptr[esi],1
    9.     add eax,dword ptr[esi]
    10.     sub ebx,sizeof(USHORT)
    11.     jmp begin_while
    12. not_while:
    13.     test    ebx,ebx
    14.     jz  short   not_size
    15.     add eax,*(UCHAR*)buffer;    // влом
    16. not_size:
    17.     mov edx,eax
    18.     shr edx,16d
    19.     and eax,0FFFFh
    20.     add eax,edx
    21.     mov edx,eax
    22.     shr edx,16d
    23.     add eax,edx
    24.       not   eax
    25. // eax - result
    26.  


    может это? Сильно небрани, я давно на ассемблере не програмил
     
  3. Guest

    Guest Guest

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

    Спасибо, очень помог.

    В принципе была сложность с вот этим участком
    Код (Text):
    1.  
    2.         cksum+=*buffer++;
    3.         size -=sizeof(USHORT);
    4.  


    Помоему чтоб там не говорили а асм проще =) хоть и писать больше нужно. Чисто мое мнение, прошу не критиковать
     
  4. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia
    вруби опцию "generate asm file" в любом сишном компиляторе и возрадуйся.
     
  5. Guest

    Guest Guest

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

    Поражаюсь неужели есть такое? Щас попробую. В любом случае

    с помощью EvilsInterrupt я уже разобрался вроде, но и тебе спасибо
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Corleone

    Да и генерить не фиг было, блин, а я мудрил код писал! Если в визуале С++ 6.0 то там есть глобальный шаг, типа при отладке, выводе окно с ассемблером и смотри с добавкой с++ кода!
     
  7. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia
    и не такое есть =)

    вот, например, как выглядят интересующие тебя места:
    Код (Text):
    1. ; 97   :         cksum+=*buffer++;
    2.  
    3.     mov eax, DWORD PTR _buffer$[ebp]
    4.     xor ecx, ecx
    5.     mov cx, WORD PTR [eax]
    6.     mov edx, DWORD PTR _cksum$[ebp]
    7.     add edx, ecx
    8.     mov DWORD PTR _cksum$[ebp], edx
    9.     mov eax, DWORD PTR _buffer$[ebp]
    10.     add eax, 2
    11.     mov DWORD PTR _buffer$[ebp], eax
    12.  
    13. ; 98   :         size -=sizeof(USHORT);
    14.  
    15.     mov ecx, DWORD PTR _size$[ebp]
    16.     sub ecx, 2
    17.     mov DWORD PTR _size$[ebp], ecx
     
  8. Guest

    Guest Guest

    Публикаций:
    0
    Спасибо, мужики, выручили
     
  9. Guest

    Guest Guest

    Публикаций:
    0
    Правильно вроде построчно разбил? Привожу пример.

    Да у С++ конечно компилятор неплох, однако этот код на асме можно переписать так чтоб он занимал раза в два меньше

    [​IMG] 2105797940__test123.asm
     
  10. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia


    hint -> optimize by size ;)
     
  11. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    LOL!

    Матчасть учить кто будет ? На предмет ключа компилятора /Fa или /S (для borland c++)
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    infern0

    Зачем кучу действий делать, когда в отлдадчик залезть одним нажатием кнопки?
     
  13. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    EvilsInterrupt

    а дальше ? на листик код переписывать ? А если функция длиннее и/или их несколько ? Удачи тебе в твоем желании погемороится...
     
  14. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    А для этого у компилятора тоже есть угадай что ? Правильно - ключ оптимизации (/Ox например)



    ...правда к борланду это не относится...