据我所知,8086指令具有3种关于数据移动的指令集:
但是,昨天我发现了一些指令集,例如movsb和outsb,
使用这些指令,可以实现内存到内存(M2M)操作!
这一次,我很好奇为什么存在M2M指令。
我发现使用它们有很多限制。
那些M2M操作也可以通过结合以上1,2,3类型的指令来运行。
问题:
我很难同意这些M2M指令的存在。
是否仅存在用于简化汇编代码的代码?
答案 0 :(得分:3)
movs*
和cmps*
指令非常方便,因为它们使您可以执行诸如复制数据和比较数据之类的常见任务。
ins*
和outs*
本质上类似于movs*
,它们只是在内存和I / O设备之间移动数据。它们对于以完整扇区(通常为512字节)读取/写入磁盘特别有用。当然,由于基于DMA的I / O效率更高,因此DMA消除了这些问题,但是在过去,它们不像今天那样普遍。
模拟这些指令(特别是它们的重复形式(查找rep
前缀)将需要更多代码,并且速度会更慢。因此它们的存在。
顺便说一句,xchg
指令和任何其他在内存中具有目的地的读-修改-写指令(例如add
)也是有效的内存到内存指令。并非所有的CPU都具有这些指令,许多主要提供从存储器读取或写入存储器的指令,但不能同时提供两者(例外情况是用于实现对存储器的排他/原子访问的指令,请考虑xchg
,{{ 1}},xadd
)。具有这种指令集的CPU属于所谓的加载存储体系结构。
此外,cmpxchg8/16
和push
指令可以让其显式操作数指定存储位置。那是内存到内存指令的另一种形式。
对于段,几乎所有读写存储器的指令都涉及段(某些系统指令的工作方式不同),因此如果您决定不使用所提及的指令,就无法避免段管理和开销。并选择其他说明。