OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4135|回复: 11

关于有效立即数的问题,请高手帮忙解答一下

[复制链接]

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
发表于 2017-1-7 23:07:12 | 显示全部楼层 |阅读模式
1金钱
如题,ARM汇编指令中使用到的立即数是是由一个8位的立即数循环左移偶数位得到,所以并不是每一个立即数都是有效立即数。但是我刚才发现使用如下指令:MOV R0,#0xfffffffe
编译通过,结果正确。我不明白,这个立即数0xfffffffe是如何由“一个8位的立即数循环左移”得到的,还请大家帮忙答疑解惑一下,谢谢!

最佳答案

查看完整内容[请看2#楼]

“MOV R0,#0xfffffffe”会被编译器转成“MVN R0, #0x00000001”吧 修正:应该是汇编器Assembler不是编译器Compiler
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2017-1-7 23:07:13 | 显示全部楼层

本帖最后由 K.O.Carnivist 于 2017-1-9 12:28 编辑

“MOV R0,#0xfffffffe”会被编译器转成“MVN R0, #0x00000001”吧

修正:应该是汇编器Assembler不是编译器Compiler
淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2017-1-7 23:08:10 | 显示全部楼层
@正点原子 @八度空间 麻烦帮忙看看呗
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2017-1-9 10:24:08 | 显示全部楼层
为什么没有讨论一下呢,额,好尴尬,再@一下。@八度空间 @正点原子 。同志们,给点思路呗。
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2017-1-9 11:00:52 | 显示全部楼层
这么多人查看没人解答吗,帮顶一下呗,谢谢大家了
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11539
金钱
11539
注册时间
2014-4-1
在线时间
1314 小时
发表于 2017-1-9 11:37:52 | 显示全部楼层

ARM汇编指令中使用到的立即数是是由一个8位的立即数循环左移偶数位得到   —— 这句话哪里看到的?十有八九断章取义了。

MOV R0,#0xfffffffe   —— 这条指令哪里体现移位了?

回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2017-1-9 12:07:03 | 显示全部楼层
xuande 发表于 2017-1-9 11:37
ARM汇编指令中使用到的立即数是是由一个8位的立即数循环左移偶数位得到   —— 这句话哪里看到的?十有八 ...

32位ARM指令的总长度是32位,里面是放不下完整的32位立即数的。处理方法是用12位,其中8位表示立即数,另外4位表示将它右移多少位。

对于“MOV R0,#0xfffffffe”,
移位是在指令机器码解码的时候完成的。
这样一条语句,汇编器会自动处理成类似于“把0x01循环右移0位,然后取反赋给R0”。

淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2017-1-9 14:56:16 | 显示全部楼层
代码上写的,跟实际汇编出来的机器码并不一定是一致的。如果无法用移位得到该立即数,汇编器会帮你开文字池。汇编器会帮你处理了。
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2017-1-9 15:12:29 | 显示全部楼层
xuande 发表于 2017-1-9 11:37
ARM汇编指令中使用到的立即数是是由一个8位的立即数循环左移偶数位得到   —— 这句话哪里看到的?十有八 ...

你可以看看官方文档,的确是这么回事。大概给你解释一下就是:一条指令是32位,当翻译成机器码后,其中指令助记符和寄存器占用20bit,那么剩下留给立即数的就只有12bit。看到这里你就知道,并不是所有的立即数都是有效立即数。那么哪些是有效的立即数呢,就是这句话里面所描述的方法得到的都是有效立即数。
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2017-1-9 15:16:05 | 显示全部楼层
shikihane 发表于 2017-1-9 14:56
代码上写的,跟实际汇编出来的机器码并不一定是一致的。如果无法用移位得到该立即数,汇编器会帮你开文字池 ...

不赞同你的说法,我这个汇编用到的指令是MOV不是LDR,非有效立即数会直接报错的,如果照你这么说非有效立即数就不会报错了,但是实际上并非如此。至于你说的这个文字池处理,我不了解,不知道是否有相关资料可以分享参考一下,谢谢。
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2017-1-9 15:33:02 | 显示全部楼层
K.O.Carnivist 发表于 2017-1-9 11:03
“MOV R0,#0xfffffffe”会被编译器转成“MVN R0, #0x00000001”吧

修正:应该是汇编器Assembler不是编译 ...

不好意思,我看错了,是你说的这样,之前我看汇编窗口把MVN看成了MOV,还反复检查了好几次,真是尴尬。谢谢了。
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2016-11-7
在线时间
10 小时
 楼主| 发表于 2017-1-9 15:38:50 | 显示全部楼层
给大家分享一下吧。怪我自己之前没有好好看清楚,的确和楼上说的一样,IDE给处理了一下,最后如图所示变成了MVN。
IMG_0089.JPG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 06:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表