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的用意。谁能给我个答案,这个问题已经困扰我半年之久了。 自己顶一下。这条语句是比较常见的,怎么没人帮一下啊?期待中啊。。。。。。 译码时有的会译成 mov r0, r0
但实际就是 nop 对啊,它就是nop指令,我的意思就是,为什么这里需要nop指令。 貌似跟流水线什么的有关 以前在哪看过,记不清了 :oops::oops: 是的,我原来也是这么想的,但是感觉不踏实,总觉得可能还有什么其它的。
不知道这样解释对不对:
ldmdb sp, {r0 - lr}^ 虽然该指令执行完了,但是可能数据还没有真正完全传递完。
mov r0, r0
add sp, sp, #S_FRAME_SIZE - S_PC
movs pc, lr pc=lr,cpsr=spsr,引起模式切换。因此在ldmdb和本条指令之间需要有两条指令进行间隔。
我上面的解释是没有什么依据的,只是一点想法。希望各位大佬能够解释清楚,让我可以安心,谢谢! 刚才做了一个实验
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)
在arm中nop是伪指令,它实际翻译成mov r0, r0。
我的问题提的不是很好?我想说的是,为什么需要添加mov r0,r0,或者说nop伪指令。 你是想问为什么要设计一个 nop 指令,是这个意思吗? 不是,你看一下我的主帖。我指的是在这里代码中为什么要用nop指令。