user-0 提问: 为什么C语言运行需要堆栈，汇编不需要？

回复:
user: user-1
content: 汇编中一般不初始化，也就是直接使用系统的堆栈而已，自己定义堆栈还是要初始化的。

user: user-2

user: user-3
content: 不知道，刚开始学c语言

user: user-4
content: 今晚有赵老师的课程，到时候你可以提问，csdn的首页有入口地址。赵老师讲解C语言的指针和汇编的地址的相关专题。还有，我汇编学的不深，大学学过一个学期。我清清楚楚记得，汇编也有堆栈的，汇编中，直接可以有指令和栈偏移指令指向栈的位置。

user: user-1
content: 不需要初始化，就是使用现在的值而已。

user: user-5
content: 首先，不需要堆栈，和不需要初始化堆栈是两回事呢。正确的说法是：C语言的函数调用要用到堆栈，而汇编却不需要初始化堆栈。为什么需要呢，首先你要了解堆栈的作用，总的来说，堆栈的作用就是：保存现场/上下文，传递参数。堆栈是必须的，不管是c还是汇编，都是一样的

user: user-1
content: 赵老湿又开始讲操作系统了，这debug让没从dos开始的人来看，起点有点高啊。赵老湿行行好，从汇编的根基开始讲讲。

user: user-6
content: 引用 30 楼 zhao4zhong1 的回复:[quote=引用 28 楼 zhang5476499 的回复:] 今晚有赵老师的课程，到时候你可以提问，csdn的首页有入口地址。赵老师讲解C语言的指针和汇编的地址的相关专题。还有，我汇编学的不深，大学学过一个学期。我清清楚楚记得，汇编也有堆栈的，汇编中，直接可以有指令和栈偏移指令指向栈的位置。 谢谢推荐。  知道Intel CPU上电后各寄存器的初始值是多少吗？ 如果哪台Intel CPU的PC机最早的初始化SS:SP对应的汇编指令不在BIOS中，说出来让俺也长长见识！[/quote] C:\>debug -u ffff:0 l4 FFFF:0000 EA5BE000F0    JMP     F000:E05B -u f000:e05b l3 F000:E05B E9E649        JMP     2A44 -u f000:2a44 F000:2A44 FA            CLI F000:2A45 FC            CLD F000:2A46 8CC8          MOV     AX,CS F000:2A48 8ED0          MOV     SS,AX F000:2A4A E9BC8E        JMP     B909 F000:2A4D E9411A        JMP     4491 F000:2A50 B08F          MOV     AL,8F F000:2A52 E670          OUT     70,AL F000:2A54 EB00          JMP     2A56 F000:2A56 EB00          JMP     2A58 F000:2A58 EB00          JMP     2A5A F000:2A5A EB00          JMP     2A5C F000:2A5C E471          IN      AL,71 F000:2A5E B400          MOV     AH,00 F000:2A60 8BF0          MOV     SI,AX F000:2A62 B08F          MOV     AL,8F -q  C:\>

user: user-6
content: 引用 28 楼 zhang5476499 的回复:今晚有赵老师的课程，到时候你可以提问，csdn的首页有入口地址。赵老师讲解C语言的指针和汇编的地址的相关专题。还有，我汇编学的不深，大学学过一个学期。我清清楚楚记得，汇编也有堆栈的，汇编中，直接可以有指令和栈偏移指令指向栈的位置。 谢谢推荐。  知道Intel CPU上电后各寄存器的初始值是多少吗？ 如果哪台Intel CPU的PC机最早的初始化SS:SP对应的汇编指令不在BIOS中，说出来让俺也长长见识！

user: user-7
content: 汇编写的程序运行时也需要栈，操作系统加载可执行文件后每个线程都有自己的局部栈。理论上完全不用栈也是可以的，只要有数据区用于保存临时数据就可以。

user: user-8
content: 直接操作寄存器、

user: user-9
content: 求解答！

user: user-10
content: 引用 24 楼 u014444402 的回复:[quote=引用 20 楼 hgsdfghdfsd 的回复:] 。。。。。  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？ 一般来讲单片机或者ARM建立项目的时候都会有一个启动文件类似startup_xxxxx.s的汇编文件，就是用来初始化堆栈和全局变量的。这个启动文件开发环境会提供，你不满意你可以自己写。      [/quote] ++  一般C51，keil C 等嵌入式编译环境， 对于手工编写整个系统的方式，都是这么处理的。 你对这个启动代码，感觉不满意可以自行修改  当然，有时候，还提供某些实时操作系统框架

user: user-11
content: 引用 20 楼 hgsdfghdfsd 的回复:[quote=引用 19 楼 lm_whales 的回复:] [quote=引用 18 楼 hgsdfghdfsd 的回复:] [quote=引用 17 楼 lm_whales 的回复:] 不用堆栈，PC 的很多机制都没法工作 包括，函数（过程）调用， 开中断后，程序正常运行 （中断前，保存状态寄存器到堆栈中，保存被中断的指令地址到堆栈中， 中断结束，从堆栈恢复状态寄存器，返回中断处）  非常抱歉，是我没说清楚。无说的是ARM编程[/quote]  虽然架构不一样的，现代CPU都是基于堆栈的，都是有中断的 ARM一样离不开堆栈 只是方式不同 ARM 也需要初始化堆栈 当然，现在开发ARM等嵌入式软件，可以基于实时操作系统  包括实时 linux 类型的，和μOS 等各种实时操作系统， 可用的实时操作系统有很多，名字记不住了，不少于4，5个。 这些操作系统，已经帮助你准备好堆栈了，你可能就不用自己初始化堆栈了  [/quote]  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？[/quote] 一般来讲单片机或者ARM建立项目的时候都会有一个启动文件类似startup_xxxxx.s的汇编文件，就是用来初始化堆栈和全局变量的。这个启动文件开发环境会提供，你不满意你可以自己写。

