|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
ассемблер -> Paskal
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
|
||||
|
||||
Могу предложить только на С.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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
|
|||
|
|||
Akmal
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
|
|||
|
|||
Akmal
Spassibo Vi mne ochen pomogli!
|