在英特尔架构IA32中,诸如movl,movw之类的指令不允许作为内存位置的操作数.例如,不允许使用指令movl(%eax),(%edx).为什么?
在汇编程序和处理程序的研究中,有一件事把我带出来,如何完成指令:
add mem, 1
Run Code Online (Sandbox Code Playgroud)
在我的脑海中,处理器无法加载内存值并在同一指令期间处理算术运算.所以我觉得它发生在:
mov reg, mem
add reg, 1
mov mem, reg
Run Code Online (Sandbox Code Playgroud)
如果我考虑使用RISC Pipeline的处理器,我们可以观察一些停顿.对于简单的指令来说,这是令人惊讶的i++:
| Fetch | Decode | Exec | Memory | WriteB |
| Fetch | | | Decode | Exec | Memory | WriteB |
| Fetch | | | | Decode | Exec | Memory | WriteB |
Run Code Online (Sandbox Code Playgroud)
(正如我在Patterson的书" 计算机体系结构:定量方法"中所读到的,寄存器在解码 uOp,存储/加载到存储器uOp中读取,我们允许自己在存储器uOp中获取寄存器的值.)
我对吗?还是现代处理器有更具效的方法来做到这一点?