На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Assember to Delphi
    Ребят, кто-нибудь может перевести этот asm код в Delphi код?

    function TTreeNodeList.IndexOf(Item: TTreeNTNode): Integer; assembler;

    // finds Item's index in the list
    // EAX contains the Self reference (address of this instance)
    // EDX contains Item

    asm
    PUSH EBX
    PUSH EDI
    MOV ECX, EAX.FCount // number of entries
    JECXZ @NotFound // no search, if no entries
    MOV EBX, ECX // keep count for index calc.
    MOV EDI, EAX.FList // start address
    MOV EAX, EDX // search value
    REPNE SCASD // search the value
    JNZ @NotFound // jump if not found
    MOV EAX, EBX
    SUB EAX, ECX // calculate index
    DEC EAX // it's zero-based
    JMP @Finish

    @NotFound: MOV EAX, -1
    @Finish: POP EDI
    POP EBX
    end;
      На Си как-то так:
      ExpandedWrap disabled
        int i = this->FCount;
        if( i ) // можно убрать эту строку; закомментировать
         for( int32 *p=(int32*)this->FList; i>0; i--,p++)
          if( p==Item ) return this->FCount - i;
        return -1;


      Добавлено
      :wall: Как всегда. Звезду забыл. Так надо:
      ExpandedWrap disabled
        if( Item==*p ) return ...
        REPNE SCASD - это чисто ассемблерная примочка x86 (поиск заданного значения dword в массиве), которая на языке высокого уровня может быть реализована через цикл for или while. Например так:
        ExpandedWrap disabled
          function TTreeNodeList.IndexOf(Item: TTreeNTNode): Integer;
          var
            i:integer;
          begin
            for i:=0 to FCount-1 do
              if FList[i] = Item then //или pointer(FList[i]) = pointer(Item), если они формально имеют разные типы указателей
              begin
                Result:=i;
                Exit;
              end;
            Result:=-1;
          end;
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,0736 ]   [ 18 queries used ]   [ Generated: 16.10.18, 19:26 GMT ]