将FindScanline汇编代码转换为纯Pascal

3

我正在尝试将一些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包含(Source) 将ECX弹出到EDX。现在,EDX包含(Value)。是否丢失了(EDI)? 重复直到相等为止?每个字符递减ECX? 将ECX寄存器的内容移动到EAX寄存器中 将EDX寄存器的内容移动到EDI寄存器中
对于参考函数FindScanline在函数GetCursorHeightMargin中使用。
如果需要翻译帮助,请随时联系。

你应该始终将通用的 [tag:delphi] 标签添加到与 Delphi 相关的问题中,以获得正确的语法高亮和更多的关注。 - Sir Rufo
1个回答

5

这是一个字面翻译:

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;

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


您真棒!_/\_ - AEonAX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接