在8086

时间:2016-08-23 23:33:54

标签: assembly x86-16 cpu-architecture processor

8086使用16位指令但RAM地址只保存8位CPU如何从RAM加载编程呢?它是否加载一个地址,然后检查指令是否需要1/2/3字节(例如,将一个立即数移到寄存器8/16位)然后执行操作或者我错了一个RAM' space& #39;是16位大?

1 个答案:

答案 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/和其他链接。 标记维基。

此外,一些非常常见的指令是单字节,如push r16