Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.85.72] |
|
Сообщ.
#1
,
|
|
|
Ребят, кто-нибудь может перевести этот 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; |
Сообщ.
#2
,
|
|
|
На Си как-то так:
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; Добавлено Как всегда. Звезду забыл. Так надо: if( Item==*p ) return ... |
Сообщ.
#3
,
|
|
|
REPNE SCASD - это чисто ассемблерная примочка x86 (поиск заданного значения dword в массиве), которая на языке высокого уровня может быть реализована через цикл for или while. Например так:
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; |