- 论坛徽章:
- 0
|
在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] |
|