8086使用16位指令但RAM地址只保存8位CPU如何从RAM加载编程呢?它是否加载一个地址,然后检查指令是否需要1/2/3字节(例如,将一个立即数移到寄存器8/16位)然后执行操作或者我错了一个RAM' space& #39;是16位大?
答案 0 :(得分:5)
许多指令都是多字节的,是的,这意味着它们跨越两个或更多地址。
IIRC,8086的存储器总线是16位,因此它可以在一次操作中加载16位(两个相邻的地址)。您将字节可寻址内存与总线宽度混淆。
是否加载一个地址,然后检查指令是否需要1/2/3字节(例如,将一个立即数移到寄存器8/16位)
它不断地将指令字节提取到一个6字节的缓冲区中(每次2个字节,因为它是一个16位总线的16位CPU)。缓冲区足够大,可以容纳最大允许的8086指令(不包括前缀,可以单独解码,IDK)。当它完成执行前一条指令时,它会查看缓冲区。请参阅下面的链接以获得更好的描述,但它可能会尝试将缓冲区解码为整个指令。如果它在找到指令结束之前到达获取缓冲区的末尾,它将等待直到下一个获取周期完成并再次尝试。
另请参阅:8086 CPU architecture,这是" 8086代码获取"的第一次点击。它确认了获取和执行是否重叠,因此它以最基本的方式流水线。
TL:DR:它进入缓冲区,直到它有一整条解码指令。然后它将任何额外的字节移到缓冲区的前面,因为它们是下一条指令的一部分。
我读过,通常指令获取是8086的瓶颈,所以优化代码大小几乎超过了其他所有内容。
流水线型CPU不必等待执行前一条指令才能开始解码。现代CPU还具有很多更高带宽的代码获取功能,因此他们有一组已解码的指令可供使用(除非分支机构搞砸了。)请参阅http://agner.org/optimize/和其他链接。 x86标记维基。
此外,一些非常常见的指令是单字节,如push r16
。