jwwzhh 发表于 2011-07-14 23:20

arm中mov r0, r0的作用是?

在内核中,我看到过好几处使用了mov r0, r0的指令。我知道它是一条空语句,就是让cpu多运行一条指令,相当于有些单片机的nop指令。但是不理解为什么要是用这条指令,比如:
arch/arm/kernel/entry-common.S:在执行用户程序时,发生中断,当中断处理完后,下面这段程序就是返回的一些操作。/*
* "slow" syscall return path."why" tells us if this was a real syscall.
*/
ENTRY(ret_to_user)
ret_slow_syscall:
        disable_irq                                @ disable interrupts
        ldr        r1,
        tst        r1, #_TIF_WORK_MASK
        bne        work_pending
no_work_pending:
        /* perform architecture specific actions before user return */
        arch_ret_to_user r1, lr

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

jwwzhh 发表于 2011-07-15 09:37

自己顶一下。这条语句是比较常见的,怎么没人帮一下啊?期待中啊。。。。。。

platinum 发表于 2011-07-15 09:55

译码时有的会译成 mov r0, r0
但实际就是 nop

jwwzhh 发表于 2011-07-15 11:24

对啊,它就是nop指令,我的意思就是,为什么这里需要nop指令。

amarant 发表于 2011-07-15 11:43

貌似跟流水线什么的有关 以前在哪看过,记不清了 :oops::oops:

jwwzhh 发表于 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和本条指令之间需要有两条指令进行间隔。
我上面的解释是没有什么依据的,只是一点想法。希望各位大佬能够解释清楚,让我可以安心,谢谢!

platinum 发表于 2011-07-15 14:06

刚才做了一个实验
ARM 指令(非 thumb),32bit
        mov r15, r15
        mov r14, r14
        mov r13, r13
        mov r12, r12
        mov r11, r11
        mov r10, r10
        mov r9, r9
        mov r8, r8
        mov r7, r7
        mov r6, r6
        mov r5, r5
        mov r4, r4
        mov r3, r3
        mov r2, r2
        mov r1, r1
        mov r0, r0
        nop
编译、译码后的结果如下
   0:        e1a0f00f         mov        pc, pc
   4:        e1a0e00e         mov        lr, lr
   8:        e1a0d00d         mov        sp, sp
   c:        e1a0c00c         mov        ip, ip
10:        e1a0b00b         mov        fp, fp
14:        e1a0a00a         mov        sl, sl
18:        e1a09009         mov        r9, r9
1c:        e1a08008         mov        r8, r8
20:        e1a07007         mov        r7, r7
24:        e1a06006         mov        r6, r6
28:        e1a05005         mov        r5, r5
2c:        e1a04004         mov        r4, r4
30:        e1a03003         mov        r3, r3
34:        e1a02002         mov        r2, r2
38:        e1a01001         mov        r1, r1
3c:        e1a00000         nop                        ; (mov r0, r0)
40:        e1a00000         nop                        ; (mov r0, r0)

jwwzhh 发表于 2011-07-15 14:54

在arm中nop是伪指令,它实际翻译成mov r0, r0。
我的问题提的不是很好?我想说的是,为什么需要添加mov r0,r0,或者说nop伪指令。

platinum 发表于 2011-07-15 15:01

你是想问为什么要设计一个 nop 指令,是这个意思吗?

jwwzhh 发表于 2011-07-15 15:06

不是,你看一下我的主帖。我指的是在这里代码中为什么要用nop指令。
页: [1] 2 3
查看完整版本: arm中mov r0, r0的作用是?