历史上的今天
返回首页

历史上的今天

今天是:2025年02月24日(星期一)

正在发生

2020年02月24日 | ARM指令中的"8位图"立即数格式

2020-02-24 来源:eefocus

最近在学习"ARM9 原理和应用设计"一书. 书中在介绍ARM指令格式的时候, 指出:"ARM 指令中, 第二个操作数 (operand2) 如果是常数表达式的话, 该常数须对应8位位图 (Pattern), 即常数是由一个8位的常数循环移位偶数位得到的. 如 0x3FC, 0, 200 等是合法常量, 0x1FE, 511 等就是非法常量."


一开始我对这句话不是很明白, 书上举出的例子也没有想通. 于是打算从源头——ARM 指令格式开始研究.


一条典型的 ARM 指令的基本格式是  {} {S} , {,} 共32位. 其中  占12位. 而在使用立即数寻址方式的时候, 数据就包含在指令的32位编码之中, 取出指令就是取出了可以立即使用的操作数. 现在考虑如下情况: 我们要使用立即数寻址的方式进行运算, 如果一个32位的立即数直接用在32位指令编码中, 就有可能完全占据32位编码空间, 使指令的操作码等无法在编码中得到体现. 而如果使用12位的 operand2 直接表示数据, 能够表示的数的范围又略显小了些. 因此, 在 ARM 指令编码中, 32位有效立即数是通过循环移偶数位而间接得到的. 具体的设计方法如下:

在 ARM 数据处理指令中, 当参与操作的第二操作数为立即数时, 每个立即数都是采用一个8位的常数循环右移偶数位而间接得到, 其中循环右移的位数有一个4位二进制的2倍表示. 则有效立即数可表示为:  := immed_8; 循环右移(2×rotate_imm). 其中:  代表立即数, immed_8 代表8位常数,  即所谓的"8位图", rotate_imm 代表4位的循环右移值. 这样一来出现了一个问题: 尽管表示的范围变大了, 但是12位所能表现的数字的个数是一定的. 因此, ARM 规定并不是所有的32位常数都是合法的立即数, 只有通过上面的构造方法得到的才是合法的立即数, 编译的时候才不会报错.


举个例子吧. 
0x3FC(0000 0000 0000 0000 0000 0011 1111 1100) 是由 0xff 循环右移 2 位得到的; 
200(0000 0000 0000 0000 0000 0000 1100 1000) 是由 0xc8 循环右移 2 位得到的, 它们都是合法的. 
而 0x1FE(0000 0000 0000 0000 0000 0001 1111 1110) 和 
511(0000 0000 0000 0000 0000 0001 1111 1111) 无法看成是8位的常数循环右移偶数位而得到的, 因此是非法的.


比较下来, 我们可以这样总结:

  1. 判断一个数是否符合8位位图的原则, 首先看这个数的二进制表示中1的个数是否不超过8个. 如果不超过8个, 再看这n个1(n<=8)是否能同时放到8个二进制位中, 如果可以放进去, 再看这八个二进制位是否可以循环右移偶数位得到我们欲使用的数. 如果可以, 则此数符合8位位图原理, 是合法的立即数. 否则, 不符合.

  2. 无法表示的32位数, 只有通过逻辑或算术运算等其它途径获得了. 比如0xffffff00, 可以通过0x000000ff按位取反得到.


因此以后的编程中, 时刻检查用到的第二操作数是否符合8位位图是一件千万不能疏忽的事. 至于为什么要将这12位 operand2 "八四开", 这个问题就要请教大牛了.

推荐阅读

史海拾趣

E Connector Solutions公司的发展小趣事

在电子连接器行业,产品质量直接关系到企业的生存和发展。E Connector Solutions公司始终坚持品质至上的原则,从原材料采购到生产流程控制,再到产品检测,都严格遵循国际标准。公司还建立了完善的质量管理体系,确保每一款产品都符合客户的要求。正是凭借过硬的产品质量,E Connector Solutions公司赢得了市场的认可,逐渐在行业中树立了良好的品牌形象。

DELTA公司的发展小趣事

为了更好地服务全球客户,Delta公司积极推进全球布局战略。公司在全球范围内设立了多个研发中心和生产基地,如中国大陆、中国台湾、美国、泰国、日本、墨西哥、印度、巴西以及欧洲等地。这些研发中心和生产基地不仅为Delta提供了强大的技术支持和生产能力,还使其能够更快速地响应市场需求,提供更贴近客户的服务。

Corstat Containers公司的发展小趣事

