笑对人生Zzz 发表于 2017-10-19 21:31:44

为何C语言(函数调用)需要堆栈,而汇编语言却不需要堆栈?

在嵌入式处理器环境中,为何C语言(函数调用)需要堆栈,而汇编语言却不需要堆栈?
        据我所知,c语言最终也是被编译成了汇编,都是汇编,为何c语言生出来的就需要堆栈才能运行呢??

shawn_bu 发表于 2017-10-19 21:44:25

字体太大了,还花花绿绿的

infinityvip 发表于 2017-10-19 21:51:02

请学习版规24,慢走,不送。

xivisi 发表于 2017-10-19 22:03:47

谁说汇编不要栈??
中断要,临时变量太多的函数也需要。

ahong2hao 发表于 2017-10-19 23:51:33

当年学习51就是汇编开始,入栈出栈都是自己用汇编写的。

WM_CH 发表于 2017-10-19 23:59:58

保存现场,c 汇编都要用栈
传递参数,c 汇编,参数过多,在通用寄存器不够用的时候,也要用栈

不对的请大家更正




lzg 发表于 2017-10-20 00:15:56

标题不符合版规,乱用大字体。请参见版规,不思悔改者,楼主走好。

gonboy 发表于 2017-10-20 08:41:40

1. 汇编,中断不需要堆栈?
2. 自己的代码,靠汇编自己管控,可以不用堆栈指令。 当然,你可以使用。
3. C的函数,内部变量等,C编译成ASM后,需要进行合理的优化。 堆栈是一种合理高效的空间效率优化方式。 如有能力,你也可以自己写编译器,不用堆栈啊。

shiva_shiva 发表于 2017-10-20 08:43:11

栈专门有个寄存器,是硬件层面的事,汇编也离不开

lnskngdc 发表于 2017-10-20 08:47:25

那PUSH和POP是干啥用的?

楼主新人,发帖子不用能大字体,小心ID不保

bmagui 发表于 2017-10-20 09:10:35

我是来确定楼主的ID还在吗?

mii 发表于 2017-10-20 09:28:02

我也来看看人在不在

huangqi412 发表于 2017-10-20 09:36:30

骚年,告诉大家你用的神马单片机,既然都懂汇编了,大声告诉大家你用的单片机进中断不硬件压栈PC怎么返回的。如果压栈了需要地方存PC么。

Eric_Xue 发表于 2017-10-20 10:24:47

提醒下LZ,更改标题,小心ID不保。

su33691 发表于 2017-10-20 11:06:55

PIC有硬件堆栈。

security 发表于 2017-10-20 11:16:00

本帖最后由 security 于 2017-10-20 11:17 编辑

赶紧改下标题和字体,去认真看看版规。

至于这个问题,汇编和 C 都需要栈的,栈跟用汇编还是用 C 没有关系。

snoopyzz 发表于 2017-10-20 11:40:11

说汇编不用堆栈的其实是自己不会用堆栈的吧{:lol:}

vuo50z 发表于 2017-10-20 13:37:34

shiva_shiva 发表于 2017-10-20 08:43
栈专门有个寄存器,是硬件层面的事,汇编也离不开

不一定哦,arm也可以不用r13做堆栈,你可以写个编译器用r0做堆栈。

vuo50z 发表于 2017-10-20 13:42:02

汇编是自己管理堆栈,c是编译器管理堆栈。堆栈其实就是一个指针,进进函数时调整一下指针,然后空出的这段内存就归这个函数用了,函数退出时把指针调回来。所有的函数都按照这个规则,方便内存管理。

qtechzdh 发表于 2017-10-20 14:49:56

请问您哪只眼睛看到的汇编不需要堆栈啊 ,知道POP、PUSH指令吗,跟我读 P-O-PPOPPUSH P-U-S-H

shiva_shiva 发表于 2017-10-20 15:00:22

vuo50z 发表于 2017-10-20 13:37
不一定哦,arm也可以不用r13做堆栈,你可以写个编译器用r0做堆栈。

印象中,m系列的arm都是一条指令压栈好几个数据,难道不是硬件的?

huangqi412 发表于 2017-10-20 16:01:36

vuo50z 发表于 2017-10-20 13:37
不一定哦,arm也可以不用r13做堆栈,你可以写个编译器用r0做堆栈。

中断必须会将PC硬件压栈,硬件压栈的SP不是编译器,是硬件固定了的。你另搞个SP指针,只是另起炉灶开个软栈,原来的灶并没熄火,各做各的饭。。。大体相当于不用硬件IIC模块,软件去模拟,芯片面积并没因为不用IIC而减少。

zhugean 发表于 2017-10-20 16:09:34

汇编语言自己管理堆栈

armok 发表于 2017-10-20 16:11:50

vuo50z 发表于 2017-10-20 16:19:30

huangqi412 发表于 2017-10-20 16:01
中断必须会将PC硬件压栈,硬件压栈的SP不是编译器,是硬件固定了的。你另搞个SP指针,只是另起炉灶开个 ...

arm的arm模式

vuo50z 发表于 2017-10-20 16:24:43

shiva_shiva 发表于 2017-10-20 15:00
印象中,m系列的arm都是一条指令压栈好几个数据,难道不是硬件的?

照这么说所有的指令都是硬件实现的。

qiqirachel 发表于 2017-10-20 16:29:42

额push pop 用起来可蛋疼了

higeo 发表于 2017-10-20 17:03:23

目测楼主一天内不会上线

wei669 发表于 2017-10-20 21:01:09

这也算技术问题?还有半小时........

atommann 发表于 2017-10-20 21:30:25

谁告诉你汇编语言不需要堆栈的?

笑对人生Zzz 发表于 2017-10-20 23:06:40

armok 发表于 2017-10-20 16:11
“插播一则技术问题,期待大神帮忙解答(Thanks) 只看楼主 ”不是合格的标题。

违反版规11。请立即阅读 ...

不好意思今天加班没看到,贴子已经不可以编辑了,还有什么办法可以挽救吗??

armok 发表于 2017-10-20 23:39:51

vuo50z 发表于 2017-10-20 23:52:54

atommann 发表于 2017-10-20 21:30
谁告诉你汇编语言不需要堆栈的?

全是全局变量就不用了

Excellence 发表于 2017-10-21 09:20:28

楼主来发了一贴,讨论精彩。

minier 发表于 2017-10-21 09:24:48

楼主是伪命题

security 发表于 2017-10-21 09:25:58

vuo50z 发表于 2017-10-20 23:52
全是全局变量就不用了

函数过程调用,不论是硬件自己压,还是我们手动压,那都是栈,总是离不开栈的。

vuo50z 发表于 2017-10-21 19:12:40

本帖最后由 vuo50z 于 2017-10-21 19:16 编辑

security 发表于 2017-10-21 09:25
函数过程调用,不论是硬件自己压,还是我们手动压,那都是栈,总是离不开栈的。 ...

抬杠的方法:a函数把局部变量(包括链接寄存器和其它要保存的寄存器)放在A处,b函数把局部变量放在B处……
这样的函数除了不可重入也可以工作。

HXDZ-AAA 发表于 2017-10-22 14:55:37

汇编中的栈由人工管控。

ywlzh 发表于 2017-10-22 19:36:16

太有趣了这种问题牵扯一部分迷茫的人

你以为的你以为的就是你以为的

页: [1]
查看完整版本: 为何C语言(函数调用)需要堆栈,而汇编语言却不需要堆栈?