打印

ADD操作立即数的范围是多少

[复制链接]
3264|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanjinbin0|  楼主 | 2012-5-8 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用STM32F107芯片.
使用IAR编译器.
代码如下:
        MOV R1,#0xFFFF
        ADD  R1,R1, #0xFF               ;ADD 支持8位立即数的加法
        ADDW R1,R1, #0xFFF            ;ADDW 支持12位立即数的加法
        
        ADDS.N R1,R1, #0xFF            ;.N操作数常数,该常数范围是8位常数,0x00~0xFF
        ;ADDS.W R1,R1, #0xFFF         ;这里编译出错?
        ADDS.W R1,R1, #0x10000      ;但为什么这个也不出错.

看到在ADDS.W操作数为一个常数时.
0xFFF 出错
0x10000 不出错.
这里0x10000的数肯定大于0xFFF的,但为什么会这样呢???
沙发
watcher| | 2012-5-8 14:41 | 只看该作者
ARM对立即数有要求,具体看ARM体系结构手册,或者指令集手册。
你想想32位的指令里面怎么可能表示所有的32位立即数呢?

使用特权

评论回复
板凳
布川酷子| | 2012-5-10 21:27 | 只看该作者
ARM立即数的是由一个8位的常数循环右移偶数位得到的,其中循环右移的位数由一个4位2进制的两倍表示,公式如下:immediate=immed_8<<(2*rotate_imm4),这里“<<”表示循环右移。
也就是说一个小于等于0xff的立即数是肯定合法的,而大于0xff的奇数一定不是合法的……

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
yanjinbin0 + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

0

粉丝