计算机如何将寄存器设置为恒定值?

警告1:我对真实的实际CPU设计一无所知。

警告2:我不知道“CPU指令”,“CPU操作”和“CPU功能”等术语之间的区别。 也许有一个,也许没有,但我使用这些就好像它们是同义词。 纠正我,如果我错了。

背景:假设您有一个4位CPU和两个寄存器。 现在你需要加载一个常数值来注册1! 可能有几种方法可以做到这一点:

  • 像0SXX这样的指令,其中0表示它是“设置寄存器到X”类型的指令,而S表示寄存器1的哪一侧应该加载XX。
  • 优点:容易操作寄存器1.只能使用两个字节的程序存储器设置恒定值。
  • 缺点:消耗可能的CPU指令的HALF。 对于我的4位小设备来说这是一场悲剧,但对于8位以上的计算机来说这也不算什么。
  • 纯粹的算术/比特级CPU功能系列(如AND,OR,NOT,XOR,RoR,RoL,INC等)
  • 优点:不需要额外的CPU实施。
  • 缺点:需要更多的指令,更慢的加载常量,当然,在汇编中加载常量之前,您需要多思考。
  • 这些之间的东西? 像清理寄存器一样,加载??然后逻辑操作?
  • 我还没有想到的其他东西?
  • 通常:

  • 有没有一种方法可以使所有普通的现代CPU将寄存器设置为常量值?
  • 如果不是,那么最常用的方法是什么?
  • 旧的4/8位计算机有不同的方法来做到这一点?
  • 我认为任何碰过集会的人都会知道这个问题。 我非常感谢你的帮助! 提前致谢。


    每种处理器架构,x86,arm,mips等都有自己的做法。 如果你无法以常量操作,你肯定无法从处理器中获得太多的用处。

    首先并不是所有的处理器都使用寄存器,有些是基于堆栈的,例如,虽然通过某种方式在堆栈上放置常量,但存在相同的问题。

    有两种基本方法,都可以在大多数处理器上找到。 一种是你所暗示的,有些指令说明这是一种立即行动(立即表示该常数是在指令本身编码的),注册时,术语会有所不同,但操作码,寄存器号码和立即值被编码在指令中。 根据CPU的不同,尽管你可能无法在一条指令中加载整个寄存器,例如固定长度的指令集,你不能在32位中填充操作码,寄存器编号和32位值,例如ARM和MIPS可以一次只加载一部分寄存器。 加载一个0x00000078,然后或0x00005600,然后或0x00340000然后或0x12000000或另一架构加载0x00005678和或0x12340000,导致0x12345678。

    第二种方法是将常量放入程序存储器中,通常称为.text,然后使用一条指令将数据从存储器加载或移动到寄存器,并使用与pc相关的寻址。 pc程序计数器,基本上是程序员和汇编程序(读取汇编语言并从中生成机器代码的程序)的组合,已将指令加载,并加载数据,基本上说,采用你正在执行的指令,并添加一些数字X,并产生一个我想要读取并加载到该寄存器的常量的地址。 第二种方法适用于大多数指令集,并且您现在可以根据指令集的规则将任意大小的常量加载到您想要的寄存器中,它不需要两个或四个或更多指令将您想要的常量拼凑在一起的固定指令长度指令集,它会花费你一个内存周期,这可能会或可能不会影响性能。 如果您考虑可变长度指令集,那么常量本身就是指令流中的一个单独读取,因此架构之间的权衡确实没有什么不同。

    不管他们在历史上是多么古老或是新的指令集都是相似的,因为它们是不同的。 旧的到新的指令集往往使用几个或更多的寄存器,有一个程序计数器,有一个操作,添加和,或不,异或等。有一种方式来读取和写入内存(加载和存储),并有使用即时值的能力。 旧的cisc处理器和/或可变长度指令集处理器提供了更多的这些指令,每个alu操作都能够使用全宽度立即,这种事情,并且当你尝试用risc提升性能时,你会牺牲这些功能用于更快的流水线操作,更多的指令,但它们移动更快,更平滑,从而产生更快的执行速度(或其他功能)。

    指令集信息在网上用于您的消费。 pdp-11或msp430是一个很好的第一个指令集,我经常建议在学习汇编时使用模拟器而不是硬件,直到你有一两个人在你身边时才避免使用x86。 msp430 / pdp11,arm,mips,avr等等。一两个pdp8实际上是有趣和教育性的,当然你可能想要去挖掘4004或8008,然后按照6502和6800和8080和那样的事情。


    我没有看到你的问题的背景。 如果你正在设计一个4位的CPU,你应该阅读比你看起来更多的东西。

    大多数真实世界的CPU都使用操作码的某些位来描述操作的类型(移动,添加,比较等),还有一些位来描述寻址模式(常量,寄存器,寄存器间接,存储器间接等)。 并非所有CPU都为所有操作码提供所有寻址模式(具有此属性的指令集称为“正交”)。

    尝试保存“CPU实现”(=减少操作码的数量)可能适用于很少使用的“奥术”指令(或例如用于浮点操作),但不适用于将常量值移动到寄存器等基本操作。

    链接地址: http://www.djcxy.com/p/72397.html

    上一篇: How do computers set a register to a constant value?

    下一篇: How To Create Your Own x86 Operating System for Modern PC Computers