【发布时间】:2016-07-22 22:02:13
【问题描述】:
我使用像这样的简单循环缓冲区
var
Values: array [byte] of single;
ptr: byte;
在这个测试示例中
for ptr:=0 to 10 do Values[Byte(ptr-5)]:=1;
我希望将前 5 个值和后 5 个值设置为 1,但 XE4 编译器生成的代码不正确,它使用 32 位指针数学来计算数组索引:
for ptr:=0 to 10 do Values[Byte(ptr-5)]:=1;
005B94BB C645FB00 mov byte ptr [ebp-$05],$00
005B94BF 33C0 xor eax,eax
005B94C1 8A45FB mov al,[ebp-$05]
005B94C4 C78485E0FBFFFF0000803F mov [ebp+eax*4-$0420],$3f800000
005B94CF FE45FB inc byte ptr [ebp-$05]
005B94D2 807DFB0B cmp byte ptr [ebp-$05],$0b
005B94D6 75E7 jnz $005b94bf
这是我的错误代码吗?操作字节索引的正确方法是什么?
【问题讨论】:
-
这是代码生成器中的一个错误。它以错误的方式“优化”。看我的回答。
-
是的,这是一个编译器错误。很好的收获。
-
是的,确实不错
-
我不同意。我认为你的代码是错误的。为什么你期望环绕?明确地编写自己的环绕代码。
-
@DavidHeffernan 我应该吗?如此深入而有意义的讨论在哪里进行:)
标签: arrays delphi indexing bytebuffer compiler-bug