【发布时间】:2012-08-10 19:21:43
【问题描述】:
在英特尔架构 IA32 中,movl、movw 等指令不允许操作数同时为内存位置。例如,指令 movl (%eax), (%edx) 是不允许的。为什么?
【问题讨论】:
-
ModR/M 字节无法对其进行编码。但是当然你可以把它变成“他们为什么这样做”,好吧..同时,字符串移动(
movsb,movsw,movsd,movsq)有两个内存参数,但他们'是隐含的。 -
现在是 1976 年,你可以在一个芯片上放置 20,000 个晶体管来实现一个 16 位处理器。这需要大量偷工减料,非常非正交的设计是结果的一部分。并且没有空间找到缓冲总线周期之间的值所需的存储空间。
-
我认为更好的解释是使用两种完整寻址模式 (
base + index + disp16) 解码 insn 将需要两个 AGU(地址生成单元),并且会使二进制机器码格式复杂化很多。 (哪个段覆盖适用于哪个操作数?对于一个或两个操作数都是寄存器的常见情况,如何允许编码两个内存地址而不会使代码大小膨胀?) -
@PeterCordes 最初的 8086 甚至没有一个地址生成单元,所以这不是原因。它确实使用 ALU 进行计算。
标签: assembly x86 cpu-architecture instruction-set