打印

请教大家一下ARM局部数组入栈顺序问题

[复制链接]
2587|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lhshine|  楼主 | 2007-6-4 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM, TE, AI
ARM为递减堆栈,局部变量存放在栈中。那么如果我的程序中有个局部变量数组,INT32U TEMP[16]; 
int8u main ()
{
INT32U TEMP[16]; 
INT32U *p1=&TEMP[0]; 
INT32U *p2=&TEMP[15]; 


虽然肯定知道p2=p1+15,但是为什么p2的值高于p1?局部变量放在堆栈中,堆栈不是递减的吗?如果是TEMP[0]先入栈,他的地址应该高于TEMP[15],难道是TEMP[15]先入栈?可能是我哪里理解错了,恳请大家多多指教,谢谢!

相关帖子

沙发
high| | 2007-6-5 18:34 | 只看该作者

..

#inlcude <stdio.h>
#include <string.h>

printf(" first:%p, last:%p", temp[0], temp[15]);
---
or
---
char s[60];
sprintf(s, " first:%p, last:%p ", temp[0], temp[15]);
uart0_sendstr(s);

使用特权

评论回复
板凳
平常人| | 2007-6-5 22:07 | 只看该作者

不管是局部数组还是全局数组,数组分量在内存中的顺序永

永远是下标小的在低地址端,下标大的在高地址端,即
  当x>y时  =〉 &temp[x] > &temp[y]

否则当用指针访问这个数组时,指针的++和--操作就没有意义了。

使用特权

评论回复
地板
lhshine|  楼主 | 2007-6-6 09:28 | 只看该作者

后来我又试了一下

后来我想了想,数组应该是3楼讲的,后来我又试了试,
程序如下:
main(void)
{
int32u a;
int32u b;
int32u temp[16];
int32u *p1=&a;
int32u *p2=&b;
int32u *p3=&temp[15];
}
debug出来的结果是p3>p1>p2,所以觉得现在的问题是局部变量入栈的顺序,这个顺序是什么?到底是取决于编译器还是arm体系?

使用特权

评论回复
5
mamalihui| | 2007-6-11 20:28 | 只看该作者

可以看看arm结构和ads方面的书

使用特权

评论回复
6
lhshine|  楼主 | 2007-6-13 20:56 | 只看该作者

没人回复吗?我还是没有搞明白-----

使用特权

评论回复
7
飞雪季节| | 2007-7-3 09:46 | 只看该作者

这样吧


     .             high address
------------              
   temp[15]   <------P2
   temp[14]
     .
     .
     .
   temp[2]
   temp[1]
   temp[0]    <-----  P1
---------------- low address

temp[15]在高地址,temp[0]在的地址,所有就有   *p1++ 这样的用法了。 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