8086内存到内存的指令。它们的作用是什么?

时间:2019-04-08 07:17:43

标签: assembly x86 intel x86-16

据我所知,8086指令具有3种关于数据移动的指令集:

  1. 要注册的内存
  2. 注册到内存
  3. 注册以注册

但是,昨天我发现了一些指令集,例如movsboutsb
使用这些指令,可以实现内存到内存(M2M)操作!

这一次,我很好奇为什么存在M2M指令。
我发现使用它们有很多限制。

  • 这些指令消耗​​很多CPU周期,
  • 这些指令要求使用段寄存器作为操作数。

那些M2M操作也可以通过结合以上1,2,3类型的指令来运行。

问题:
我很难同意这些M2M指令的存在。
是否仅存在用于简化汇编代码的代码?

1 个答案:

答案 0 :(得分:3)

movs*cmps*指令非常方便,因为它们使您可以执行诸如复制数据和比较数据之类的常见任务。

ins*outs*本质上类似于movs*,它们只是在内存和I / O设备之间移动数据。它们对于以完整扇区(通常为512字节)读取/写入磁盘特别有用。当然,由于基于DMA的I / O效率更高,因此DMA消除了这些问题,但是在过去,它们不像今天那样普遍。

模拟这些指令(特别是它们的重复形式(查找rep前缀)将需要更多代码,并且速度会更慢。因此它们的存在。

顺便说一句,xchg指令和任何其他在内存中具有目的地的读-修改-写指令(例如add)也是有效的内存到内存指令。并非所有的CPU都具有这些指令,许多主要提供从存储器读取或写入存储器的指令,但不能同时提供两者(例外情况是用于实现对存储器的排他/原子访问的指令,请考虑xchg,{{ 1}},xadd)。具有这种指令集的CPU属于所谓的加载存储体系结构。

此外,cmpxchg8/16push指令可以让其显式操作数指定存储位置。那是内存到内存指令的另一种形式。

对于段,几乎所有读写存储器的指令都涉及段(某些系统指令的工作方式不同),因此如果您决定不使用所提及的指令,就无法避免段管理和开销。并选择其他说明。