Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 8086中方向标志的使用_Assembly_X86 16 - Fatal编程技术网

Assembly 8086中方向标志的使用

Assembly 8086中方向标志的使用,assembly,x86-16,Assembly,X86 16,我在书中读到,当SI寄存器小于DI寄存器时(在字符串操作中),则方向标志等于0,否则方向标志等于1 但我也读过说明通常不会改变方向标志,那么它的确切用法是什么呢?我们应该根据字符串的第一个和最后一个索引设置或取消设置此标志吗?(我们应该处理这个标志还是让CPU处理它?) 我的上述陈述是否有误?CPU从不自动设置或清除方向标志。这只能通过软件实现 CPU在执行字符串指令时使用方向标志来确定是递增还是递减SI和DI 通常情况下,DF始终处于清除状态。软件应在使用字符串指令之前设置DF,其中SI和DI

我在书中读到,当
SI
寄存器小于
DI
寄存器时(在字符串操作中),则方向标志等于0,否则方向标志等于1

但我也读过说明通常不会改变方向标志,那么它的确切用法是什么呢?我们应该根据字符串的第一个和最后一个索引设置或取消设置此标志吗?(我们应该处理这个标志还是让CPU处理它?)


我的上述陈述是否有误?

CPU从不自动设置或清除方向标志。这只能通过软件实现

CPU在执行字符串指令时使用方向标志来确定是递增还是递减
SI
DI

通常情况下,
DF
始终处于清除状态。软件应在使用字符串指令之前设置
DF
,其中
SI
DI
应递减

您可能希望减小
SI
DI
的一个原因是在执行缓冲区重叠且源地址小于目标地址的内存复制时。在这种情况下,正常正向复制将在读取部分源缓冲区之前覆盖该缓冲区,而反向复制将起作用

反向复制需要
(DS:)SI
ES:DI
指针最初指向要移动的最高元素,而不是最低元素。(仍然是要复制的第一个字节。)


在当前的英特尔CPU(例如Skylake)上,向后
std
/
rep movsb
比向前复制慢得多。以16或32字节块复制的优化微码仅在
cld
/DF=0正向复制情况下激活

例如,在i7-6700k Skylake上,在长模式下,约4.1GHz的频率下,围绕4096字节的
rep movsb
和对齐的源和目标进行1000000次重复循环,总共向前移动了约42毫秒,向后移动了约1000毫秒。实模式下的性能应该类似

repe/ne cmpsb
repe/ne scasb
总是很慢(一次只有1个字节),并且在DF=1和DF=0时可能不慢。只有
rep-mov
rep-sto
具有优化的微码


在早期的x86 CPU(如原始8086到286)上,所有
rep
-字符串指令都具有代码大小小的优点,并且在加载/存储数据时不需要获取指令。而且没有SIMD矢量指令可以用来加快速度。

它不是这样工作的。它与
SI
是否小于
DI
无关。这只与在使用字符串指令时是否希望它们递增或递减有关。好的,那么问题的另一部分是我们应该始终设置它还是CPU处理它呢?请查看或的操作部分,例如:它们只读取DF。