8086内存到内存指令。它们存在的目的是什么?
8086 memory to memory instructions. What do they exist for?
据我所知,8086指令有3种关于数据移动的指令集:
- 要注册的内存
- 注册到内存
- 注册注册
但是,昨天我发现了一些指令集,例如movsb and outsb,
在使用这些指令时,内存到内存 (M2M) 操作是可能的!
这段时间很好奇为什么会有M2M指令。
我发现使用它们有很多限制。
- 这些指令消耗了很多 CPU 个周期,
- 这些指令需要使用段寄存器作为操作数。
而且这些M2M操作也可以结合以上1,2,3类指令运行。
问题:
我很难同意这些 M2M 指令的存在。
那些只是为了制作更短的汇编代码而存在的吗?
movs*
和 cmps*
指令非常方便,因为它们可以让您执行复制数据和比较数据等常见任务。
ins*
和outs*
在本质上类似于movs*
,它们只是在内存和I/O设备之间移动数据。它们对于 reading/writing 完整扇区(通常为 512 字节)的磁盘特别有用。当然,DMA 消除了这些,因为基于 DMA 的 I/O 效率更高,但在过去它们并不像今天那么普遍。
模拟这些指令(尤其是它们的重复形式(查找 rep
前缀))需要更多代码并且速度会更慢。因此他们的存在。
顺便说一句,xchg
指令和任何其他目标在内存中的读-修改-写指令(例如 add
)也是有效的内存到内存指令。并非所有 CPU 都有这些,许多 CPU 主要提供从内存读取或写入内存但不是两者都提供的指令(例外情况是用于实现 exclusive/atomic 访问内存的指令,想想 xchg
, xadd
、cmpxchg8/16
)。具有此类指令集的 CPU 属于所谓的加载-存储架构。
此外,push
和 pop
指令可能有明确的操作数指定内存位置。这是内存到内存指令的另一种形式。
至于段,几乎所有读取或写入内存的指令都涉及段(一些系统指令的工作方式不同),因此如果您决定不使用您的指令,则段管理和开销不是您可以以某种方式避免的重新提及并选择其他一些说明。
据我所知,8086指令有3种关于数据移动的指令集:
- 要注册的内存
- 注册到内存
- 注册注册
但是,昨天我发现了一些指令集,例如movsb and outsb,
在使用这些指令时,内存到内存 (M2M) 操作是可能的!
这段时间很好奇为什么会有M2M指令。
我发现使用它们有很多限制。
- 这些指令消耗了很多 CPU 个周期,
- 这些指令需要使用段寄存器作为操作数。
而且这些M2M操作也可以结合以上1,2,3类指令运行。
问题:
我很难同意这些 M2M 指令的存在。
那些只是为了制作更短的汇编代码而存在的吗?
movs*
和 cmps*
指令非常方便,因为它们可以让您执行复制数据和比较数据等常见任务。
ins*
和outs*
在本质上类似于movs*
,它们只是在内存和I/O设备之间移动数据。它们对于 reading/writing 完整扇区(通常为 512 字节)的磁盘特别有用。当然,DMA 消除了这些,因为基于 DMA 的 I/O 效率更高,但在过去它们并不像今天那么普遍。
模拟这些指令(尤其是它们的重复形式(查找 rep
前缀))需要更多代码并且速度会更慢。因此他们的存在。
顺便说一句,xchg
指令和任何其他目标在内存中的读-修改-写指令(例如 add
)也是有效的内存到内存指令。并非所有 CPU 都有这些,许多 CPU 主要提供从内存读取或写入内存但不是两者都提供的指令(例外情况是用于实现 exclusive/atomic 访问内存的指令,想想 xchg
, xadd
、cmpxchg8/16
)。具有此类指令集的 CPU 属于所谓的加载-存储架构。
此外,push
和 pop
指令可能有明确的操作数指定内存位置。这是内存到内存指令的另一种形式。
至于段,几乎所有读取或写入内存的指令都涉及段(一些系统指令的工作方式不同),因此如果您决定不使用您的指令,则段管理和开销不是您可以以某种方式避免的重新提及并选择其他一些说明。