免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 21436 | 回复: 23
打印 上一主题 下一主题

arm中mov r0, r0的作用是? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-14 23:20 |只看该作者 |倒序浏览
在内核中,我看到过好几处使用了mov r0, r0的指令。我知道它是一条空语句,就是让cpu多运行一条指令,相当于有些单片机的nop指令。但是不理解为什么要是用这条指令,比如:
arch/arm/kernel/entry-common.S:在执行用户程序时,发生中断,当中断处理完后,下面这段程序就是返回的一些操作。
  1. /*
  2. * "slow" syscall return path.  "why" tells us if this was a real syscall.
  3. */
  4. ENTRY(ret_to_user)
  5. ret_slow_syscall:
  6.         disable_irq                                @ disable interrupts
  7.         ldr        r1, [tsk, #TI_FLAGS]
  8.         tst        r1, #_TIF_WORK_MASK
  9.         bne        work_pending
  10. no_work_pending:
  11.         /* perform architecture specific actions before user return */
  12.         arch_ret_to_user r1, lr

  13.         @ slow_restore_user_regs
  14.         ldr        r1, [sp, #S_PSR]                @ get calling cpsr
  15.         ldr        lr, [sp, #S_PC]!                @ get pc
  16.         msr        spsr_cxsf, r1                        @ save in spsr_svc
  17.         ldmdb        sp, {r0 - lr}^                        @ get calling r0 - lr
  18.         mov        r0, r0
  19.         add        sp, sp, #S_FRAME_SIZE - S_PC
  20.         movs        pc, lr                                @ return & move spsr_svc into cpsr
  21. ENDPROC(ret_to_user)
复制代码
就是不明白上面这里指令mov r0, r0的用意。谁能给我个答案,这个问题已经困扰我半年之久了。

论坛徽章:
0
2 [报告]
发表于 2011-07-15 09:37 |只看该作者
自己顶一下。这条语句是比较常见的,怎么没人帮一下啊?期待中啊。。。。。。

论坛徽章:
0
3 [报告]
发表于 2011-07-15 09:55 |只看该作者
译码时有的会译成 mov r0, r0
但实际就是 nop

论坛徽章:
0
4 [报告]
发表于 2011-07-15 11:24 |只看该作者
对啊,它就是nop指令,我的意思就是,为什么这里需要nop指令。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
5 [报告]
发表于 2011-07-15 11:43 |只看该作者
貌似跟流水线什么的有关 以前在哪看过,记不清了

论坛徽章:
0
6 [报告]
发表于 2011-07-15 13:33 |只看该作者
是的,我原来也是这么想的,但是感觉不踏实,总觉得可能还有什么其它的。
不知道这样解释对不对:
ldmdb        sp, {r0 - lr}^          虽然该指令执行完了,但是可能数据还没有真正完全传递完。
mov         r0, r0                       
add           sp, sp, #S_FRAME_SIZE - S_PC
movs        pc, lr                        pc=lr,cpsr=spsr,引起模式切换。因此在ldmdb和本条指令之间需要有两条指令进行间隔。
我上面的解释是没有什么依据的,只是一点想法。希望各位大佬能够解释清楚,让我可以安心,谢谢!

论坛徽章:
0
7 [报告]
发表于 2011-07-15 14:06 |只看该作者
刚才做了一个实验
ARM 指令(非 thumb),32bit

  1.         mov r15, r15
  2.         mov r14, r14
  3.         mov r13, r13
  4.         mov r12, r12
  5.         mov r11, r11
  6.         mov r10, r10
  7.         mov r9, r9
  8.         mov r8, r8
  9.         mov r7, r7
  10.         mov r6, r6
  11.         mov r5, r5
  12.         mov r4, r4
  13.         mov r3, r3
  14.         mov r2, r2
  15.         mov r1, r1
  16.         mov r0, r0
  17.         nop
复制代码
编译、译码后的结果如下

  1.    0:        e1a0f00f         mov        pc, pc
  2.    4:        e1a0e00e         mov        lr, lr
  3.    8:        e1a0d00d         mov        sp, sp
  4.    c:        e1a0c00c         mov        ip, ip
  5.   10:        e1a0b00b         mov        fp, fp
  6.   14:        e1a0a00a         mov        sl, sl
  7.   18:        e1a09009         mov        r9, r9
  8.   1c:        e1a08008         mov        r8, r8
  9.   20:        e1a07007         mov        r7, r7
  10.   24:        e1a06006         mov        r6, r6
  11.   28:        e1a05005         mov        r5, r5
  12.   2c:        e1a04004         mov        r4, r4
  13.   30:        e1a03003         mov        r3, r3
  14.   34:        e1a02002         mov        r2, r2
  15.   38:        e1a01001         mov        r1, r1
  16.   3c:        e1a00000         nop                        ; (mov r0, r0)
  17.   40:        e1a00000         nop                        ; (mov r0, r0)
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-07-15 14:54 |只看该作者
在arm中nop是伪指令,它实际翻译成mov r0, r0。
我的问题提的不是很好?我想说的是,为什么需要添加mov r0,r0,或者说nop伪指令。

论坛徽章:
0
9 [报告]
发表于 2011-07-15 15:01 |只看该作者
你是想问为什么要设计一个 nop 指令,是这个意思吗?

论坛徽章:
0
10 [报告]
发表于 2011-07-15 15:06 |只看该作者
不是,你看一下我的主帖。我指的是在这里代码中为什么要用nop指令。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP