assembly - MASM 字符串指令 - 在实模式下段寄存器覆盖前面的 LEA?

标签 assembly x86-16 masm memory-segmentation

对于 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:SIES:DI。除非您不得不担心古老处理器的勘误表,否则您可以通过为 movsb 提供段覆盖前缀来使此代码正常工作。 es:MOVSB 将告诉它使用 ES:SI 而不是 DS:SImovsb 总是复制到 ES:DI;没有段覆盖前缀会改变它。

如果保证 DS 在此位置等于 ES,则代码实际上可能是正确的。旧的汇编器有他们自己的想法,有时必须使用有趣的段覆盖来让汇编器开心。

关于assembly - MASM 字符串指令 - 在实模式下段寄存器覆盖前面的 LEA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70660189/

相关文章:

assembly - 条件跳转指令如何与 SUB 操作数一起使用

winapi - 即使窗口存在,FindWindow 在 MASM32 程序中也会返回零

macos - Segmentation Fault 11链接OS X 32位汇编器

assembly - 为什么x86-64/AMD64 System V ABI要求16字节堆栈对齐?

x86-16 - RCR 和 ROR 有什么区别?

c++ - 如何将 32 位编译二进制文件转换为 64 位

assembly - 如何在汇编中播种随机数生成器?

c - 解释 AF 标志在 x86 指令中的工作原理?

assembly - 8086汇编,关于PTR操作符

assembly - 如何用汇编语言打印余数