情况是这样的,前两天我的程序莫名其妙的在调用一个函数之后跳到一个地方去执行了,倒是没有司机,但是这个是很异常的,对这个问题,深入研究发现问题源于stack内的返回地址的低2Byte被函数操作意外修改了,再深入研究发现memcpy()造成,解决之后,对stack还有点不理解之处,请教了!
首先说明几点:
1. 我使用的TI C6713DSP,在这款DSP中没有POP,PUSH等操作。
2. 编译器提示该款DSP的堆栈stack使用8字节对齐。
3. 进入每一个函数内容后,SP表征当前函数的栈基址。
好了,我的程序是如下:
int fuc(char *src1, char *src2)
{
char flag = 0;
int tmpValue = 0;
.......
}
进入函数之前SP = 0x0001FC38;
进入函数后第一句,SP = 0x0001FC20, 等待局部变量定义完成后,其地址内容如下:
地址... 1FC20 C24 C28 C2C C30 C34 1FC38 ...
内容 ... 返回值预留地址 src1 src2 flag tmpValue 0x0000000E 返回地址 ...
针对上面的栈情况,有如下几个问题想请问:
1. C34的空洞是怎么造成的,原因是否是因为上面的2,SP8字节对齐,所有SP不能为C24(如果没有0x000000e这个空洞),请教1?
2. 0x000000e的位置为什么是在C34处,而不是在src2和flag之间哪?即stack的局部变量的地址是怎么分配的?空洞的地址有什么理由吗,还是随机的?
3. 看这个stack能否看出栈顶,栈底的概念?有的话,是1FC38是顶,还是1FC20是顶?
还请大家不吝赐教!!!!