从汇编角度分析C语言中的局部变量是如何产生的

文章目录


前言

学习C语言时,我们都学过。局部变量是保存在栈里的,而且局部变量在函数返回后,无法再使用。那么我们深入的问一下,如何在保存在栈里,为什么函数返回之后,局部变量就不能用了。 下面我们从汇编的角度分析一下。


一、背景知识

学习本篇内容,需要知道什么栈、计算机如何操作栈、知道简单的汇编指令等。

二、局部变量如何在栈中产生

下面介绍的局部变量产生方法,是以一款嵌入式的控制器为例讲解的。不同的编译器会有不同的处理方法,意思是大同小异。学会了一种,就可以一通百通。

前情提要:

1.控制器用SP寄存器保存栈顶指针。

2.push指令是压栈指令。pop指令是弹出栈指令。

1.简单的局部变量

简单的变量,使用push指令开辟局部变量的空间。

代码如下(示例):

c 复制代码
void func()
{
	int a=5;
	int b=10;
}
c 复制代码
PUSH [R0,R1]
MOVE R0,#5
STR R0,[SP,#0]
MOVE R1,#A
STR R1,[SP,#4]

PUSH R0,R1:将R0 R1两个寄存器的值,压到栈中。这句命令不是为了保存两个寄存器的值,而是为了"占坑"。 压出来8个byte的空间,放a,b两个变量。

MOVE R0,#5:把R0的值,设置成5。

STR R0,SP,#0:把R0的值,保存到SP指向的内存。 当前SP指向的就是a变量。

MOVE R1,#A:把R1的值,设置成10。

STR R1,SP,#4:把R1的值,保存到SP+4指向的内存。 当前SP+4指向的就是b变量。

2.数组变量

当遇到数组变量时,再用PUSH指令去分配空间,效率就太低了。比如定义了一个int100的变量,如果用PUSH指令,需要PUSH100次。这样效率太低了。

代码如下(示例):

c 复制代码
void func()
{
	int c[100];

	c[0] = 1;
}
c 复制代码
SUB SP,#190

SUB是减法指令。SUB SP,#190指令是将SP直接减去0x190(也就是十进制的400),直接在栈中开辟空间。


总结

总的来说,定义了局部变量就需要在栈中开辟相应的空间,不管是用PUSH指令还是直接减SP指针,都是操作栈。

函数返回后,局部变量不能用的问题,我们再开一篇文章讲。

相关推荐
傻啦嘿哟2 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670792 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄2 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh3 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei3 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界4 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨5 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J5 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
yutian06065 小时前
C: Unix UTC 时间戳转为 UTC+8 北京时间
c语言·unix
杜大哥5 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python