Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.02.2011, 22:56
mm_akmal mm_akmal вне форума
Прохожий
 
Регистрация: 04.01.2011
Сообщения: 5
Репутация: 10
По умолчанию ассемблер -> 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  
Старый 02.02.2011, 23:13
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Могу предложить только на С.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 05.02.2011, 22:19
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Код:
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  
Старый 08.02.2011, 18:23
mm_akmal mm_akmal вне форума
Прохожий
 
Регистрация: 04.01.2011
Сообщения: 5
Репутация: 10
По умолчанию 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  
Старый 09.02.2011, 22:01
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Использую Delphi XE. Замечал несколько исходников в модуле System.pas, которые переведены со старых версий Delphi с ассемблера на паскаль.

Вот, держи все основные модули от Delphi XE:
Ссылка: http://webfile.ru/5116289
Пароль на скачивание: grilab
Ответить с цитированием
  #6  
Старый 10.02.2011, 20:52
mm_akmal mm_akmal вне форума
Прохожий
 
Регистрация: 04.01.2011
Сообщения: 5
Репутация: 10
По умолчанию Akmal

Spassibo Vi mne ochen pomogli!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter