Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Assember to Delphi


Автор: Subway_ 24.12.17, 07:48
Ребят, кто-нибудь может перевести этот 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;

Автор: Славян 24.12.17, 08:23
На Си как-то так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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: Как всегда. Звезду забыл. Так надо:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if( Item==*p ) return ...

Автор: leo 25.12.17, 05:32
REPNE SCASD - это чисто ассемблерная примочка x86 (поиск заданного значения dword в массиве), которая на языке высокого уровня может быть реализована через цикл for или while. Например так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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;

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)