历史上的今天
今天是: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 指令的基本格式是 在 ARM 数据处理指令中, 当参与操作的第二操作数为立即数时, 每个立即数都是采用一个8位的常数循环右移偶数位而间接得到, 其中循环右移的位数有一个4位二进制的2倍表示. 则有效立即数可表示为: 举个例子吧. 比较下来, 我们可以这样总结: 判断一个数是否符合8位位图的原则, 首先看这个数的二进制表示中1的个数是否不超过8个. 如果不超过8个, 再看这n个1(n<=8)是否能同时放到8个二进制位中, 如果可以放进去, 再看这八个二进制位是否可以循环右移偶数位得到我们欲使用的数. 如果可以, 则此数符合8位位图原理, 是合法的立即数. 否则, 不符合. 无法表示的32位数, 只有通过逻辑或算术运算等其它途径获得了. 比如0xffffff00, 可以通过0x000000ff按位取反得到. 因此以后的编程中, 时刻检查用到的第二操作数是否符合8位位图是一件千万不能疏忽的事. 至于为什么要将这12位 operand2 "八四开", 这个问题就要请教大牛了.
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位的常数循环右移偶数位而得到的, 因此是非法的.
史海拾趣
|
将5.0BSP移值到6.0 上时,运行到串口驱动时,就运行不下去了, DNW提示信息: WARNING: CReg2440Uart::CReg2440Uart failed to obtain processor frequency - using default value (66750000). DEBUG: Serial2 SYSINTR : -766318612 WARNING: C ...… 查看全部问答> |
|
请教如何获取monthcalendar(日历控件)被选中的日期信息,急急急急急急急! 如题,小弟在做一个日程管理的小应用程序, 请问如何获取在日历控件上选定的日期信息, 比如选定某日, 在程序中要提取该日的日期和星期几的信息。 谢谢各位,很急,请大家帮帮忙。… 查看全部问答> |
|
去年夏天,家里用了20多年的老冰箱(老人家买的,买了新冰箱后不够用,所以一直用着)坏了照明灯泡,用起来很不方便。当时把灯泡拿到电子市场去配,竟然找不到这种灯头的,只有作罢。 今天晚上在家没事,就 ...… 查看全部问答> |
|
之前能仿真的。能下载程序的。 后来设置了一下 就只有不行了 一直是 AXD Uable to halt ARM core 我也不知道哪里出了问题。.   ...… 查看全部问答> |
|
#include #include void main(void) { WDTCTL=WDT_MDLY_32; IE1|=WDTIE; P1DIR|=BIT6; while(1); } #pragma vector=WDT_VECTOR __interrupt void watchdor(void) { P1O ...… 查看全部问答> |
|
我也来加入四层板的学习,在上班抽空时间总算布局完了,大概布了下,还不是很整齐,在这里得感谢@okhxyyo 的耐心帮忙和指导~ 希望能大家一起共同进步和学习… 查看全部问答> |




