在看vivi源代码时,看到如下一段内嵌了arm汇编的代码,有3个疑问
void processor_reset(unsigned long loc)
{
cache_clean_invalidate();
tlb_invalidate();
__asm__(
"mov ip, #0\n"
"mcr p15, 0, ip, c7, c7, 0\n" /* invalidate I,D caches */
"mcr p15, 0, ip, c7, c10, 4\n" /* drain WB */
"mcr p15, 0, ip, c8, c7, 0\n" /* invalidate I & D TLBs */
"mrc p15, 0, ip, c1, c0, 0\n" /* ctrl register */
"bic ip, ip, #0x000f\n" /* ............wcam */
"bic ip, ip, #0x1100\n" /* ...i...s........ */
"mcr p15, 0, ip, c1, c0, 0\n" /* ctrl register */
"mov pc, %0\n"
: : "r" (loc) );
}
问题1:(已解决)
最后一行的::"r"(loc) 是什么意思
问题2:
内嵌的第一条arm指令,mov ip, #0 ,这条语句执行后程序将跳转到0号地址单元执行,这里没有保存返回地址(也就是mcr p15, 0, ip, c7, c7, 0这条指令的地址)
那mov ip, #0 后面的那些指令还会得到执行机会吗
问题3:
ip寄存器和pc寄存器不是同一个吗
[ 本帖最后由 zhuhefang2006 于 2008-10-8 12:19 编辑 ] |