免费注册 查看新帖 |

Chinaunix

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

soliars下编译出的代码,参数搞错了。是什么原因啊。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-09 20:10 |只看该作者 |倒序浏览
在soliars 5.9下遇到一个奇怪的现象。就是从汇编指令看,函数压栈搞错了。
如:一个函数为:
int func(char a,char b ,char * name, int line,char c,char d,char e,char f,char * desc ,...)但是实际调用时,发现实际压栈为:
假设实际调用语句为:func(a,b,name,line,c,d,e,f,desc,g);
但是从汇编指令看,实际压栈却为:
func(a,b,name,desc,line,c,d,e,f,g);

请问这可能是什么原因导致了。

搜索了一下源码,没有发现对func不同定义。

高手支招吧!谢谢了!

论坛徽章:
0
2 [报告]
发表于 2007-03-09 20:24 |只看该作者
贴汇编码出来

论坛徽章:
0
3 [报告]
发表于 2007-03-10 10:02 |只看该作者
在soliars 5.9下遇到一个奇怪的现象。就是从汇编指令看,函数压栈搞错了。
如:一个函数为:
int func(char a,char b ,char * name, int line,char c,char d,char e,char f,char * desc ,...)但是实际调用时,发现实际压栈为:
假设实际调用语句为:func(a,b,name,line,c,d,e,f,desc,g);
但是从汇编指令看,实际压栈却为:
func(a,b,name,desc,line,c,d,e,f,g);

搜索了一下源码,没有发现对func不同定义。

具体汇编对应代码如下:
其中此处FN对应宏__FILE__,在此处对应的值为"../source/smtpprtl.c",FL是宏__LINE__,此处对应的值为304.
由红色处可见,程序将“sender..."的地址送入了l7,但是调用前,却将l7送入了o3,即当成了第四个参数。
由蓝色处可见,程序将行号304送入了i0,但是调用前,却将l7送入了o4,即当成了第五个参数。由此形成了我前文所说的参数移位现象。请问这是什么原因造成的。
mmsOMCFailReport(mooSMTP,mooWARN,FN,FL,0xffff,0,0,0,AUTH_FROM_ERR_M,"sender address %s auth failure!\n" , tmmSmtpLinkCB[wIndex].baSrcAddr);
                [ 304]     1538:  mov         1, %l3
                [ 304]     153c:  mov         2, %l5
                [ 304]     1540:  sethi       %hi(0x0), %l6
                [ 304]     1544:  bset        0, %l6 ! 0x0
                [ 304]     1548:  add         %l6, 24, %l7
                [ 304]     154c:  mov         304, %i0
                [ 304]     1550:  sethi       %hi(0xfc00), %i1
                [ 304]     1554:  bset        1023, %i1 ! 0xffff
                [ 304]     1558:  sethi       %hi(0xb800), %i2
                [ 304]     155c:  bset        155, %i2 ! 0xb89b
                [ 304]     1560:  add         %l6, 48, %i3
                [ 304]     1564:  lduh        [%fp + 78], %l0
                [ 304]     1568:  sll         %l0, 2, %l2
                [ 304]     156c:  sll         %l0, 5, %l1
                [ 304]     1570:  add         %l2, %l1, %l2
                [ 304]     1574:  sll         %l0, 7, %l1
                [ 304]     1578:  add         %l2, %l1, %l2
                [ 304]     157c:  sll         %l0, 10, %l1
                [ 304]     1580:  add         %l2, %l1, %l2
                [ 304]     1584:  sll         %l0, 12, %l1
                [ 304]     1588:  add         %l2, %l1, %l2
                [ 304]     158c:  sll         %l0, 13, %l1
                [ 304]     1590:  add         %l2, %l1, %l0
                [ 304]     1594:  sethi       %hi(0x0), %l1
                [ 304]     1598:  bset        0, %l1 ! 0x0
                [ 304]     159c:  add         %l0, %l1, %l0
                [ 304]     15a0:  or          %l3, %g0, %o0
                [ 304]     15a4:  or          %l5, %g0, %o1
                [ 304]     15a8:  or          %l6, %g0, %o2
                [ 304]     15ac:  or          %l7, %g0, %o3
                [ 304]     15b0:  or          %i0, %g0, %o4
                [ 304]     15b4:  or          %i1, %g0, %o5
                [ 304]     15b8:  clr         [%sp + 92]
                [ 304]     15bc:  clr         [%sp + 96]
                [ 304]     15c0:  clr         [%sp + 100]
                [ 304]     15c4:  st          %i2, [%sp + 104]
                [ 304]     15c8:  st          %i3, [%sp + 108]
                [ 304]     15cc:  call        mmsOMCFailReport
                [ 304]     15d0:  st          %l0, [%sp + 112]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2007-05-01 09:30 |只看该作者
肯定是 gcc 有问题啦。
楼主的常识是不会有问题的。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2007-05-01 10:40 |只看该作者
原帖由 flw 于 2007-5-1 09:30 发表
肯定是 gcc 有问题啦。
楼主的常识是不会有问题的。

论坛徽章:
0
6 [报告]
发表于 2007-05-01 22:32 |只看该作者
请把第一,二个参数的定义贴出来. mooSMTP,mooWARN

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2007-05-01 23:01 |只看该作者
原帖由 mingjwan 于 2007-3-9 20:10 发表
在soliars 5.9下遇到一个奇怪的现象。就是从汇编指令看,函数压栈搞错了。
如:一个函数为:
int func(char a,char b ,char * name, int line,char c,char d,char e,char f,char * desc ,...)但是实际调用时,发 ...

这样压栈也没有任何问题啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP