在Keil C中调试uc/OS-II出现的一个问题,百思不得其解!
在函授void OSInit (void)中调用
OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
执行到OSTaskCreate(....)前一句 sp是0x19,
执行到OSTaskCreate(....)时,sp仍是0x19.
应该是0x1b才对啊!
难道有什么特别处理吗?
问题点数:80、回复次数:9Top
1 楼goodluckyxl(被人遗忘的狗)回复于 2005-03-06 17:56:33 得分 20
汇编的函数体进入的话
确实SP会+2保存当前函数地址
c没写过 -_-#Top
2 楼xuelong_zl(点雨点[我身上咋就没MM的香水味涅??#-_-])回复于 2005-03-06 18:22:58 得分 20
我没学过这些东东,嵌入式的吧,我写一下自己想到的东东吧
r()
{
}
main()
{
r();//记录printf函数的地址
printf("");//现在的地址与上面记录的是一样的
我也不知道说这些有没有用
}Top
3 楼xuelong_zl(点雨点[我身上咋就没MM的香水味涅??#-_-])回复于 2005-03-06 18:36:47 得分 20
上面说的是在看函数调用机制时看到的,楼主也可以看看这方面的资料Top
4 楼UPCC(杂食动物)回复于 2005-03-06 18:41:50 得分 20
执行到OSTaskCreate(....)时,sp仍是0x19.
应该是0x1b才对啊!
-----------------
返回在就在0x1b上获取!在调用OSTaskCreate(....)过程是没有占0x1b这个地址的!这个地址为返回值所占!!
(我只学过一点汇编的而已)
不是是否正确!请指点Top
5 楼dongpy(51-->ARM)回复于 2005-03-06 18:44:34 得分 0
是在单片机上跑的?
uc/OS-II不太熟.
OSTaskCreate会不会是一个宏呢?Top
6 楼flyingcar(uClinux)回复于 2005-03-07 09:04:14 得分 0
调用有的函数时sp会加2,而在调有的函数时sp不变,
????????????????????????
Top
7 楼dongpy(51-->ARM)回复于 2005-03-07 11:53:52 得分 0
而在调有的函数时sp不变,
=================================================================================
可能是没有通过CALL来调用函数,而是通过类似内联或宏的方式,把函数体直接拷贝过来了.
不然没法解释了.
通过CALL指令(或类似指令)调用函数,函数返回地址肯定要压栈的.Top
8 楼goodluckyxl(被人遗忘的狗)回复于 2005-03-07 12:08:15 得分 0
macro_push macro
push acc
endm
;是不需要sp+2的
Top
9 楼dongpy(51-->ARM)回复于 2005-03-07 13:49:15 得分 0
macro_push macro
push acc
endm
;是不需要sp+2的
==========================
不太明白意思!
acc是单字节的吧.Top