user: user-0
content: 引用 22 楼 lm_whales 的回复:[quote=引用 20 楼 hgsdfghdfsd 的回复:] [quote=引用 19 楼 lm_whales 的回复:] 。。。。  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？[/quote] 差不多可以这样理解  从纯粹的 C的语法上来说，是没有办法初始化堆栈的。 例如 标准C 语言，就没有提供直接操作硬件的支持。  但是C允许嵌入 汇编。甚至直接嵌入二进制指令 有些编译器，例如Dos下的TC 有寄存器伪变量 都可以一定程度的在C中，直接操纵硬件 勉强用C初始化，也能凑乎。 （甚至C的编译选项中，也可以适当的影响堆栈的设置。)  但显然不如汇编更合适，受到的限制更小 编写代码更容易，也更清晰，甚至可读性也更好。  毕竟，这些关键代码， 其实只是程序中很小的一部分，虽然可能是最重要的一部分。 因此，虽然是汇编语言实现的，但是代码其实很短  其实，纯C 的初始化部分在编译器的库里，这部分很有可能就是汇编写成的 还有一些函数，如 exit,_exit 也可能是汇编写成的。 只是他们多半已经编译好了，随着编译器发布而已。 [/quote]  多谢，解决了我的问题。辛苦了

user: user-10
content: 引用 20 楼 hgsdfghdfsd 的回复:[quote=引用 19 楼 lm_whales 的回复:] 。。。。  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？[/quote] 差不多可以这样理解  从纯粹的 C的语法上来说，是没有办法初始化堆栈的。 例如 标准C 语言，就没有提供直接操作硬件的支持。  但是C允许嵌入 汇编。甚至直接嵌入二进制指令 有些编译器，例如Dos下的TC 有寄存器伪变量 都可以一定程度的在C中，直接操纵硬件 勉强用C初始化，也能凑乎。 （甚至C的编译选项中，也可以适当的影响堆栈的设置。)  但显然不如汇编更合适，受到的限制更小 编写代码更容易，也更清晰，甚至可读性也更好。  毕竟，这些关键代码， 其实只是程序中很小的一部分，虽然可能是最重要的一部分。 因此，虽然是汇编语言实现的，但是代码其实很短  其实，纯C 的初始化部分在编译器的库里，这部分很有可能就是汇编写成的 还有一些函数，如 exit,_exit 也可能是汇编写成的。 只是他们多半已经编译好了，随着编译器发布而已。

user: user-12
content: 楼主问题的深度是我等不能体会到的。。。

user: user-0
content: 引用 19 楼 lm_whales 的回复:[quote=引用 18 楼 hgsdfghdfsd 的回复:] [quote=引用 17 楼 lm_whales 的回复:] 不用堆栈，PC 的很多机制都没法工作 包括，函数（过程）调用， 开中断后，程序正常运行 （中断前，保存状态寄存器到堆栈中，保存被中断的指令地址到堆栈中， 中断结束，从堆栈恢复状态寄存器，返回中断处）  非常抱歉，是我没说清楚。无说的是ARM编程[/quote]  虽然架构不一样的，现代CPU都是基于堆栈的，都是有中断的 ARM一样离不开堆栈 只是方式不同 ARM 也需要初始化堆栈 当然，现在开发ARM等嵌入式软件，可以基于实时操作系统  包括实时 linux 类型的，和μOS 等各种实时操作系统， 可用的实时操作系统有很多，名字记不住了，不少于4，5个。 这些操作系统，已经帮助你准备好堆栈了，你可能就不用自己初始化堆栈了  [/quote]  可不可以这样理解：堆栈只能用汇编语言来初始化，不管是纯汇编、纯C、还是c和汇编混合的程序都需要汇编来先初始化堆栈？

user: user-10
content: 引用 18 楼 hgsdfghdfsd 的回复:[quote=引用 17 楼 lm_whales 的回复:] 不用堆栈，PC 的很多机制都没法工作 包括，函数（过程）调用， 开中断后，程序正常运行 （中断前，保存状态寄存器到堆栈中，保存被中断的指令地址到堆栈中， 中断结束，从堆栈恢复状态寄存器，返回中断处）  非常抱歉，是我没说清楚。无说的是ARM编程[/quote]  虽然架构不一样的，现代CPU都是基于堆栈的，都是有中断的 ARM一样离不开堆栈 只是方式不同 ARM 也需要初始化堆栈 当然，现在开发ARM等嵌入式软件，可以基于实时操作系统  包括实时 linux 类型的，和μOS 等各种实时操作系统， 可用的实时操作系统有很多，名字记不住了，不少于4，5个。 这些操作系统，已经帮助你准备好堆栈了，你可能就不用自己初始化堆栈了

user: user-0
content: 引用 17 楼 lm_whales 的回复:不用堆栈，PC 的很多机制都没法工作 包括，函数（过程）调用， 开中断后，程序正常运行 （中断前，保存状态寄存器到堆栈中，保存被中断的指令地址到堆栈中， 中断结束，从堆栈恢复状态寄存器，返回中断处）  非常抱歉，是我没说清楚。无说的是ARM编程