На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2018 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


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,0833 ]   [ 23 queries used ]   [ Generated: 22.01.18, 16:20 GMT ]