IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> ARM 立即数范围以及合法立即数 -> 正文阅读

[嵌入式]ARM 立即数范围以及合法立即数

ARM 立即数范围以及立即数的编码规则

一,问题描述

笔者在写汇编代码时曾遇到过立即数不合法的问题:

Immediate 0xXXX cannot be represented by 0-255 and a rotation

比如笔者代码中含有如下命令:

MOV R1, #888888 ; #888888 is 0xD9038

使用RVDS(RealView Development Suite)编译器进行编译,则会报出如下错误:

error

通过阅读ARM相关技术手册,笔者有如下发现:

  • 不同类型的指令,其支持的立即数长度不一样,比如有的是 imm12,有的是 imm8imm5,其中12和5分别代表立即数的比特位数,比如立即数长度为8bits时,其能表示的范围为:0b0 ~ 0b1111 1111,即为 0~255
  • 可以将立即数进行拆分,比如 imm12 = rotate4 + imm8,拆分成循环位移和立即数常数,通过将立即数常数imm8循环右移rotate4位,即可组成范围大于12bits组成的立即数(0b1111 1111 1111=4095)。

二,立即数范围

在ARM中,无论是Arch64还是Arch32,一条汇编指令的编码长度固定为32bits,在Thumb中为16bits,这就意味着不能将带有操作码(opcode)的汇编指令编译成任意的32bits的值。

在文档编号为DDI01001ARMv5 Architecture reference Manual的文档中有如下表格:

ARM指令汇总

从表格中可以看出,在ARM指令集中,一条汇编指令编码成32bits后,将不同的位数划分成不同的功能区间,比如条件码(condition codes)和操作码,还有比特位要留给指令本身和寄存器使用,通常情况下只有12-bits的长度可以用来表示立即数(immediate)。

12bits可以表示的无符号数范围为:0~4095,有符号数的范围为:-2048 ~ +2047,如果不在这12 bits的立即数上增加点创作性,而直接硬解码用来表示立即数是远远不够的。所以在ARM中将这12 bits分为 8-bit 常数(0~255)和 4-bit旋转位移值(0~15),8 bits 常数可以按照循环位移值的2倍(0~30)向右进行循环位移,位移的步进值是以2为单位,可以是:0、2 、4 、6 、… 、30

比如 0x23000000占32bits,远远超过了12 bits,如果直接硬解码是表示不了的,但是其可以由 0x23 ROR 8得到,ROR是以32bits的位宽为基础,向右循环位移,从右边旋转出来的比特位被插入到左边空出的位中。因此按此规则, 0x23000000的12-bit立即数表示应为:0b0100 0010 0011。关于其解释,见下文。

三,立即数编码

本章拿数据处理指令的编码举例,如下图所示为DI0406C_arm_architecture_reference_manual参考手册中关于数据处理指令编码的表格:

数据处理指令编码格式

更进一步,本章详细地用 ARM cortex-A系列的MOV指令为例:

MOV指令编码

其中的条件码 cond在无条件下为 1110,详情参考下图:

条件码

本章拿立即数 0x23000000举例,如下的汇编指令:

MOV r4, #0x23000000

按照上述的编码规则将会被编码成:0xE3A04423

汇编指令编码

换算成二进制:

二进制表示

0x23000000的12-bit立即数表示为:0b0100 0010 0011。其中高4位为0100 = 4,可求得循环右移的位数为 4*2=8,低八位 0010 0011即为 0x23。将 0x23循环右移8位,也正是立即数 0x23000000

更多的编码示例可参考下图,图片来自ARM指令集中立即数寻址的范围

示例

在ARMv7中管这种循环右移得到的立即数叫做 modified immediate constants,在参考手册DI0406C_arm_architecture_reference_manual中有其更详细的描述:

Modified Immediate

立即数循环右移

其中 abcdefgh8个数,分别代表不同的比特位,还有一点需要特别注意,rotation的数值乘以2,才表示真正的循环右移次数。

汇编指令编码

综上所述,我们可以得出以下结论:

  • 如果一个立即数小于 0xFF(255)那么直接用 immed_8 的8个比特位表示,此时不用移位,11~8 位的 Rotate_imm 等于 0。
  • 如果 immed_8 的数值大于 0xFF(255),那么就看这个数是否能有 immed_8 中的某个数移位 2*Rotate_imm 位形成的。如果能,那么就是合法立即数;否则非法。

关于立即数合不合法,可先参考这篇文章 ARM 立即寻址之立即数的形成 —— 如何判断有效立即数

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 18:19:04  更:2022-06-25 18:19:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 8:29:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计