- 论坛徽章:
- 1
|
咱就想问问研究标准的大神们,有看到过这个东西吗?
没有其他意思。
事情的缘由是这样的,
尝试用两参数调用 SVC
- void call_svc (void *arg0, void *arg1)
- {
- register int r0 __asm__ ("r0") = (int)arg0;
- register int r1 __asm__ ("r1") = (int)arg1;
- __asm__ (
- " SVC 0x88 \n"
- :
- : "r"(r0), "r"(r1)
- );
- }
复制代码 以上代码不能达到效果,r0, r1没被直观调用,很多时候会被优化掉,r0,r1不会存有两个函数参数的值。
于是我调用svc就不正确了。
防止优化,你懂的,加volatile嘛。
蹊跷的是,需要加在以下两个地方,才能达到目标。
其中一处就是1楼的问题。
加在其他参数如arg0,arg1, r0, r1等,均未能达到目标。
- volatile void call_svc (void *arg0, void *arg1)
- {
- register int r0 __asm__ ("r0") = (int)arg0;
- register int r1 __asm__ ("r1") = (int)arg1;
- __asm__ volatile(
- " SVC 0x88 \n" // Call SVC
- :
- : "r"(r0), "r"(r1)
- );
- }
复制代码 (以上为不同优化选项下的测试结果。未经证实)
可能有人会问,为什么不直接写asm呢,就没这些麻烦了。
但是麻烦在后面,加入asm,就需要客户重新配置他的编译环境,设定asm选项;
不加asm,我可以将所有代码打包成一个 .c 文件,用户的项目加入此一个 .c即可。
(sqlite代码提供了类似的方式,两套源文件 --- 一套分立的多个.c代码,一套仅一个.c代码,方便用户集成编译 .c )
pm觉得变态吧,这就是实际问题。
未必最佳办法,解决代价较小的可行思路而已。。。尔等,未变态之前,是不会理解的。
|
|