【发布时间】:2019-04-08 07:17:43
【问题描述】:
据我所知,8086指令有3种关于数据移动的指令集:
- 要注册的内存
- 注册到内存
- 注册即可注册
但是,昨天我发现了一些指令集,例如movsb和outsb,
使用这些指令,memory to memory(M2M) 操作是可能的!
这一次,我很好奇为什么存在M2M指令。
我发现使用它们有很多限制。
- 这些指令会消耗大量 CPU 周期,
- 这些指令要求使用段寄存器作为操作数。
这些M2M操作也可以结合以上1,2,3种指令运行。
问题:
我很难同意那些 M2M 指令的存在。
那些只是为了制作更短的汇编代码而存在吗?
【问题讨论】:
-
架构师推断,硬件可以支持一些常见的高级功能。所以
movsb可以实现memcpy和朋友,outsb在对缺乏足够辅助硬件的哑设备执行 IO 时非常有帮助(这在过去很常见)。当然,这不是一个原创的想法或什么——在 RISC 运动出现之前,这种指令在任何地方都相当普遍(除了非常小的 8 位“微”)。 -
注意只有 8088/8086 有内存移动,早期 PC 时代的 8237 DMA 芯片包括内存到内存传输功能,使用通道 0 作为源,通道 1 作为目标。
-
@rcgldr 哦,哇,我不知道。真的有人用过这个功能吗?
-
@fuz - 我没有使用它。我似乎记得在 1980 年代曾在我工作的一家公司对其进行测试,可能是在 1980 年代的各种台式机上对 dma 内存移动和/或 cpu 内存移动进行基准测试,以了解内存带宽。
-
所有内存操作数都有一个段寄存器,无论是显式指定的还是隐式的。