Chinaunix首页 | 论坛 | 博客
  • 博客访问: 725443
  • 博文数量: 124
  • 博客积分: 3156
  • 博客等级: 中校
  • 技术积分: 1584
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-02 10:29
文章分类

全部博文(124)

文章存档

2012年(3)

2011年(2)

2010年(61)

2009年(34)

2008年(24)

我的朋友

分类: LINUX

2009-04-28 18:00:20

可变参数函数与不变参数函数问题:
  大部分编译器对可变参数函数与不变参数函数的参数传递处理是不一样的,以我们经常用的CCS为例,“可变参数函数”的参数传递是通过SP指针传递的,而"不变参数函数"的参数传递是通过A4 A3 A2 A1等几个寄存器传递的,ARM-gcc也一样.
  在ccs中,当你在一个模块中调用一个“可变参数函数“时或调用printf().一定要声明它或包含声明它的头文件,否则编译器将把它当成"不变参数函数"进行编译,这样就会出现一些莫名其妙的错误。
  附件是一个gxv3140DSPBIOS的例子,运行下你就可以看到错误的出现。

要找出上面的错,一定要看程序的反汇编,下面是C6000基本汇编:

STW.D2T2        B3.*SP--[6]        :*SP=*SP-4*6 *(SP)=B3;先开辟24字节空间,在把B3赋给SP所指的地址。
STW.D1      A8.*++A4[A12]    :*(A4+A12*4)=A8
STW..D1            A8.*++A4(8)        :*(A4+8)=A8 ;其中D2 T2等等是CPU的几个功能单元,有L1, .L2, .S1, .S2, .M1, .M2, .D1, and .D2

MVK.L2            -5.B8                    :B8=-5
MVKH.M1     0x12345678.B8        :把高16位付给B8高16位
MVKLH.S1 0x12345678.B8        :B8=0x4567812345,高低换

OR.D2    -12,B2,B8                :B8=B2|(-12)
OR.S1    A3,A4,A5                    :A5=A3|A4

ADD.L2X  A1,B1,B2                    :B2=A1+B1
B3 :一般存放函数返回地址
A4 :用于参数传递,也是返回值存放寄存器。
B15:等于SP的值B15==SP==FP

注意:如看到汇编指令前有“||”则表示这条指令与前面一条指令同时执行
注意:一个函数的开始首先是压栈函数返回地址(B3),再压栈参数,再分配局部变量。
文件:BIOS_printf.rar
大小:729KB
下载:下载
阅读(1245) | 评论(0) | 转发(0) |
0

上一篇:BIOS模块介绍

下一篇:C6000汇编实例详解1.

给主人留下些什么吧!~~