当前位置: 首页 > article >正文

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

文章目录

  • 前言
  • 一、背景知识
  • 二、局部变量如何在栈中产生
    • 1.简单的局部变量
    • 2.数组变量
  • 总结


前言

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


一、背景知识

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

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

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

前情提要:
1.控制器用SP寄存器保存栈顶指针。
2.push指令是压栈指令。pop指令是弹出栈指令。

1.简单的局部变量

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

代码如下(示例):

void func()
{
	int a=5;
	int b=10;
}
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指令去分配空间,效率就太低了。比如定义了一个int[100]的变量,如果用PUSH指令,需要PUSH100次。这样效率太低了。
代码如下(示例):

void func()
{
	int c[100];

	c[0] = 1;
}
SUB SP,#190

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


总结

总的来说,定义了局部变量就需要在栈中开辟相应的空间,不管是用PUSH指令还是直接减SP指针,都是操作栈。
函数返回后,局部变量不能用的问题,我们再开一篇文章讲。


http://www.kler.cn/a/290168.html

相关文章:

  • ffmpeg内存模型
  • Python酷库之旅-第三方库Pandas(208)
  • 【Python特征工程系列】利用SHAP进行特征重要性分析-XGB模型为例(案例+源码)
  • docker基础:搭建centos7(详见B站泷羽sec)
  • vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)
  • [Docker#4] 镜像仓库 | 部分常用命令
  • pikachu文件包含漏洞靶场通关攻略
  • 运维管理体系及其实践要点:为高效运维保驾护航
  • zabbix通过OMSA监控Dell服务器_zabbix dell http
  • 为什么我会有使用gradle,需要花长时间去下载依赖?使用maven就不会有这种感受?
  • c++ websocket简单讲解
  • 大势智慧携“实景三维+AI”信创产品体系亮相2024中国地理信息产业大会
  • 详解 HTTPS 与 TLS证书链校验
  • 避坑之:深信服AC跨三层取MAC(核心交换机是锐捷S7808C_RGOS 11.0(4)B2P1)
  • 实验室ICPR 2024论文分享┆DS MYOLO:一种基于状态空间模型的驾驶场景可靠目标检测器
  • Edge资源占用优化:调整浏览器设置与关闭自动更新检查
  • 工业主板在轨道交通中的应用特点
  • 【网络】P2P打洞原理
  • 专项练习-数据思维-49题
  • PostgreSQL技术内幕4:PostgreSQL存储引擎内存管理
  • 使用udp进行通信
  • 视频结构化从入门到精通——行为分析类应用
  • IEEE PDF eXpress 报错解决 Error in converting file + font not embedded
  • 海康二次开发学习笔记9-通讯触发及模块列表获取
  • LLM手撕
  • JS笔记