免费注册 查看新帖 |

Chinaunix

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

奇怪的编译问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-26 14:32 |只看该作者 |倒序浏览
编译lpc3250的工程时发现参数传送不正确,可是同样的工程在s3c44b0x下编译参数传送确实正确的,比较了一下二者汇编的差异,发现在s3c44b0x下多了一个r4的动作,可是不知道时什么原因造成二者的差异?是编译选项引起的吗?可是比较二者的编译选项,除了lpc3250打开了vfp外,其他都相同啊?不知道有没有大侠能指导一下?

以下是相对应的程序:

--- cpp example ---  
...      
int ClassA::func(int A, int B, double C, double *D, double E[],double F[],double &G,double &H);         
...

ClassA *pClassA;

int main (char* name)      
{                        
   ...
   ...
   
   int n = pClassA->func(a, b, c, d, e, f, g, h);   

   return 0;
}                        

                          
--- s3c44b0x下 arm code ---         
func:  
      mov      r12, sp                             ;r12(ip)设置为sp的值;保存sp
      sub      sp, sp, #4  ; 0x4               ;堆栈预留出保存函数跳转地址的位置
    stmdb  sp!, {r4, r11, r12, lr, pc}   ;将上一级函数的环境及r4压栈
    sub      r11, r12, #8    ; 0x8
      sub      sp, sp, #36 ; 0x24            ;建立中间变量
    mov      r4, r0                                ;参数r0(pClassA)传给r4
      str        r1, [r11, -#20]                  ;参数a传给A
      str        r2, [r11, -#24]                  ;参数b传给B
      str        r3, [r11, #4]                     ;参数c传给C
      
      
--- lpc3250下 arm code ---         
func:  
      mov     r12, sp                            ;r12(ip)设置为sp的值;保存sp
      sub     sp, sp, #4 ; 0x4               ;堆栈预留出保存函数跳转地址的位置
    stmfd  sp!, {r11, r12, lr, pc}       ;将上一级函数的环境压栈
    sub     r11, r12, #8 ; 0x8
      sub     sp, sp, #40    ; 0x28        ;建立中间变量
    str       r0, [r11, #-20]                 ;参数r0(pClassA)传给A
      str       r1, [r11, #-24]                 ;参数a传给B
      str       r2, [r11, #-28]                 ;参数b传给C
      str       r3, [r11, #4]                    ;参数c传给D

论坛徽章:
0
2 [报告]
发表于 2009-12-10 15:19 |只看该作者
看样子这么问是没人回答了。要么我换个问法:

程序如下:

int ClassA::func(int A, int B, double C, double *D, double E[],double F[],double &G,double &H);         
...

ClassA g_ClassA;

int main (char* name)      
{                        
   ...
   
   int n = g_ClassA.func(a, b, c, d, e, f, g, h);   
   ...

   return 0;
}                        

主函数main()中调用g_ClassA.func(a, b, c, d, e, f, g, h);,单步调试进入到func(..)中却发现传给A的是g_ClassA的地址值,传给B的是a,传给C的是b...以此类推。为什么会这样呢?怀疑是编译gcc时选项没配好或者应用程序中的编译选项有问题,请大家帮忙看看,有人遇到过吗?

论坛徽章:
0
3 [报告]
发表于 2009-12-10 18:00 |只看该作者
汗~~,一个arm7,另外一个arm9,估计编译器优化的

论坛徽章:
0
4 [报告]
发表于 2009-12-16 17:42 |只看该作者
s3c44b0x是arm7的核,lpc3250是arm9的核这些都知道,只是s3c44b0x的编译器是现成的,而lpc3250的编译器是自己编译的,以下编译gcc时的选项,请大侠帮忙看看有没有问题,或者哪位帮忙在自己的机器上试试,那就太好了。


./configure --target=arm-elf --prefix=<安装目录>
        --with-gnu-as --with-gnu-ld
        --enable-languages=c --without-newlib
        --without-headers --disable-shared --disable-libssp
        --with-cpu=arm926ej-s --with-fpu=vfp

论坛徽章:
0
5 [报告]
发表于 2009-12-16 17:46 |只看该作者
再补充一下,上面完成后编译了c库文件newlib,之后对gcc又配置了一下,具体如下:

./configure --target=arm-elf --prefix=<安装目录>
        --with-gnu-as --with-gnu-ld
        --enable-languages=c,c++
        --with-newlib
        --disable-shared --disable-libssp
        --with-cpu=arm926ej-s --with-fpu=vfp
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP