熟悉了汇编语言后,接下来将进人到本章的后半部分。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