Corstat Containers公司在电子行业中崭露头角,始于一次技术突破。当时,公司研发团队成功开发出一种新型的防静电电子元件包装盒,有效解决了电子产品在运输过程中因静电导致的损坏问题。这一创新产品迅速获得了市场的认可,许多知名电子品牌纷纷与Corstat Containers公司建立合作关系。随着订单量的不断增加,公司的规模逐渐扩大,生产线也更加完善。

CMOSIS公司的发展小趣事

近年来,随着人工智能、物联网等技术的快速发展,CMOS图像传感器行业也面临着深刻的变革。CMOSIS公司敏锐地把握住了这一趋势,积极调整战略方向,加大了在人工智能算法、低功耗设计等方面的研发投入。通过不断创新和优化产品,公司成功应对了行业变革带来的挑战,保持了稳健的发展态势。

Axiomtek公司的发展小趣事

近年来,随着人工智能、物联网等技术的快速发展,CMOS图像传感器行业也面临着深刻的变革。CMOSIS公司敏锐地把握住了这一趋势,积极调整战略方向,加大了在人工智能算法、低功耗设计等方面的研发投入。通过不断创新和优化产品,公司成功应对了行业变革带来的挑战,保持了稳健的发展态势。

Dawning Precision Co Ltd公司的发展小趣事

在快速发展的过程中,Dawning意识到企业文化的重要性。公司注重培养员工的团队合作精神和创新能力,定期组织各种团建活动和文化交流活动。同时,Dawning还倡导“以人为本”的管理理念,关注员工的成长和发展,为员工提供良好的职业发展平台。这些举措的实施,使得Dawning的员工队伍更加团结、稳定和有活力,为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

急救!!5.0到6.0移值时,串口驱动问题

将5.0BSP移值到6.0 上时,运行到串口驱动时,就运行不下去了, DNW提示信息: WARNING: CReg2440Uart::CReg2440Uart failed to obtain processor frequency - using default value (66750000). DEBUG: Serial2 SYSINTR : -766318612 WARNING: C ...…

查看全部问答>

求 插值算法

小弟最近写一个程序,由传感器测量后由单片机进行AD转换,然后在lcd上显示出来,可是测出的东西如果不是连续的那么用什么算法能把显示的曲线图形变成连续的?比如测温度、电流、电压,是不是要用不同的插值算法?哪位能指点一下啊?谢谢。…

查看全部问答>

请教如何获取monthcalendar(日历控件)被选中的日期信息,急急急急急急急!

如题,小弟在做一个日程管理的小应用程序, 请问如何获取在日历控件上选定的日期信息, 比如选定某日, 在程序中要提取该日的日期和星期几的信息。 谢谢各位,很急,请大家帮帮忙。…

查看全部问答>

那个用单片机编写《小草》程序的人在吗

可不可以吧《小草》的单片机程序发给我啊? 234901369@qq.com…

查看全部问答>

今天晚上在家没事,给老冰箱做了个LED照明灯

    去年夏天,家里用了20多年的老冰箱(老人家买的,买了新冰箱后不够用,所以一直用着)坏了照明灯泡,用起来很不方便。当时把灯泡拿到电子市场去配,竟然找不到这种灯头的,只有作罢。     今天晚上在家没事,就 ...…

查看全部问答>

JLINK设置出问题了。怎么办

之前能仿真的。能下载程序的。  后来设置了一下               就只有不行了  一直是  AXD Uable to halt ARM core  我也不知道哪里出了问题。.         ...…

查看全部问答>

求大家帮助啊,最近学msp430单片机

#include #include void main(void) {   WDTCTL=WDT_MDLY_32;   IE1|=WDTIE;   P1DIR|=BIT6;   while(1); } #pragma vector=WDT_VECTOR __interrupt void watchdor(void) {   P1O ...…

查看全部问答>

求帮忙~~~~

经放大整形后传感器输入的电压如果是大于2V的脉冲信号,则数码管显示加1,否则没反应,我用的单片机是STC89C52,单片机工作电压5V,我的问题有两个:   一:传感器输入的脉冲信号能与I0口直接相连吗? 二:我这个需要用到单片机的哪些知识,因为 ...…

查看全部问答>

四层板PCB学习@PCB设计

我也来加入四层板的学习,在上班抽空时间总算布局完了,大概布了下,还不是很整齐,在这里得感谢@okhxyyo 的耐心帮忙和指导~ 希望能大家一起共同进步和学习…

查看全部问答>