Преобразование ассемблерного кода FindScanline в purepascal

Я пытаюсь преобразовать код Delphi 5 в Delphi XE7-x64, и я застрял на следующем коде:

function FindScanline(Source : Pointer; MaxLen : Cardinal;
  Value : Cardinal) : Cardinal; assembler;
asm
          PUSH    ECX
          MOV     ECX,EDX
          MOV     EDX,EDI
          MOV     EDI,EAX
          POP     EAX
          REPE    SCASB
          MOV     EAX,ECX
          MOV     EDI,EDX
end; 

Насколько я понимаю, происходят следующие вещи:

push the contents of ECX register(Value) onto the stack
move contents of EDX register(MaxLen) into ECX register. now ECX holds (MaxLen)
move contents of EDI register into EDX register. now EDX holds (EDI) 
move contents of EAX register into EDI register. now EDI holds (Source)
pop ECX into EDX. now EDX holds (Value). Was (EDI) lost?
repeat while equal ?decrement ECX for each char?
move contents of ECX register into EAX register
move contents of EDX register into EDI register

Для справочной функции FindScanline используется в функции GetCursorHeightMargin < / а>

Мы будем благодарны за любую помощь в переводе выше.


person AEonAX    schedule 05.02.2015    source источник
comment
Вы всегда должны добавлять общий тег delphi к своим вопросам, связанным с delphi, чтобы иметь правильный синтаксис выделения. и больше внимания на ваш вопрос.   -  person Sir Rufo    schedule 06.02.2015


Ответы (1)


Вот дословный перевод:

function FindScanline(Source: Pointer; MaxLen: Cardinal; Value: Cardinal): Cardinal;
var
  Ptr: PByte;
begin
  Result := MaxLen;
  if Result > 0 then
    dec(Result);
  Ptr := Source;
  while (Result > 0) and (Ptr^ = Value) do
  begin
    inc(Ptr);
    dec(Result);
  end;
end;

К сожалению, обрабатывать крайние случаи довольно беспорядочно.

person David Heffernan    schedule 05.02.2015
comment
Вы, сэр, молодцы _ / \ _ - person AEonAX; 05.02.2015