我写的是memcpy
& C模块的memmove
(使用x86 gcc 4.8.2编译)。他们使用字符串指令:
cld
rep movsb
或
std
rep movsb
但是,第二个没有用。经过一些尝试,我尝试了这段代码。
std
rep movsb
cld ; this
然后一切顺利......但为什么? ABI说DF总是0?为什么呢?
如果是这样,我可以在第一个代码中删除cld
吗?
; cld <-- removed
rep movsb
答案 0 :(得分:2)
虽然在技术上不是这些事情中的权威词,但它很接近:agner fog写了一系列关于优化的系列,其中包括有关ABI规范的信息,其中包括有关不同架构,操作系统,编译器等的信息。我发现了类似的声明我将在x86-64 ABI中引用,但其标题表明它可能是AMD特定的,所以我跳过了这个参考。
引用他们的文件Calling conventions for different C++ compilers:
方向标志
方向标志的规则在所有系统中都是相同的。方向标志默认清除。如果设置了方向标志,则必须在任何呼叫或返回之前再次清除 。一些编译器和子程序库依赖于始终清晰的方向标志(Microsoft,Watcom,Digital Mars),而其他系统使用双重安全策略,始终保持方向标志清除,但不依赖于接收它清除(Borland,Gnu)。
...重点补充说明了我要说的内容:在cld
任何movsb
指令之前看到的示例代码是CYA移动,以防其他人违反ABI