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

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$ 位,能够通过循环右移偶数位后表示该数据。

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

https://lzhms.github.io/blog/ARMImmediateNumber/

Author

Zhihao Li

Posted on

2023-10-17

Updated on

2024-12-24

Licensed under


Comments