打印

单片机堆栈疑惑

[复制链接]
2772|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
magic_yuan|  楼主 | 2012-12-21 14:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  各位老师,
   以前写过51的汇编,压过堆栈。后来一直写C,对堆栈似乎没什么印象了。
   写汇编时,比如加法,只有一个ACC,为了实现多个操作,对ACC压堆栈。这似乎是由于资源限制。
   但现在读到C8051F和STM32的书时。发现也要压堆栈,百度上看了点资料,还是一头雾水。
    有无大侠能讲下为什么要压堆栈,在什么情况下需要压堆栈,能举例最好。
    实在是看得一头雾水,先谢了!

相关帖子

沙发
NE5532| | 2012-12-21 14:17 | 只看该作者
谁告诉楼主加法要压栈了?汇编的堆栈跟C语言的堆栈在技术上说是一样的。

使用特权

评论回复
板凳
ayb_ice| | 2012-12-21 14:34 | 只看该作者
本帖最后由 ayb_ice 于 2012-12-21 14:35 编辑

软件压栈完全取决于算法,算法取决于人。。。

比如取临时存储一个数据,可以通过堆栈

MOV A, MY_DATA
PUSH ACC

...

POP ACC
MOV MY_DATA,A

使用特权

评论回复
地板
magic_yuan|  楼主 | 2012-12-21 16:58 | 只看该作者
ayb_ice 发表于 2012-12-21 14:34
软件压栈完全取决于算法,算法取决于人。。。

比如取临时存储一个数据,可以通过堆栈

多谢大侠!
   这里通过PUSH ACC 则后续可将A变量用在其他地方。用完之后再恢复A的值,继续以前的操作。之所以这么做是因为这里“必须”通过ACC进行操作,资源紧张。。。?。。。?
  

使用特权

评论回复
5
magic_yuan|  楼主 | 2012-12-21 16:59 | 只看该作者
NE5532 发表于 2012-12-21 14:17
谁告诉楼主加法要压栈了?汇编的堆栈跟C语言的堆栈在技术上说是一样的。

多谢大侠
   是搞错了。。。近来在学单片机,疑惑多多。。。。

使用特权

评论回复
6
NE5532| | 2012-12-21 17:04 | 只看该作者
不是因为做加法,是因为51只有A能拿来运算,所以C做函数调用或者中断服务程序,就必须保存A,汇编的CALL如果不用A的(当然子程序一般不会这么简单),可以不保存A。

使用特权

评论回复
7
ljxh401| | 2012-12-21 18:21 | 只看该作者
C里面 堆栈就是保存临时数据, 例如临时变量 , 子程序返回地址 ......
一般在C上面 这些都被透明掉了
汇编的时候 才用到

使用特权

评论回复
8
zf_015820| | 2012-12-21 18:22 | 只看该作者
其实一句话:KEIL  C51已经自动将堆栈处理了;即,我们在汇编时,在需要压栈时, 都得一步步写堆栈,并最后,还要恢复堆栈;但,在KEIL C51中,编译器自动处理了;如果,有兴趣,你可以看下,KEIL  C51中,LST文件,说得清楚 ,当然,也要看下编译器汇编出来的  汇编代码,你一看,就清楚 了

使用特权

评论回复
9
ymind| | 2012-12-21 22:08 | 只看该作者
一个寄存器都没有,基于栈式的Java bytecode更是栈来栈去。

使用特权

评论回复
10
magic_yuan|  楼主 | 2012-12-22 23:13 | 只看该作者
zf_015820 发表于 2012-12-21 18:22
其实一句话:KEIL  C51已经自动将堆栈处理了;即,我们在汇编时,在需要压栈时, 都得一步步写堆栈,并最后 ...

多谢大侠。讲的正是我想要的。

使用特权

评论回复
11
zf_015820| | 2012-12-24 10:34 | 只看该作者
希望能到你了,哈哈,多多交流,大家都可以学到东西,也许你摸出来的东西,也正是大家需要的知识呀;

使用特权

评论回复
12
bruceding| | 2012-12-24 12:58 | 只看该作者
用c的话自动堆栈了。
局部变量函数地址等放在栈中stack。
程序运行时,开辟的变量区域(例如使用malloc)存在于堆中heap。heap的管理库函数就解决了,它是一种链表的算法。

使用特权

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

本版积分规则

个人签名:发到3000帖时,生活大概完成了一种转折。

359

主题

2770

帖子

7

粉丝