打印

MOV R0,R0有何意义?

[复制链接]
8744|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
W_Controller|  楼主 | 2012-11-24 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
aozima| | 2012-11-24 11:49 | 只看该作者
NOP

使用特权

评论回复
板凳
airwill| | 2012-11-24 13:26 | 只看该作者
就是 NOP 指令. arm 没有特别的 NOP 指令, 就用这条无意义的操作来实现 NOP.

使用特权

评论回复
地板
W_Controller|  楼主 | 2012-11-24 13:42 | 只看该作者
怎么大侠也说是NOP了?难道没有其他作用?

使用特权

评论回复
5
W_Controller|  楼主 | 2012-11-24 14:08 | 只看该作者
本帖最后由 W_Controller 于 2012-11-25 15:12 编辑

谢谢2楼,3楼两位大侠,刚才我查了下资料,确实都说是用MOV R0, R0来做NOP使用的。

使用特权

评论回复
6
W_Controller|  楼主 | 2012-11-24 14:10 | 只看该作者
本帖最后由 W_Controller 于 2012-11-25 15:12 编辑

一开始我也是想到这个是NOP,但是由于以前看到有些程序在声明变量(比如int a;)的时候,会在主程序中写着
a = a;说是为了防止编译器对为引用的变量做报错的处理,所以就想MOV R0,R0是不是也有其他用途,呵呵。

使用特权

评论回复
7
W_Controller|  楼主 | 2012-11-24 19:10 | 只看该作者
本帖最后由 W_Controller 于 2012-11-25 15:14 编辑

如果MOVR0, R0相当于NOP,那程序起始放这条指令有何作用呢?

使用特权

评论回复
8
jlass| | 2012-11-26 14:30 | 只看该作者
虽然知道MOV R0, R0相当于NOP,但我一直想问,那干嘛不直接用NOP呢,写成MOV R0, R0很好玩吗?

使用特权

评论回复
9
W_Controller|  楼主 | 2012-11-26 16:51 | 只看该作者
虽然知道MOV R0, R0相当于NOP,但我一直想问,那干嘛不直接用NOP呢,写成MOV R0, R0很好玩吗?
jlass 发表于 2012-11-26 14:30
这个三楼airwill说了,arm 没有特别的 NOP 指令。

使用特权

评论回复
10
W_Controller|  楼主 | 2012-11-26 18:07 | 只看该作者
不知道程序一开始加这个NOP是什么意思?

使用特权

评论回复
11
jlass| | 2012-11-27 08:40 | 只看该作者
本帖最后由 jlass 于 2012-11-27 12:39 编辑

很多跳转都会这么做,因为跳转指令需要两个指令周期,在bl这种长跳转之后马上接一个bl长跳转是会出错的,中间加一个nop已满足系统流水线要求(个人意见,请勿拍砖)

使用特权

评论回复
12
xwj| | 2012-11-27 09:09 | 只看该作者
哎,没一个说明白为什么要这么做的。

真正的原因其实是:
由于ARM同时支持16位指令和32位指令,所以当系统受到干扰、PC指针意外修改程序错乱时,有一定的可能跑到不对齐的指令上,比如从一个32位指令的中间执行,这时系统会整个全乱套而不能恢复。
比如程序以32位跑到无代码区0xFFFF0002,一路顺序执行下去,直到0x00000002,就会执行到不对齐代码。

而在每个跳转入口前加入NOP,则不会存在不对齐问题了。
为了通用,做编译器的意识到这个问题可能性的话就会有意识的加上这个。

使用特权

评论回复
13
W_Controller|  楼主 | 2012-11-27 09:40 | 只看该作者
哎,没一个说明白为什么要这么做的。

真正的原因其实是:
由于ARM同时支持16位指令和32位指令,所以当系统受到干扰、PC指针意外修改程序错乱时,有一定的可能跑到不对齐的指令上,比如从一个32位指令的中间执行,这 ...
xwj 发表于 2012-11-27 09:09
哎,终于有大侠出现了。xwj的意思是说加了nop能够防止程序错乱跑到不对齐的指令上。这是“其然”,还请大侠不吝赐教,讲解一下其“所以然”。呵呵,我是不是有点钻牛角尖了;P

使用特权

评论回复
14
aozima| | 2012-11-27 12:22 | 只看该作者
哎,没一个说明白为什么要这么做的。

真正的原因其实是:
由于ARM同时支持16位指令和32位指令,所以当系统受到干扰、PC指针意外修改程序错乱时,有一定的可能跑到不对齐的指令上,比如从一个32位指令的中间执行,这 ...
xwj 发表于 2012-11-27 09:09


如果这里NOP是32位指令,跳到中间一样会挂掉。 MOV R0,R0的机器码并不是0吧。
这里是汇编代码,是人工编写的,并不是编译器生成的。
且放在reset处,用于上电延迟启动的,虽然这样作用并不是很大。

使用特权

评论回复
15
jlass| | 2012-11-27 12:46 | 只看该作者
我觉得楼上两位说的都太玄了,可否直接告知其出处(某本书或是某个文档),请不吝赐教。

使用特权

评论回复
16
killvx| | 2012-11-28 11:43 | 只看该作者
还是没有人说清楚啦 来个大神解释一下吧

使用特权

评论回复
17
xinzha| | 2012-11-28 12:55 | 只看该作者
没人规定程序入口一定要加nop,加了也不见得有用。ARM跟MIPS不一样,没有延迟槽的概念,所以长周期指令后面不必要跟nop。

使用特权

评论回复
18
jlass| | 2012-11-28 15:32 | 只看该作者
我先说一下,我的解释的出处吧
ARM9五级流水线结构
http://www.21ic.com/app/embed/200903/34441.htm
刚才百度了一下,这是别人讨论的
http://bbs.chinaunix.net/thread-3565986-1-1.html

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
W_Controller + 1
19
W_Controller|  楼主 | 2012-11-29 15:10 | 只看该作者
jlass有心了,谢谢你。论坛有你们真好:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

169

帖子

0

粉丝