完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在eVC编译出的汇编代码中我看到这样的语句:
mov r2, #0xFF, 28 和 orr r2, r2, #0xB 这样得到的结果时 r2=#0xffb , 他试图更直接一点优化成一句:MOV r2,#0xffb 但是这样之后编译就出了问题:error A0092: no immediate rotate operand can be created: 4091 ------------------------------------我是无辜的分割线-------------------------------- 在 mov r2,#0xffb 这句中,不是MOV的用法出错,而是立即数用法出错。 立即数的用法定义在Arm Architechture Reference Manual(简称ARMARM)的A5-4页开始 很重要的一段: An immdediate operand value is formed by rotating an 8-bit constant (in a 32-bit word) by an even number of bits (0,2,4,8,26,28,30). Therefore, each instruction contains an 8-bit constant and a 4-bit rotate to be applied to that constant. Some valid constants are: 0xFF, 0x104, 0xFF0, 0xFF00, 0xFF000, 0xFF000000, 0xF000000F Some invalid constants are: 0x101, 0x102, 0xFF1, 0xFF04, 0xFF003, 0xFFFFFFFF, 0xF000001F 而在下面的A5-6页中提到 shifter_operand = immed_8 Rotate_Right (rotate_imm * 2) 以及 Some values of 所以,综上所述,首先解释清楚了 mov r2,#0xFF,28 一句。28并不是第三个操作数,而是和0xFF并在一起作为立即数使用,将0xFF循环右移28位。而这里必须强调右移XX位必须是个偶数,因为它将等于rotate_imm*2,那么在该指令的机器码中rotate_imm = 14, 也就是在32-BIT的机器码中第11到第8 bit = 1110B 然后再来看 mov r2,#0xFFB 的出错情况 0xFFB = 111111111011B,很显然按照 shifter_operand = immed_8 Rotate_Right (rotate_imm * 2) 的公式, shifter_operand = 0xFFB时无法得到有效的 immed_8 和 rotate_imm, 所以编译出现错误 error A0092: no immediate rotate operand can be created: 4091 也可以理解了,它应该是说无法生成rotate_imm,实际上immed_8也是无法生成的。 关于立即数如何分解成immed_8和rotate_imm,可以参考上面给出的valid constants和invalid constants,简而言之,如果该立即数可以分解成一个8-bit的二进制数循环右移偶数位,那么这个立即数是有效的,反之无效。 在上面的例子中,想要得到 r2 = 0xFFB 那么在汇编里就必须走两步了,一步是无论如何无法到达的。 |
|
相关推荐 |
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-CAN编程示例之开发板测试
852 浏览 0 评论
该问题是用APP给芯海科技的CST92F25芯片发指令是出现的
2844 浏览 1 评论
867 浏览 0 评论
1710 浏览 1 评论
2758 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 05:41 , Processed in 0.998506 second(s), Total 55, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号