我见过代码
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;
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索了CLD,它说它清除了方向标志......所以这里重要吗?删除后,功能似乎正常.
方向标志控制如果-的执行过程中REP STOSD的EDI寄存器被递增或递减.
在清除方向标志的情况下(例如,在执行之后CLD),指针将递增,因此该函数执行存储器填充.
这CLD是在这段代码中,因为程序员可能无法保证方向标志被清除.因此他确保在执行之前将其清除REP STOSD.
如果代码在CLD删除时有效,则在函数入口处清除方向标志.因为方向标志不是运气惯例的一部分.下次可能是另一种方式,在这种情况下,您的程序很可能会崩溃.
清除/设置标志是一种非常快速的操作,因此最好将它们添加到汇编代码中.这也使其他程序员可以轻松理解您的函数,因为方向标志的状态是明确定义的.