gpt4 book ai didi

delphi - 为什么 Delphi "for"会这样?

转载 作者:行者123 更新时间:2023-12-02 12:23:25 25 4
gpt4 key购买 nike

Delphi XE2,简单代码:

function FastSwap(Value: uint16): uint16; register; overload;
asm
bswap eax
shr eax, 16
end;
...
type
PPicEleHdr = ^TPicEleHdr;

TPicEleHdr = packed record
zero, size, count: word;
end;
var
count: integer;
buf: TBytes;
begin
...
peh := @buf[offs];
count := integer(FastSwap(peh.count));
for i := 0 to count - 1 do begin

这里我在CPU窗口中看到

UnitExtract.pas.279: for i := 0 to count - 1 do begin
0051E459 8B45DC mov eax,[ebp-$24]
0051E45C 48 dec eax
0051E45D 85C0 test eax,eax
0051E45F 0F82CD000000 jb $0051e532
0051E465 40 inc eax
0051E466 8945AC mov [ebp-$54],eax
0051E469 C745F400000000 mov [ebp-$0c],$00000000

因此,当 count 为 0 时,任何操作都无法正常工作,test eax, eax(eax = $FFFFFFFF after dec eax)不会影响进位标志而jb则通过进位标志起作用。关于使用 for 有什么我不明白的地方吗?

最佳答案

通过逆向工程过程,我推断 i 是一个无符号 32 位整数,Cardinal。因此编译器在无符号上下文中执行 for 循环算术。这意味着 Count-1 被解释为无符号,因此循环从 0 运行到 high(i)

为了充实这一点,这是一步一步发生的事情:

  • 计数$00000000
  • Count-1 已计算并具有值 $FFFFFFFF
  • 解释为无符号整数 $FFFFFFFF 为 232-1。
  • 循环体对所有值 0 <= i < 232 执行。

解决方案是使循环变量为有符号整数,例如Integer

当您将 i 切换为 Integer 类型时,会发生以下情况:

  • 计数$00000000
  • Count-1 已计算并具有值 $FFFFFFFF
  • 解释为有符号整数 $FFFFFFFF 为 -1。
  • 循环体不执行。

关于delphi - 为什么 Delphi "for"会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16714974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com