首页 > 系统相关 >10.9始终确保全局变量用的内存空间

10.9始终确保全局变量用的内存空间

时间:2023-02-07 20:36:18浏览次数:39  
标签:10 字节 10.9 内存空间 al 全局变量 定义

熟悉了汇编语言后,接下来将进人到本章的后半部分。C 语言中在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以参阅源代码的任意部分,而局部变量只能在定义该变量的函数内进行参阅。例如,在 MyFuncA 数内部定义的i这个局部变量就无法通过 MyFuncB 函数进行参阅。与此相反,如果是在函数外部定义的全局变量,MyFuncA 函数和MyFuncB 函数都可以参阅。下面,就让我们通过汇编语言的源代码,来看一下全局变量和局部变量的不同。

代码清单 10-6的C语言源代码中定义了初始化(设定了初始值 )的al~a5 这5个全局变量,以及没有初始化(没有设定初始值 )的b1~b5这5个全局变量,此外还定义了cl~c10 这10 个局部变量,且分别给各变量赋了值。程序的内容没有什么特别的意思,这里主要是为了向大家演示。

 

 

 

 将代码清单10-6 变换成汇编语言的源代码后,结果就如代码清单10-7 所示。这里为了方便说明,我们省略了一部分汇编语言源代码并改变了一下段定义的配置顺序,删除了注释。关于代码清单 10-7 中出现的汇编语言的指令,请参考表 10-3。

 

 

 

 

 

 

 

 

正如本章前半部分所讲的那样,编译后的程序,会被归类到名为段定义的组。初始化的全局变量,会像代码清单 10-7 的(1)那样被汇总到名为 DATA 的段定义中,没有初始化的全局变量,会像(2)那样被汇总到名为 BSS 的段定义中。指令则会像(3)那样被汇总到名为TEXT 的段定义中。这些段定义的名称是由 Borland C++ 的使用规范来决定的。 DATA segment 和 DATA ends、 BSS sgment 和 BSS endsTEXT segment 和_TEXT ends,这些都是表示各段定义范围的伪指令。

首先让我们来看一下 DATA 段定义的内容。(4)中的 al labeldword 定义了 al 这个标签。标签表示的是相对于段定义起始位置的位置。由于 al 在 DATA 段定义的开头位置,所以相对位置是 0。_al就相当于全局变量 a1。编译后的函数名和变量名前会附加一个下划线),这也是 Borland C++ 的规定。(5)中的 dd 1 指的是,申请分配了4字节的内存空间,存储着 1这个初始值。dd( define double word)表示的是有两个长度为 2的字节领域( word),也就是4字节的意思。

Borland C++ 中,由于int类型的长度是4字节,因此汇编器就把 int al=l;变换成了 al label dword 和 dd 1。同样,这里也定义了相当于全局变量 a2~a5 的标签 a2~ a5,它们各自的初始值 2~5 也都被存储在了4字节的领域中。

接下来,让我们来看一下 BSS 段定义的内容。这里定义了相当于全局变量 b1~b5 的标签 bl~ b5。(6)的 db 4 dup(?)表示的是申请分配了4字节的领域,但值尚未确定(这里用?来表示)的意思。dbdefine byte)表示有1个长度是1字节的内存空间。因而,db 4 dup(?)的情况下,就是 4字节的内存空间。这里大家要注意不要和 dd 4 混淆了。db 4 dup(?) 表示的是 4 个长度是 1字节的内存空间。而 db 4 表示的则是双字节(=4字节)的内存空间中存储的值是 4。

在 DATA 和 BSS 的段定义中,全局变量的内存空间都得到了确保,这一点大家想必都清楚了吧。因而,从程序的开始到结束,所有部分都可以参阅全局变量。而这里之所以根据是否进行了初始化把全局变量的段定义划分为了两部分,是因为在 Borland C++ 中,程序运行时没有初始化的全局变量的领域( BSS 段定义)都会被设定为0进行初始化。可见,通过汇总,初始化很容易实现,只要把内存的特定范围全部设定为 0就可以了。

标签:10,字节,10.9,内存空间,al,全局变量,定义
From: https://www.cnblogs.com/z1218/p/17099704.html

相关文章

  • 10.10临时确保局部变量用的内存空间
    为什么局部变量只能在定义该变量的函数内进行参阅呢?这是因为,局部变量是临时保存在寄存器和栈中的。正如本章前半部分讲的那样,函数内部利用的栈,在函数处理完毕后会恢复到初......
  • 全局变量和局部变量使用问题
      在Java中变量类型有成员变量、局部变量和静态变量(类变量、static变量),本篇文章主要介绍成员变量(全局变量)和局部变量的区别。根据变量的作用范围,将程序中的变量分为......
  • 二进制安装docker-20.10.9
    二进制包下载地址:https://download.docker.com/linux/static/stable/x86_64/  #解压tarxfdocker-20.10.9.tgz #拷贝二进制文件cpdocker/*/usr/bin/#创建containerd......
  • Jmeter-用户定义变量(全局变量)与用户参数(局部变量)-5.31
    1、位置-作用域-运行次数 用户定义变量位置:配置元件、测试计划作用域:全局变量,作用于整个测试计划在启动运行时,获取一次值,在运行过程中,不会动态获取值,在运行......
  • Jmter 全局变量控制 While控制器运行
    1、添加BeanShell取样器,设置全局变量props.put("counter","FALSE");   2、添加While控制器,设置循环条件,当条件为true时进行循环;${__javaScript(${__P("counter......
  • Visual AssistX Version 10.9.2476 Cracked
    任何问题请反馈至邮箱:[email protected](随缘查看邮件)Anyporbs->[email protected]!新年快乐!1.本次更新添加了汉化包,所以......
  • 【KAWAKO】python查看内存空间占用情况
    目录查看变量的内存占用查看运行内存占用查看变量的内存占用importsysc=1145.114print(sys.getsizeof(c))查看运行内存占用importpsutilmemory=psutil.vir......
  • 局部变量与全局变量
    不同的函数之间传递数据:(1)参数:通过形参或实参(2)返回值:用return语句返回计算结果(3)全局变量:外部变量注:如果全局变量与局部变量重名,那么将采取就近原则,即实际获取和修改的值......
  • Python定义全局变量的用法
    全局变量是编程语言中常见的一种变量,通过全局定义,可以是某对象函数创建,也可以是本程序任何位置创建,能够被本程序中的所有对象或函数进行引用,全局变量的定义有利于程序的变......
  • (转)SQLServer全局变量
    @@CONNECTIONS:返回自上次启动SQLServer以来连接或试图连接的次数,用其可让管理人员方便地了解今天所有试图连接服务器的次数。@@CPU_BUSY:返回自SQLServer最近一次启......