将 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;
不幸的是,处理边缘情况相当混乱。
我正在尝试将一些 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;
不幸的是,处理边缘情况相当混乱。