STOSB 使用额外的段是否有任何特殊原因?

Is there any special reason for STOSB to use extra segment?

我读过 STOSB 的功能是这样的:

ES:[DI] <-- AL

如果 DF = 0 递增 DI 否则递减 DI

So why STOSB doesn't change DS:[DI]

因为此定义会与已经使用 DS:[SI]LODSB 的使用发生冲突。使用单独的段寄存器可为您提供更大的灵活性。

Is there a special purpose for using extra segment?

是的。在处理它们时,您可以轻松地在段之间传输字节。例如,您可以使用 LODSBDS:[SI] 加载 AL,修改 AL 然后将其存储到不同的段,即 Extra SegmentSTOSB 使用 ES:[DI]。在具有 16 位段大小和 20 位地址的 8086 中 space 这非常有用。

另一个说明用法的指令是 REP MOVSB 指令,它复制一个字节序列(其长度在 CX 中)从 DS:[SI]ES:[DI]

(如果您不需要在复制时检查每个字节,您只需使用 rep movsbrep movsw 以获得比 lods/[=25 更好的性能=]循环。)

In most string instructions we use extra segment. why?

嗯,不是大多数,但可能大约有一半。使用另一个段寄存器可以让您快速访问不同的段 - 您不仅限于处理一个 64KB 段中的数据,而且不必在每次访问不同段之前更改 DS 寄存器。

stosmovs写成es:[di],这是有道理的,因为DI是"destination index"寄存器。

cmpsscases:[di] 读取,这对 scas 来说可能令人惊讶,因为它只有一个内存操作数,所以您可能希望它从 ds:[si] 喜欢 lods。特别是因为 SCASBAL - [mem] 设置标志,而不是相反,所以它就像一个 cmp,其中内存是右操作数(源),而不是左操作数(目标)。喜欢 cmp al, es:[di].

也许 8086 指令集的架构师想象了一个循环的用例,该循环执行 lodsscas 以在段之间实现 strcmp