Delphi CLD在这里做什么?

Delphi CLD在这里做什么?,delphi,assembly,Delphi,Assembly,我看过代码 procedure FillDWord(var Dest; Count, What: dword); assembler ; asm PUSH EDI MOV EDI, Dest MOV EAX, What MOV ECX, Count CLD REP STOSD POP EDI end; 我在谷歌上搜索了CLD,它说它清除了方向旗。。。那么它在这里重要吗?在我删除它之后,该函数似乎工作正常。stosd命令可以降低内存,增加EDI,也

我看过代码

procedure FillDWord(var Dest; Count, What: dword); assembler ;
asm
  PUSH EDI
    MOV EDI, Dest
    MOV EAX, What
    MOV ECX, Count
    CLD
    REP STOSD
  POP EDI
end;

我在谷歌上搜索了CLD,它说它清除了方向旗。。。那么它在这里重要吗?在我删除它之后,该函数似乎工作正常。

stosd命令可以降低内存,增加EDI,也可以提高内存,减少EDI。这取决于方向(“D”)标志的值。如果在函数进入时将该标志设置为1,并且从未明确清除,则该标志将异常行为。对于该标志的默认值没有约定;因此,函数可以安全地运行


编辑:Egor说Delphi有一个约定:)不过,安全总比抱歉好。

方向标志控制在执行
REP STOSD
期间,
EDI
寄存器是否会递增或递减

在清除方向标志的情况下(例如,在执行
CLD
之后),指针将递增,因此函数会进行内存填充

CLD
在此代码中,因为程序员可能无法保证方向标志已清除。因此,他确保在执行
REP STOSD
之前将其清除

如果删除
CLD
时代码起作用,则在函数输入处方向标志清除。因为方向标志不是调用约定的一部分,这只是运气。下次可能是另一种情况,在这种情况下,您的程序很可能会崩溃


清除/设置标志是一个非常快速的操作,因此最好将它们添加到汇编代码中。这也使得其他程序员很容易理解您的函数,因为方向标志的状态是明确定义的。

CLD
可能会被省略,因为由于汇编代码的Delphi规则,必须清除方向标志。建议使用其他措辞:“递增或不递增”听起来似乎寄存器可以保持不变。如果它说“递增或递减”会更清楚。@Michael谢谢你在我的答案上的演讲。