【发布时间】:2017-01-10 05:59:54
【问题描述】:
在我的一个软件项目中,我“需要”尽可能快的速度来实现紧密循环,该循环将索引数据从数组复制到同一数组的不同部分。
请考虑这个 freepascal 代码:
TYPE
tIndex : ARRAY OF BYTE;
tValues: ARRAY OF CARDINAL;
VAR
Index : tIndex;
Values: tValues;
CONST
AnyCardinalSize = 65535;
PROCEDURE InitializeArrays;
BEGIN
SetLength(Index, AnyCardinalSize);
SetLength(Values,AnyCardinalSize);
END;
PROCEDURE MoveData(CONST StartPosition,EndPosition,TargetPosition : CARDINAL);
VAR {Note: TargetPosition is ALWAYS larger than EndPosition.}
x, InsertOffset : CARDINAL;
BEGIN
InsertOffset := TargetPosition-StartPosition;
FOR x := StartPosition TO EndPosition DO BEGIN
Values[x+InsertOffset] := Values[Index[x]];
END;
END;
我的例程 MoveData 按预期工作,但我想研究用汇编代码替换它的可能性,以便在可能的情况下获得一点速度。
如果有人有如何用汇编语言完成此操作的示例,我将不胜感激。我在 Commodore 64 上做过一些 ASM,但那是很久以前的事了。
【问题讨论】:
-
为什么你觉得手卷 asm 会比编译器做得更好?
-
一个好的编译器完全能够生成代码来高效地读写数据。不,Stack Overflow 并不是要让其他人编写代码,因为他们缺少某些技能。它是供其他人使用的问答资源,而不仅仅是您。一个好的问题将对不是你的未来读者有价值。这不是代码编写服务。
-
不,我完全不是这么说的。您的问题看起来好像您希望我们为您编写代码。这不是 SO 的意义所在。涵盖在help center 和元数据上。我建议你花一些时间在那里了解更多信息。我想让你解释一下为什么你觉得 asm 会带来好处。您不会这样做,而是说因为您对 asm 一无所知,所以您希望我们为您编写代码。这将如何使任何人受益?不管怎样,如果你不想听我的话,坚持认为这个问题本来就很好,很好。祝你好运。
-
首先是通过反汇编器分析asm代码:Lazarus IDE Window: Assembler
-
第二,阅读documentation如何在freepascal中使用程序集。
标签: assembly x86 freepascal