将 FindScanline 汇编代码转换为 purepascal

Converting FindScanline assembly code to 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; 

据我了解,正在发生以下事情:

将 ECX 寄存器(值)的内容压入堆栈
将 EDX 寄存器 (MaxLen) 的内容移动到 ECX 寄存器。现在 ECX 持有 (MaxLen)
将 EDI 寄存器的内容移入 EDX 寄存器。现在 EDX 持有 (EDI)
将 EAX 寄存器的内容移入 EDI 寄存器。现在 EDI 持有(来源)
将 ECX 弹出到 EDX。现在 EDX 持有(价值)。 (EDI) 丢失了吗?
重复而相等?为每个字符递减 ECX?
将 ECX 寄存器的内容移入 EAX 寄存器
将 EDX 寄存器的内容移动到 EDI 寄存器

参考函数FindScanline is used in function GetCursorHeightMargin

以上翻译如有帮助,将不胜感激。

直译如下:

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;

不幸的是,处理边缘情况相当混乱。