x86汇编语言中的CLD和STD是什么?DF做什么?

Mel*_*ika 26 x86 assembly

好吧,我知道CLD清除方向标志和STD设置方向标志.但是设置和清除方向标志的重点是什么?

Dan*_*zar 35

方向标志用于影响字符串指令偏移指针寄存器的方向.这些指令可REP前缀一起使用以重复操作.(虽然lods不是很有用rep).

字符串指令是:( MOVS复制mem到mem),STOS(存储AL/AX/EAX/RAX),SCAS(扫描字符串),CMPS(比较字符串)和LODS(加载字符串).还有ins/ outs用于在内存和IO端口之间进行复制.这些指令中的每一个都以字节,字,双字和qword操作数大小提供.

概括地说,当方向标志是0,该指令通过递增的指针数据每一次迭代后的工作(直到ECX为零或一些其它条件,这取决于风味REP前缀),如果标志是1,而,该指针递减.

例如,movsd将dword复制[ds:esi][es:edi](或64位模式下的rdi),并执行以下操作:(请参阅从英特尔PDF中提取的链接ISA参考手册条目中的"操作"部分)

dword [es:edi] = dword [ds:esi]      // 4-byte copy memory to memory
if (DF == 0)
    esi += 4;
    edi += 4;
else  // DF == 1
    esi -= 4;
    edi -= 4;
fi
Run Code Online (Sandbox Code Playgroud)

使用REP前缀,它执行ECX次,现代x86 CPU优化了"快速字符串"微码,可以stos使用16字节或32字节内部操作进行复制(或存储).另请参阅此有关内存带宽和ERMSB功能的问答.(请注意,只有rep stosrep movs这种方式进行优化,而不是repne/repe scascmps).

  • 这是一个[带断言的最小可运行示例](https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6a9299599e781b29abfce64e4923ab0af3ef731d/userland/arch/x86_64/stos.S)。 (2认同)

小智 8

CLD CLears方向标志,数据继续.STD Sends Direction标志,数据倒退.