Keilc高手请指导: 下面是KeilC编译器错误,或者是我理解错误?
/*编译器版本: c51:6.23a */
/*编译参数
NOREGPARMS 不使用寄存器传参数
RET_XSTK 使用外部数据空间作堆栈
*/
unsigned char testpara(UINT8 pa1) reentrant
{
unsigned char pa2;
pa2=pa1*5+4;
return pa2;
}
/*在程序结尾有返回代码,反汇编为:
-----------------------------------------------------------------
MOV DPTR,0x00YY ;外部堆栈指针回缩
LJMP C?ADDXBP ;外部堆栈回缩子程序
-----------------------------------------------------------------
*/
unsigned char testpara1(UINT8 pa1) reentrant
{
/*
在程序开始的地方有下面的代码:
-----------------------------------------------------------------
MOV DPTR,0x00ZZ ;外部堆栈指针增加
LJMP C?ADDXBPV ;外部堆栈增加子程序,将sp处的返回
; 地址填充到外部堆栈位置,并将XBP-2,
;注:内部堆栈sp向上加,外部堆栈XBP向下减
-----------------------------------------------------------------
*/
unsigned char pa2;
pa2=4;
return testpara(pa2);
}
/*在程序结尾有返回代码,反汇编为:
-----------------------------------------------------------------
MOV DPTR,0x00YY ;外部堆栈指针回缩
CALL C?ADDXBP ;外部堆栈回缩子程序,
;注意!!!!此处XBP(外部堆栈被缩回!!!!!!
;外部堆栈放置的返回地址丢失!!!!!!
LJMP C?RET_XBP ;从外部堆栈XBP中取出返回值,填充到SP中,
;XBP-2,SP+2,但是取出的返回地址是错误的!!!
-----------------------------------------------------------------
*/
void main(void)
{
unsigned char pa1,pa2;
pa1=5;
pa2=testpara(pa1); /*这一句可以正确返回*/
pa2=testpara1(pa1); /*这一句不可以正确返回*/
}
/* 疑点 :
1.为什么testpara函数没有testpara1头部和尾部那样的语句生成?
2.RET_XSTK究竟代表什么含义?
3.如果我希望所有传递到参数都从XBP传递,但是返回地址在SP中定义,
那该如何定义编译参数?
*/
QORSE
2003.12.25
QQ: 67897283
qorse@netease.com
发表时间:2003年12月25日22:31:16