免费注册 查看新帖 |

Chinaunix

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

[BootLoader] ARM SWI指令编程通信的问题 ,自己很疑惑! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-16 00:45 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
2 [报告]
发表于 2011-04-16 00:45 |只看该作者
本帖最后由 crifan 于 2011-04-17 11:17 编辑

"楼上说,是经过R0传递参数。"
我是指,C语言函数调用,会汇编代码之间,是通过r0-r4传递参数。
(注:此处把你前面说的DISABLE_ENABLE(int)写成ENABLE_DISABLE_INT(bool isEnable)更容易问题的理解和说明。而且虽然编译器支持DISABLE_ENABLE(int)的写法,就其本身就不是个好习惯。)
以你上面为例,此处的参数,对应的是ENABLE_DISABLE_INT(bool isEnable)中的bool值isEnable。

如果没有理解错,那么下面这部分内容可以跳过;
如果你此处把__swi(0)中的0,理解成参数的话,那就理解错了。如果理解错了,那么就看下面的解释;

【__swi(0)中的0,不是参数,而是SWI指令中的内容】
你此处是:
__swi(0)  ENABLE_DISABLE_INT(bool isEnable)
根据这里:
http://hi.baidu.com/l4nneret/blog/item/2eebcffde9c3cffafd037f6a.html
的解释,如果你在C中调用ENABLE_DISABLE_INT(bool isEnable),类似于这样:
...
ENABLE_DISABLE_INT(TRUE) /* Enable Interrupt,此处TRUE=1 */
...
那么,此段代码被编译器编译后的汇编代码里面,在ENABLE_DISABLE_INT(TRUE)的位置,插入类似下面这样的swi指令:
SWI 0
而对应的参数是bool变量TRUE,即1,一般是会被放在寄存器r0里面。
而SWI中的0,是放在汇编中所对应的机器码中。
首先,SWI指令的机器码格式是:

对于你此处SWI 0,就是:
31-2827-24 23-0
Condition field1111Comment field (ignored by Processor)
此处忽略不解释11110000 0000 0000 0000 0000 0000( 此处就是你SWI中的0,后面的SWI处理程序会用到此部分的值)



详情参考此附件:
ARM Processor Instruction Set - ARM7500FEvB_3.pdf (736.18 KB, 下载次数: 97)
中“5.10 Software Interrupt (SWI)”章节。

“  假设 在C中这样定义:   #define IRQ_Disable  (1<<7) 禁止中断 接下来声明软中断  __swi(0)  DISABLE_ENABLE(int)”
你说的这两者之间,有啥关系???

“  这样就进入软中断,管理模式。在我们的bootloader中用软中断散转来区别 软中断号  就是 swi(0)  括号的事0 ,它在SWI指令中,且在C调用SWI时,LR保存下一条指令的地址  。动作是这样。”
“ 请问 R0就是 DISABLE_ENABLE(int) 中用int 定义的参数吗?”
已经解释过了。详见开始部分的内容。

”  如果SWI中断返回时,  我要取R0的值,如何取呢?“
你值得是r0存放的是返回值?
你想要取得返回值???
是在C语言中取R0还是汇编中取R0?

”  如果只执行一个动作,比如禁止中断,或使能中断,比较好办?”
实在无法理解你在说什么。。。。。

“  另外,如果以前的状态禁止软中断,现在是不是要先使能。然后再执行SWI“
据我理解,没有禁止软中断这一说法。只有说,禁止中断IRQ,禁止快速中断FIQ,这些说法,分别的是对应着CPSR中的I位和F位被置1。
SWI指令,硬件会根据其SWI的条件为去执行SWI指令。所以不存在禁止中断这一说法。
你要说可以禁止软中断,那就是禁止SWI指令的指令,那就相当于说禁止其他一些指令,比如B跳转指令的执行,效果是一样的。
除非你写的指令是带条件的,比如:
BEQ XXX -> 如果相等EQ,就跳转到XXX,
SWIEQ XXX -> 如果相等EQ,就执行此SWI指令。


最后,啰嗦一句,麻烦以后有问题的时候,把问题解释清楚,以及排版即使不美观,也要让人看着不讨厌,否则不保证以后有耐心去猜你的意思。。。

论坛徽章:
0
3 [报告]
发表于 2011-04-16 00:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2011-04-16 10:57 |只看该作者
本帖最后由 crifan 于 2011-04-16 11:02 编辑

