Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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; Добавлено Как всегда. Звезду забыл. Так надо: <{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; |