关于 ARM 指令体系中立即数范围的扩散机制

发布时间 2023-10-30 22:02:21作者: MarkStiff

ARM 指令体系特点

ARM作为一款嵌入式微处理器或者一种嵌入式微处理架构,具有非常规整的指令体系,其精简指令集中共计 \(30\) 条指令,并且每条指令均为 \(32\) 位宽。

ARM 立即数的表示

ARM 中一条指令有 \(32\) 比特,但是立即数不能占用 \(32\) 位指令编码空间的全部比特位,留给立即数的编码空间只有 \(12\) 位。此外,因为 ARM 指令为单周期指令,当遇到操作数非常大的情形时,也不可能再取指一次。
因此,不得不对指令中立即数表示进行特殊的设计。

扩散数据表示范围

ARM 处理器指令系统将 \(12\) 比特位分成 \(8\) 比特位的常数和 \(4\) 比特位的循环右移偶数位两部分。
我们知道,\(8\) 位比特位能够表示的数据范围为 (无符号数) Immed_\(8=0\sim255\),而 \(4\) 位循环移位能够表示范围为 Rotate_Imm\(=0\sim15\), 因此设计立即数表示为:

Immed = Immed_$8$ >> ($2\times$Rotate_Imm)
  • 循环右移偶数位数
$2\times(0\sim15)=${$0,2,4,\cdots,30$}

因此,一个 \(8\) 比特的数据,有 \(16\) 种不同的循环右移方式,那么可以表示的数据范围为:

\[2^8\times16=256\times16=4096B=4KB=2^{12} \]

上式表明,循环右移偶数位并没有使得数据表示个数有任何改变;

I.有效数据位

在进一步阐述数据表示的扩散机制前,先要明确有效数据位的含义。
在循环移位中,有效数据位指的是最长非零二进制串,即 \(000101000100\) 中有效数据位为 \(1010001\), 长度为 \(7\)

II.扩散机制

循环右移偶数位使得立即数在数据表示上有效数据位范围从原来的 \(0\sim12\) 位变为了 \(0\sim8\) 位,并且可以表示在第 \(12\sim32\) 比特位上。
注:最高移位是 \(8\) 位常数位,循环右移 \(30\) 位,最长可以表示为 \(38\) 位的长度,为什么不尽最大长度扩散数据范围呢?可以考虑指令的执行过程,ARM 指令中的立即数会被送往 ALU 中,而 ARM 的 ALU 最高处理 \(32\) 位数据,因此只扩散到 \(32\) 位编码空间。
【扩散效应】——数据本源并没有发生变化,而是将数据扩展散开分布。

概括来讲,循环右移偶数位不能改变原有数据表示个数,只是将数据离散分布到 \(32\) 位编码空间,因此称为扩散数据表示。但是这种方式,就要保证立即数是合法的,即满足有效位数小于等于 \(8\) 位,能够通过循环右移偶数位后表示该数据。