关于“使用BL 调用C程序中的函数时,如何把C程序中的参数传递给汇编”:
关于汇编中,类似bl的跳转去调用C函数的话,其中参数传递,是依据一定规则,不同的编译器,不同的平台,对应不同的规则。
对于arm来说,一般是依据APCS(ARM  Procedure Call Standard),其更多细节,参见附件: ARM中文指令集.chm (151.04 KB, 下载次数: 118)
其中,此处和参数调用相关的内容是:
“实际参数
APCS没有定义记录、数组、和类似的格局。这样语言可以自由的定义如何进行这些活动。但是,如果你自己的实现实际上不符合 APCS 的精神,那么将不允许来自你的编译器的代码与来自其他编译器的代码连接在一起。典型的,使用 C 语言的惯例。
  • 前 4 个整数实参(或者更少!)被装载到 a1 - a4。
  • 前 4 个浮点实参(或者更少!)被装载到 f0 - f3。
  • 其他任何实参(如果有的话)存储在内存中,用进入函数时紧接在 sp 的值上面的字来指向。换句话说,其余的参数被压入栈顶。所以要想简单。最好定义接受 4 个或更少的参数的函数。


其中a1-a4就是r0-r4,f0-f3:
http://blog.csdn.net/yyt7529/archive/2009/08/02/4401897.aspx
"
a1-a4代表R0-R3,在使用汇编语言写函数时,这四个寄存器在结束时不需要恢复成原值,因此在进入函数时不需要保存
R14~R11通常保存程序的局部变量,也可以用V1~V8表示,但是V1~V4只能在Thumb状态下使用。 R12~R15一般有特殊用途,也通常称为IP,SP,LR,PC。
定义的浮点数寄存器名 f0~f7 F0~F7
定义的协处理器名 p0~p15 寄存器c0~c15,具体参考给定的协处理器。
"

所以,简单解释就是,你用bl调用C的函数时候,传递的参数:
(1)小于等于4个参数时,分别是放在arm的寄存器r0,r1,r2,r3里面的。
(2)大于4个,前四个放在r0-r3,剩下的,以此放到堆栈里面,即用push指令把参数压栈

也正因此,才有这样的说法“最好定义接受 4 个或更少的参数的函数”,即写C程序的时候,最好函数参数不超过4个,否则其生成汇编代码,就有额外利用堆栈来传递你的参数,那肯定没有直接用寄存器传递参数效率高。

关于你的参数是结构体的话,那么传递参数有两种方式:
(1)直接传递整个结构体变量,即整个传递参数的大小,和你结构体一样大,对于小的结构体还算合理,对于大的结构体,就不是个好方法,因为也会涉及到参数太大,寄存器放不下,要利用堆栈传递整个结构体。
(2)只是传递结构体变量所对应的指针,而指针只有4个字节,所以就相当于传递普通一个4字节的变量,对应汇编就可以只需要r0来传递此参数即可,相对上面利用堆栈的方式,效率较高。

总的来说,对于结构体,推荐用传递结构体指针的方式来传递参数。

关于函数返回值的传递,引用附件中的内容:
“函数退出通过把返回连接值传送到程序计数器中来退出函数,并且:
  • 如果函数返回一个小于等于一个字大小的值,则把这个值放置到 a1 中。
  • 如果函数返回一个浮点值,则把它放入 f0 中。
  • sp、fp、sl、v1-v6、和 f4-f7 应当被恢复(如果被改动了)为包含在进入函数时它所持有的值。
    我测试了故意的破坏寄存器,而结果是(经常在程序完全不同的部分)出现不希望的和奇异的故障。
  • ip、lr、a2-a4、f1-f3 和入栈的这些实参可以被破坏。
在 32 位模式下,不需要对 PSR 标志进行跨越函数调用的保护。在 26 位模式下必须这样,并通过传送 lr 到 pc 中(MOVS、或 LDMFD xxx^)来暗中恢复。必须从 lr 重新装载 N、Z、C 和 V,跨越函数保护这些标志不是足够的。  ”

简单说,也就是通过r0传递函数的返回值。

其他关于软中断的事情,不太了解。

论坛徽章:
0
5 [报告]
发表于 2011-04-16 11:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2011-04-16 11:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2011-04-16 16:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2011-04-18 19:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2011-04-18 20:00 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2011-04-18 20:35 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP