C语言x64位的栈生长方向,C语言中,函数调用过程中,栈增长的方向是怎样的?形参和实参是如何关联的?...

方向是和系统相关的。虽然是编译器决定的,但是属于编译器后端,和硬件相关的部分来实现的。C语言标准中并没有约束,也无法约束,栈的增长方向。

形参,实参,我十分郁闷哪个SB一开始提这个概念的。准确说,有两种参数传递方式。

1、寄存器类的间接传递。一个函数中的变量作为子函数的参数传递,该变量被读取到寄存器里给予子函数,寄存器不足时,根据实际系统情况,放在堆栈或其他存储区域,而子函数从寄存器中获取使用,并不会从该变量在父函数的实际存储空间里获取和使用。

2、变量地址的直接传递。本质是将该变量的地址,作为寄存器类的间接方法给予子函数。而子函数获取了这个地址后,直接对父函数变量所存储的空间里的内容进行使用(读取或写出)。

至于你说的两个参,自己对应吧。我只说事实,不说虚名词。哈。

-=======================

寄存器的功能十分重要,CPU对存储器中的数据进行处理时,往往先把数据取到内部寄存器中,而后再作处理。外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器,它与CPU之间通过“端口”交换数据,外部寄存器具有寄存器和内存储器双重特点。有些时候我们常把外部寄存器就称为“端口”,这种说法不太严格,但经常这样说。

外部寄存器虽然也用于存放数据,但是它保存的数据具有特殊的用途。某些寄存器中各个位的0、1状态反映了外部设备的工作状态或方式;还有一些寄存器中的各个位可对外部设备进行控制;也有一些端口作为CPU同外部设备交换数据的通路。所以说,端口是CPU和外设间的联系桥梁。CPU对端口的访问也是依据端口的“编号”(地址),这一点又和访问存储器一样。不过考虑到机器所联接的外设数量并不多,所以在设计机器的时候仅安排了1024个端口地址,端口地址范围为0--3FFH。

============================

程序的局部变量存在于(栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中

这样说比较准确,所谓的栈其实是由寄存器ebp和esp指向的一片内存空间(ebp指向栈底,esp指向栈顶),原则上是由高地址向低地址生长的一片空间,会保存一些临时的数据,比如一个函数中的临时变量以及返回地址,数据的出入是先进后出,后进先出.

全局变量实际上是存在一个(一般来说正常的编译器)可读可写的内存空间,这个空间是在你写程序编译好的空间地址(由编译器决定),是固定的.

堆是由操作系统管理的一片空间,事先是没有在进程空间里分配的(比如你在没有分配堆的时候就访问堆空间会报一个内存访问错误),一般是由程序动态的分配出来,一旦分配了以后,一般需要程序去释放自己的堆空间.

这只是简单的描述一下概念,如果要深入讲这三个空间的结构还是有些复杂度的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值