W_Controller 发表于 2012-11-24 11:41

MOV R0,R0有何意义?

start
MOV R0,R0

bl disable_watch_dog

bl memsetup

bl copy_steppingstone_to_sdram

ldr pc, =on_sdram

大家看这段代码,其中MOV R0,R0到底起了什么作用,有何意义呢?

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了?难道没有其他作用?

W_Controller 发表于 2012-11-24 14:08

本帖最后由 W_Controller 于 2012-11-25 15:12 编辑

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

W_Controller 发表于 2012-11-24 14:10

本帖最后由 W_Controller 于 2012-11-25 15:12 编辑

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

W_Controller 发表于 2012-11-24 19:10

本帖最后由 W_Controller 于 2012-11-25 15:14 编辑

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

jlass 发表于 2012-11-26 14:30

虽然知道MOV R0, R0相当于NOP,但我一直想问,那干嘛不直接用NOP呢,写成MOV R0, R0很好玩吗?

W_Controller 发表于 2012-11-26 16:51

虽然知道MOV R0, R0相当于NOP,但我一直想问,那干嘛不直接用NOP呢,写成MOV R0, R0很好玩吗?
jlass 发表于 2012-11-26 14:30 https://bbs.21ic.com/images/common/back.gif这个三楼airwill说了,arm 没有特别的 NOP 指令。

W_Controller 发表于 2012-11-26 18:07

不知道程序一开始加这个NOP是什么意思?

jlass 发表于 2012-11-27 08:40

本帖最后由 jlass 于 2012-11-27 12:39 编辑

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

xwj 发表于 2012-11-27 09:09

哎,没一个说明白为什么要这么做的。

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

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

W_Controller 发表于 2012-11-27 09:40

哎,没一个说明白为什么要这么做的。

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

aozima 发表于 2012-11-27 12:22

哎,没一个说明白为什么要这么做的。

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

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

jlass 发表于 2012-11-27 12:46

我觉得楼上两位说的都太玄了,可否直接告知其出处(某本书或是某个文档),请不吝赐教。

killvx 发表于 2012-11-28 11:43

还是没有人说清楚啦 来个大神解释一下吧

xinzha 发表于 2012-11-28 12:55

没人规定程序入口一定要加nop,加了也不见得有用。ARM跟MIPS不一样,没有延迟槽的概念,所以长周期指令后面不必要跟nop。

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

W_Controller 发表于 2012-11-29 15:10

jlass有心了,谢谢你。论坛有你们真好:)

ucx 发表于 2025-9-15 12:49

这个10几年前的帖子,还没看到答案,我想是不是因为代码的分段是32位对齐的,刚好到这个地方不对齐,所以用一个全0的16位填充以达到32位对齐。
页: [1]
查看完整版本: MOV R0,R0有何意义?