我看过代码
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上搜索了Google,并说它清除了方向标志...所以在这里重要吗?我删除它后,该功能似乎正常工作。
最佳答案
方向标志控制-在执行REP STOSD
期间,EDI
寄存器是递增还是递减。
如果方向标志已清除(例如在执行CLD
之后),则指针将递增,因此该函数会进行内存填充。CLD
在此代码中,因为程序员可能无法保证清除了方向标志。因此,他确保在执行REP STOSD
之前将其清除。
如果在删除CLD
时该代码有效,则该方向标志在该函数的入口处已清除。由于方向标志不是幸运的调用约定的一部分。下次可能是另一种方式,在这种情况下,您的程序很可能会崩溃。
清除/设置标志是非常快速的操作,因此将它们添加到汇编代码中是一种很好的做法。这也使其他程序员更容易理解您的功能,因为方向标志的状态已明确定义。
关于delphi - CLD在这里做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21387912/