警告1:我对现实生活中的CPU设计一无所知。
警告2:我不知道“CPU指令”,“CPU操作”和“CPU功能”等术语之间的区别。也许有一个,也许没有,但我使用这些就好像它们是同义词。如果我错了,请纠正我。
后台:想象一下,你有一个带有两个寄存器的4位CPU。现在你需要加载一个常量值来注册1!可能有几种方法可以做到这一点:
一般
我认为任何接触过大会的人都会知道asnwer。我非常感谢你的帮助!提前谢谢。
答案 0 :(得分:6)
每个处理器架构,x86,arm,mips等都有自己的方法。如果你不能以某种方式操作常量,你肯定无法从处理器中获得太多的使用。
首先,并非所有处理器都使用寄存器,例如,有些是基于堆栈的,尽管在某种程度上在堆栈上放置了一个常量,但是你遇到了同样的问题。
有两种基本方法,两者都可以在大多数处理器上找到。一个是你所暗示的,有一些指令表明这是一个立即移动(立即意味着常量在指令本身中被编码)来注册,术语会有所不同,但操作码,寄存器号和立即值被编码在指令中。虽然您可能无法在一条指令中加载整个寄存器,但可能无法在一条指令中加载整个寄存器,例如,您不能使用32位的操作码,寄存器编号和32位值,因此例如ARM和MIPS可以只加载一小部分寄存器。加载0x00000078,然后或在0x00005600,然后或在0x00340000然后或在0x12000000或在另一个架构上加载0x00005678和/或在0x12340000,导致0x12345678。
第二种方法是将常量放在程序存储器中,通常称为.text,然后使用指令将数据从存储器加载或移动到寄存器,使用pc相对寻址。 pc程序计数器,基本上是程序员和汇编程序的组合(读取汇编语言并从中生成机器代码的程序)已经放置了加载指令,要加载的数据,基本上说,取的是地址您正在执行的指令并添加一些数字X,并生成我想要读取的常量的地址并加载到该寄存器中。第二种方法适用于大多数指令集,您现在可以根据指令集的规则将任何大小常量加载到您想要的寄存器中,它不需要两个或四个或更多指令将您想要的常量拼凑在一起对于一个固定的指令长度指令集,它会花费你一个记忆周期,这可能是也可能不是性能损失。如果考虑可变长度指令集,那么常量本身就是指令流中的单独读取,因此架构之间的权衡确实不同。
无论新旧指令集在历史上与它们是不同的相似,都无关紧要。旧的到新的指令集往往使用几个或更多的寄存器,有一个程序计数器,有alu操作,添加,和,或者,不是,xor等。有办法读写内存(加载和存储)和有能够使用立即值。较旧的cisc处理器和/或可变长度指令集处理器提供了更多这些指令,每个alu操作都能够使用全宽度的直接,这样的事情,并且当你试图通过risc提高性能时,你牺牲了这些功能可实现更快的流水线操作,更多指令,但它们移动得更快更顺畅,从而可以更快地执行(或其他功能)。
指令集信息在网上供您使用。 pdp-11或msp430是一个很好的第一个指令集,我经常建议在学习装配时使用模拟器而不是硬件,首先避免使用x86,直到你有一两个其他的。 msp430 / pdp11,arm,mips,avr等。在一两个之后,pdp8实际上是有趣和有教育意义的,当然你可能想要挖掘4004或8008然后继续前进到6502和6800和8080等等。
答案 1 :(得分:2)
我没有看到你问题的背景。如果您正在设计一个4位CPU,那么您应该阅读的内容比您似乎已经完成的要多一些。
大多数实际CPU使用操作码的某些位来描述操作类型(移动,添加,比较等),以及更多位来描述寻址模式(常量,寄存器,寄存器间接,内存间接等) )。并非所有CPU都为所有操作码提供所有寻址模式(具有此属性的指令集称为“正交”)。
尝试保存“CPU实现”(=减少操作码数量)可能适用于很少使用的“奥术”指令(或者例如用于浮点运算),但不适用于将常量值移动到登记册。