我见过代码
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,它说它清除方向标志......所以这里重要吗?删除后,功能似乎正常。
答案 0 :(得分:6)
方向标志控制是否 - 在执行REP STOSD
期间EDI
寄存器将递增或递减。
如果方向标志被清除(例如在执行CLD
之后),则指针将递增,因此该函数会进行内存填充。
CLD
在此代码中,因为程序员可能无法保证方向标志已被清除。因此,他确保在执行REP STOSD
之前将其清除。
如果代码在移除CLD
时有效,则在函数入口处清除方向标志。因为方向标志不是运气惯例的一部分。下次可能是另一种方式,在这种情况下,你的程序很可能会崩溃。
清除/设置标志是一种非常快速的操作,因此最好将它们添加到汇编代码中。这也使其他程序员很容易理解你的函数,因为方向标志的状态是明确定义的。
答案 1 :(得分:2)
stosd
命令可以降低内存,递增EDI或增加内存,减少它。这取决于方向(“D”)标志的值。如果在功能进入时将该标志设置为1并且从未明确清除,那么它将会出错。该标志的默认值没有约定;所以这个功能很安全。