Нужно сравнить строки в обратной последовательности, не работает код. Не знаю где копать -------- Function CompareStr_Back(const pStrA,pStrB;Length:integer):boolean; asm PUSH ESI // сохраним регистры PUSH EDI MOV ESI,EAX MOV EDI,EDX ADD EDI,Length // поставим смещение на конец строки ADD ESI,Length MOV ECX,Length // СЧЕТЧИК SHR ECX,2 // что бы сравнивать 4 байтами XOR EAX,EAX STD // флаг DF=1 REPE CMPSD CLD // обратно флаг JNE @EXIT MOV EAX,1 @EXIT POP EDI POP ESI end; -------- PS: Знаю, что нужно еще остаток проверять, этот код применый. Если длинные строки, то не правильное сравнение, хоть тресни слева-направо нормально, а права на лево глюк.
Если это паскалевский register-вызов, то Length передается в ECX: Код (Text): lea edi,[edi+ecx-4] lea esi,[esi+ecx-4] shr ecx,2
leo Тогда уж сразу lea edi,[eax+ecx-4] lea esi,[edx+ecx-4] tyug это у него true/false результат так возвращается, а ":" потеряно скорее всего очепятка.
sub edi,4 - не помогает Почему Count не через, EAX, там у меня больше параметров и Length на стеке находится у меня параметры реальные: (const pStrA,pStrB;OfsA.OfsB,Length:integer):boolean; где делается ADD EDI,OfsA ADD ESI,OfsB ADD EDI,Count я привел для простоты Это не полный код из исходника, а написанный руками. MOV EAX,1 // булевское True @EXIT: // тут двоеточее дб
AQSW Ну и зря Код (Text): Проще объявить function CompareStr_Back(pFromA,pFromB:pChar;Len:integer):boolean;register; и вызывать CompareStr_Back(pChar(pStrA)+OffsA,pChar(pStrB)+OffsB,Len); И вообще, лучше привести полный код, а не "1 пишем, 2 в уме", т.к. ошибка м.б. и именно в этом "уме"
неправильно так делать REP CMPSD, если неизвестна длина. делайте REP CMPSB. Код (Text): PUSH ESI // сохраним регистры PUSH EDI MOV ESI,EAX MOV EDI,EDX MOV ECX,Length // СЧЕТЧИК XOR EAX,EAX TEST ecx ecx JLE @EXIT LEA EDI, D$edi+ecx-1 // поставим смещение на конец строки LEA ESI, D$esi+ecx-1 STD // флаг DF=1 REPE CMPSD CLD // обратно флаг SETZ AL @EXIT: POP EDI POP ESI endp;
Согласен, но когда пихаешь, все что под руку попадется (разные типы), то закалебывает писать эту арифметику в скобках с ^. А на счет кода, на машине которой все кодится нет инета, а руками переписывать вломы. В общем фишка была в том, что при CMPSD указатель в EDI, дб на первом символе (слева-направо), т.к. это DWord, а при CMPSD на последнем символе. Так что был прав: Усе заработало. Тест я неиспользовал, т.к. в ECX нули будут после сдвига и CMPSD выполнятся не будет, а после REPE CMPSD JNE @EXIT я добавил: ADD ESI,3 ADD EDI,3 MOV ECX,EDX // В EDX нах-ся остаток DWord: MOV EDX,Length AND EDX,3 REPE CMPSB // смотрим в остатке JNE @EXIT PS: Спасибо коллеги за участие. Усе получилось!!!