每个处理器架构、x86、arm、mips 等都有自己的方法。如果您不能以某种方式对常量进行操作,那么您肯定无法充分利用处理器。
首先,并非所有处理器都使用寄存器,有些是基于堆栈的,例如,尽管以某种方式在堆栈上放置一个常量,但您也会遇到同样的问题。
有两种基本方法,并且在大多数处理器上都可以找到。一个是按照您所暗示的,有指令指出这是一个立即移动(立即意味着常数在指令本身中编码)进行注册,术语会有所不同,但操作码,寄存器号和立即值被编码在指令中。取决于 cpu,尽管您可能无法在一条指令中加载整个寄存器,例如固定长度指令集,但您无法将操作码、寄存器编号和 32 位值放入 32 位中,例如 ARM 和 MIPS 可以一次只加载一部分寄存器。加载 0x00000078,然后或在 0x00005600 中,然后或在 0x00340000 中,然后或在 0x12000000 或在另一个架构上加载 0x00005678 和或在 0x12340000 中,导致 0x12345678。
第二种方法是将常量放在程序存储器中,通常称为 .text,然后使用指令将数据从存储器加载或移动到寄存器,使用 pc 相对寻址。pc 程序计数器,基本上是程序员和汇编程序(读取汇编语言并从中生成机器代码的程序)的组合,已经放置了要加载的指令和要加载的数据,基本上说,取您现在正在执行的指令并添加一些数字 X 并生成我要读取并加载到此寄存器中的常量的地址。第二种方法适用于大多数指令集,您现在可以根据指令集的规则将任何大小常量加载到所需的寄存器中,在固定指令长度指令集的情况下,不需要两个或四个或更多指令来拼凑你想要的常数,它确实会花费你一个内存周期,这可能会或可能不会影响性能。如果您考虑可变长度指令集,那么常量本身就是指令流中的单独读取,因此架构之间的权衡确实没有任何不同。
无论指令集有多旧或多新,它们在历史上都是相似的,因为它们是不同的。从旧到新的指令集倾向于使用几个或更多的寄存器,有一个程序计数器,有 alu 操作,加和,或,非,异或等。有一种读写内存的方法(加载和存储),并有使用即时值的能力。较旧的 cisc 处理器和/或可变长度指令集处理器提供了更多这些指令,每个 alu 操作都能够使用全宽立即数,诸如此类,并且当您尝试使用 risc 提高性能时,您牺牲了这些特性用于更快的流水线、更多指令,但它们移动得更快、更平滑,从而产生整体更快的执行(或其他特性)。
指令集信息在网上供您使用。pdp-11 或 msp430 是一个很好的第一个指令集,我经常建议在学习汇编时使用模拟器而不是硬件,首先避免使用 x86,直到你有一个或两个其他指令集。msp430/pdp11、arm、mips、avr 等。在一两次之后,pdp8 确实很有趣且具有教育意义,当然您可能想继续挖掘 4004 或 8008,然后逐步升级到 6502、6800 和 8080诸如此类的事情。