免费注册 查看新帖 |

Chinaunix

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

关于内嵌arm汇编的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-01 00:38 |只看该作者 |倒序浏览
在看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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-04 12:58 |只看该作者

回复 #1 zhuhefang2006 的帖子

详细看一下ARM指令手册和寻指方式。

论坛徽章:
0
3 [报告]
发表于 2008-10-04 23:16 |只看该作者
这里的内嵌汇编挺奇怪的,和我在书上看到的内嵌格式不一样,所以不太理解

论坛徽章:
0
4 [报告]
发表于 2008-10-08 11:35 |只看该作者
: "r" (loc)
让loc这个c变量,取代汇编代码中的输入操作数%0
并且将loc这个变量保存在某个r寄存器中,选择哪个r寄存器是由arm-linux-gcc编译器选择的

不知道这样理解对不对

评分

参与人数 1可用积分 +15 收起 理由
bitmilong + 15 鼓勵

查看全部评分

论坛徽章:
0
5 [报告]
发表于 2008-10-08 11:38 |只看该作者
后面二个问题还没解决,期待中.............

[ 本帖最后由 zhuhefang2006 于 2008-10-8 12:19 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-10-17 16:36 |只看该作者
对于问题2,问题3,原来我是理解错误了
根据ATPCS标准,即arm-thumb produce call standard
ip 是r12 的别名
pc是r15的别名
问题2是我把ip误解为pc了

论坛徽章:
0
7 [报告]
发表于 2008-10-17 16:37 |只看该作者
在网上google了一下,关于arm的ip寄存器即r12的作用
在一篇文章里这样写到
寄存器 r12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。

对这段话我不太理解,有人能够讲的通俗一点吗

从上面的代码看来,我感觉ip仅仅就是作为一个通用寄存器来用的,不知道r12有什么其他特殊作用吗

论坛徽章:
0
8 [报告]
发表于 2008-10-18 08:59 |只看该作者

回复 #7 zhuhefang2006 的帖子

都是i386若的祸,都是i386的错,386CPU有一个IP寄存器,为了便于作者的理解,所以沿用了386的寄存器描述。

论坛徽章:
0
9 [报告]
发表于 2008-10-18 17:41 |只看该作者
原帖由 rodgerluo 于 2008-10-18 08:59 发表
都是i386若的祸,都是i386的错,386CPU有一个IP寄存器,为了便于作者的理解,所以沿用了386的寄存器描述。



可是这里的arm里的ip和x86里的ip寄存器作用不太一样吧,
感觉x86里的ip和arm里的r15(即pc)才是对应的吧,它们都用来存放下一条要执行的代码的存放位置
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP