Вот столкнулся с трудностями, мало знаю систаксис с++. Помогите перевести на асм ф-и подсчета контрольной суммы для tcp/ip пакета. Вот код Код (Text): USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT); } if(size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } заранее благодарю
Код (Text): mov ebx,[ebp+size] mov esi,[ebp+buffer] xor eax,eax begin_while: cmp ebx,1 jna short not_while mov dword ptr[esi],1 add eax,dword ptr[esi] sub ebx,sizeof(USHORT) jmp begin_while not_while: test ebx,ebx jz short not_size add eax,*(UCHAR*)buffer; // влом not_size: mov edx,eax shr edx,16d and eax,0FFFFh add eax,edx mov edx,eax shr edx,16d add eax,edx not eax // eax - result может это? Сильно небрани, я давно на ассемблере не програмил
EvilsInterrupt Спасибо, очень помог. В принципе была сложность с вот этим участком Код (Text): cksum+=*buffer++; size -=sizeof(USHORT); Помоему чтоб там не говорили а асм проще =) хоть и писать больше нужно. Чисто мое мнение, прошу не критиковать
Noble Ghost Поражаюсь неужели есть такое? Щас попробую. В любом случае с помощью EvilsInterrupt я уже разобрался вроде, но и тебе спасибо
Corleone Да и генерить не фиг было, блин, а я мудрил код писал! Если в визуале С++ 6.0 то там есть глобальный шаг, типа при отладке, выводе окно с ассемблером и смотри с добавкой с++ кода!
и не такое есть =) вот, например, как выглядят интересующие тебя места: Код (Text): ; 97 : cksum+=*buffer++; mov eax, DWORD PTR _buffer$[ebp] xor ecx, ecx mov cx, WORD PTR [eax] mov edx, DWORD PTR _cksum$[ebp] add edx, ecx mov DWORD PTR _cksum$[ebp], edx mov eax, DWORD PTR _buffer$[ebp] add eax, 2 mov DWORD PTR _buffer$[ebp], eax ; 98 : size -=sizeof(USHORT); mov ecx, DWORD PTR _size$[ebp] sub ecx, 2 mov DWORD PTR _size$[ebp], ecx
Правильно вроде построчно разбил? Привожу пример. Да у С++ конечно компилятор неплох, однако этот код на асме можно переписать так чтоб он занимал раза в два меньше 2105797940__test123.asm
EvilsInterrupt а дальше ? на листик код переписывать ? А если функция длиннее и/или их несколько ? Удачи тебе в твоем желании погемороится...
А для этого у компилятора тоже есть угадай что ? Правильно - ключ оптимизации (/Ox например) ...правда к борланду это не относится...