CLD在这做什么?

时间:2014-01-27 17:46:34

标签: 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,它说它清除方向标志......所以这里重要吗?删除后,功能似乎正常。

2 个答案:

答案 0 :(得分:6)

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

如果方向标志被清除(例如在执行CLD之后),则指针将递增,因此该函数会进行内存填充。

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

如果代码在移除CLD时有效,则在函数入口处清除方向标志。因为方向标志不是运气惯例的一部分。下次可能是另一种方式,在这种情况下,你的程序很可能会崩溃。

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

答案 1 :(得分:2)

stosd命令可以降低内存,递增EDI或增加内存,减少它。这取决于方向(“D”)标志的值。如果在功能进入时将该标志设置为1并且从未明确清除,那么它将会出错。该标志的默认值没有约定;所以这个功能很安全。

编辑:叶戈尔说德尔福有一个惯例:)然而,比抱歉更安全。