首页 > 其他分享 >变量

变量

时间:2023-01-31 00:44:53浏览次数:28  
标签:生命周期 变量 作用域 访问 地址 全局变量

变量

变量在内存中的位置和访问方式

位置

​ 在属性为可读写的数据节中

访问方式

栈内存:ebp-- ebp++
堆内存:间接访问
全局变量存储区:使用offset寻址
常量区:使用offset寻址

全局变量

位置:所在地址为数据区
生命周期:与所在模块一致,在程序执行前都已经存在
访问方式:使用立即数间接访问
在内存中的地址:先定义是低地址,后定义是高地址
作用域:进程作用域,在整个进程中都能够访问这个全局变量

局部变量

位置:所在地址为栈区
生命周期:与所在函数作用域一致(对于有{}的划分块,生命周期与所在函数作用域一致,只是编译器不允许块外代码对其访问)
访问方式:使用ebp或esp间接访问
在内存中的地址:先定义是高地址,后定义是低地址
作用域:函数作用域,在函数内可以访问到;在“{ }”语句块内定义的变量,属于块作用域,只能在定义变量的“{ }”块内访问

全局静态变量

位置:所在地址为数据区,生命周期与所在模块一致,在程序执行前都已经存在
生命周期:整个文件
访问方式:使用立即数间接访问
在内存中的地址:先定义是低地址,后定义是高地址
作用域:文件作用域,在当前源码文件内可以访问到
限制:只能在本文件内使用,等价于编译器限制外部源码文件访问的全局变量,即全局变量可以跨cpp文件,全局静态变量不行

局部静态变量

位置:在进入作用域之前就已经存在,生命周期和全局变量相同,在程序执行前都已经存在
生命周期:整个文件
作用域:{}块
寻址:使用绝对寻址offset的寻址方式;立即数即为offset的绝对地址,绝对地址的间接访问

注意

​ 对于大型编译器,如果只声明变量而不使用的话在IDA中不会显示出来

void Sub_2()
{
	int i = 0;
	for (i=0;i<3;i++)
	{
		int v1 = 0;  
		v1++;
		static int v2 = 0;
		v2++;
	_tprintf(_T("%d    %d\r\n"), v1, v2);

	/*
	00F318C7 C7 45 EC 00 00 00 00 mov         dword ptr [ebp-14h],0  //注意v1在函数块内进行赋值
	00F318CE 8B 45 EC             mov         eax,dword ptr [ebp-14h]  
	00F318D1 83 C0 01             add         eax,1  
	00F318D4 89 45 EC             mov         dword ptr [ebp-14h],eax  

	00F318D7 A1 04 A2 F3 00       mov         eax,dword ptr [v2 (0F3A204h)]  //v2的赋值在函数块之前
	00F318DC 83 C0 01             add         eax,1  
	00F318DF A3 04 A2 F3 00       mov         dword ptr [v2 (0F3A204h)],eax  
	*/
	}
}

标签:生命周期,变量,作用域,访问,地址,全局变量
From: https://www.cnblogs.com/XiuzhuKirakira/p/17077621.html

相关文章

  • 0145-Go-环境变量
    环境Time2022-08-25Go1.19前言说明参考:https://gobyexample.com/environment-variables目标使用Go语言的环境变量。示例packagemainimport("fmt"......
  • Shell变量替换
    变量替换之删除指定字符串语法作用${var#pattern}将$var的值从左侧删除与模式pattern匹配的最短字符串并返回。${var##pattern}将$var的值从左侧删除与模......
  • CAD系统变量怎么修改?CAD系统变量修改步骤
    在浩辰CAD软件中存在着大量系统变量,绝大多数是在后台默默发挥作用,但有些CAD系统变量在绘图过程中也会用到,比如FILEDIA、TEXTFILL等。那CAD系统变量怎么修改?本文小编就来给......
  • 安装jdk并配置环境变量
    JDK有rpm安装包,也有tar.gz的安装包https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html rpm包安装:rpm-ivhjdk-8u241-linux-x64.rpmtar.gz......
  • 局部变量与全局变量
    不同的函数之间传递数据:(1)参数:通过形参或实参(2)返回值:用return语句返回计算结果(3)全局变量:外部变量注:如果全局变量与局部变量重名,那么将采取就近原则,即实际获取和修改的值......
  • 【参考答案】java基础练习:变量、数据类型、输入、输出、运算符
     练习1:判断输入的值是否是偶数,另外,要处理输入错误(目的:熟悉输入、输出,特别是Scanner对象的方法)packagecom.qzcsbj;importjava.util.Scanner;publicclassTest{publi......
  • ServletContext与静态变量(static)的区别,数据库连接池放在哪里
    这种是放在static中,03_用servlet、request和Druid技术写登录案例   java——数据库连接池——druid_基本使用这是放在ServletContext中,使用ServletContext缓存数据源......
  • 【YBT2023寒假Day2 A】变量取值(网络流)
    变量取值题目链接:YBT2023寒假Day2A题目大意有n个变量你可以选择取W还是-W,有一些限制形如某个变量要小于或者小于等于或者等于某个变量。然后还有一些式子,选了三......
  • 【2】Python3基础之Python注释,变量
    一,注释在Python中有两种形式:单⾏注释与多行注释☆单⾏注释单⾏注释只能注释一行内容,基本语法:#注释内容☆多⾏注释多行注释可以注释多行内容,常用于代码......
  • Python定义全局变量的用法
    全局变量是编程语言中常见的一种变量,通过全局定义,可以是某对象函数创建,也可以是本程序任何位置创建,能够被本程序中的所有对象或函数进行引用,全局变量的定义有利于程序的变......