对于 8086,可以覆盖源索引 SI 的段以使用 ES 而不是 DS。在一本书(旧的 Scanlon)中,我找到了这个 MASM 代码:
LEA SI,ES:HERE
LEA DI,ES:THERE
MOVSB
由于 LEA 仅检索内存地址的偏移量(8086 为 16 位), MOVSB 如何知道 SI 指的是 ES 段而不是 DS 段? LEA 是否正在更改 SI 的默认段?在我找到的许多页面和手册中,我都没有读到任何相关内容。
最佳答案
该代码看起来不对。如果没有段覆盖前缀,movsb
将始终使用 DS:SI
和 ES:DI
。除非您不得不担心古老处理器的勘误表,否则您可以通过为 movsb
提供段覆盖前缀来使此代码正常工作。 es:MOVSB
将告诉它使用 ES:SI
而不是 DS:SI
。 movsb
总是复制到 ES:DI
;没有段覆盖前缀会改变它。
如果保证 DS 在此位置等于 ES,则代码实际上可能是正确的。旧的汇编器有他们自己的想法,有时必须使用有趣的段覆盖来让汇编器开心。
关于assembly - MASM 字符串指令 - 在实模式下段寄存器覆盖前面的 LEA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70660189/