![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Privet!
Pomogite pojalusto kto znaet algoritm etogo funksii ili mojet perepisat na paskale v assemblera! Mne nada tochno izuchat samiy prostoy funksi pos(substr,str). Zarane SPASSIBO za pomoch! Pos из модуля SysUtils kod takoy: Код:
procedure _Pos{ substr : ShortString; s : ShortString ) : Integer};
asm
{ ->EAX Pointer to substr }
{ EDX Pointer to string }
{ <-EAX Position of substr in s or 0 }
PUSH EBX
PUSH ESI
PUSH EDI
MOV ESI,EAX { Point ESI to substr }
MOV EDI,EDX { Point EDI to s }
XOR ECX,ECX { ECX = Length(s) }
MOV CL,[EDI]
INC EDI { Point EDI to first char of s }
PUSH EDI { remember s position to calculate index }
XOR EDX,EDX { EDX = Length(substr) }
MOV DL,[ESI]
INC ESI { Point ESI to first char of substr }
DEC EDX { EDX = Length(substr) - 1 }
JS @@fail { < 0 ? return 0 }
MOV AL,[ESI] { AL = first char of substr }
INC ESI { Point ESI to 2'nd char of substr }
SUB ECX,EDX { #positions in s to look at }
{ = Length(s) - Length(substr) + 1 }
JLE @@fail
@@loop:
REPNE SCASB
JNE @@fail
MOV EBX,ECX { save outer loop counter }
PUSH ESI { save outer loop substr pointer }
PUSH EDI { save outer loop s pointer }
MOV ECX,EDX
REPE CMPSB
POP EDI { restore outer loop s pointer }
POP ESI { restore outer loop substr pointer }
JE @@found
MOV ECX,EBX { restore outer loop counter }
JMP @@loop
@@fail:
POP EDX { get rid of saved s pointer }
XOR EAX,EAX
JMP @@exit
@@found:
POP EDX { restore pointer to first char of s }
MOV EAX,EDI { EDI points of char after match }
SUB EAX,EDX { the difference is the correct index }
@@exit:
POP EDI
POP ESI
POP EBX
end;Последний раз редактировалось Admin, 03.02.2011 в 09:56. |
|
#2
|
||||
|
||||
|
Могу предложить только на С.
|
|
#3
|
||||
|
||||
|
Код:
function Pos(const SubStr, Str: ShortString): Integer;
var
SubLen, SrcLen, Len, I, J: Integer;
C1: AnsiChar;
begin
SrcLen := Byte(Str[0]);
SubLen := Byte(SubStr[0]);
Result := 0;
if (SubLen <= 0) or (SrcLen <= 0) or (SrcLen < SubLen) then Exit;
// find SubStr[1] in Str[1 .. SrcLen - SubLen + 1]
Len := SrcLen - SubLen + 1;
C1 := SubStr[1];
for I := 1 to Len do
begin
if Str[i] = C1 then
begin
Result := I;
for J := 1 to SubLen-1 do
begin
if Str[I+J] <> SubStr[1+J] then
begin
Result := 0;
break;
end;
end;
if Result <> 0 then Exit;
end;
end;
// not found
end;Нашел у себя в модуле System.pas |
|
#4
|
|||
|
|||
|
Spassibo za otvet!!!
![]() Ya posmotrel fayla System.pas no ne nashol poxojiy kod kak vi mne poslali. Umenya zadacha takoe: Tochno opredelit algoritm POS funksii s dokozatelyom. Esli bi nashol koda vnutri fayla System.pas ya bi dokozal chto tochniy algoritm POS funksii yavlya yutsa takimi. Mojeti mne napsat po podrobne o C:\Program Files\Borland\Delphi7\Source\Rtl\Sys\System.pas Последний раз редактировалось mm_akmal, 08.02.2011 в 18:41. |
|
#5
|
||||
|
||||
|
Использую Delphi XE. Замечал несколько исходников в модуле System.pas, которые переведены со старых версий Delphi с ассемблера на паскаль.
Вот, держи все основные модули от Delphi XE: Ссылка: http://webfile.ru/5116289 Пароль на скачивание: grilab |
|
#6
|
|||
|
|||
|
Spassibo Vi mne ochen pomogli!
![]() |