031 局部和全局变量
来源:互联网 发布:fanuc机器人模拟软件 编辑:程序博客网 时间:2024/06/06 03:38
C 语言 全局变量和局部变量的区别
/********************031 局部和全局变量************************ * 局部变量和全局变量 * C语言精彩编程百例 第31 */ #include <stdio.h> int quanju; //全局变量 count void func1(); //函数声明 void func2(); void main() { quanju = 100; func1(); } void func1() { int temp; temp = quanju; func2(); printf("quanju is %d\n",quanju); func2(); } void func2() { int quanju; for (quanju=1;quanju<20;quanju++) printf("."); printf("\n"); }
担心 count是伪代码或保留字之类的东西, 吧count改为quanju 以便观察, 实际证明
没这回事儿
使用mingw gcc编译器 gcc 031.c -S -o 031.s 得出汇编代码
.file"031.c".comm_quanju, 4, 2 #全局变量.def___main;.scl2;.type32;.endef.text.globl_main.def_main;.scl2;.type32;.endef_main:LFB10:.cfi_startprocpushl%ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl%esp, %ebp.cfi_def_cfa_register 5andl$-16, %esp call___main movl$100, _quanju # _quanju = 100call_func1leave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endprocLFE10:.section .rdata,"dr"LC0:.ascii "quanju is %d\12\0".text.globl_func1.def_func1;.scl2;.type32;.endef_func1:LFB11:.cfi_startprocpushl%ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl%esp, %ebp.cfi_def_cfa_register 5subl$40, %espmovl_quanju, %eaxmovl%eax, -12(%ebp)#temp = _quanjucall_func2movl_quanju, %eaxmovl%eax, 4(%esp) # printf 函数参数传入movl$LC0, (%esp) # printf 字符串传入call_printfcall_func2leave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endprocLFE11:.globl_func2.def_func2;.scl2;.type32;.endef_func2:LFB12:.cfi_startprocpushl%ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl%esp, %ebp.cfi_def_cfa_register 5subl$40, %espmovl$1, -12(%ebp) # 局部变量 quanju = 1 jmpL4L5:movl$46, (%esp) # _putchar参数传入 $46 就是 "."call_putcharaddl$1, -12(%ebp) # 局部变量 quanju + = 1L4:cmpl$19, -12(%ebp) # 比较 quanju 和 19jleL5 # 小于等于跳movl$10, (%esp) # 换行call_putcharleave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endprocLFE12:.ident"GCC: (GNU) 4.8.1".def_printf;.scl2;.type32;.endef.def_putchar;.scl2;.type32;.endef
局部变量都是在函数的栈中分配内存并通过 %ebp偏移寻址 。
由此可见两种方式的主要区别:
1. 内存分配的方式。 全局变量在程序的内存空间中直接分配, 局部变量在函数的栈空间分配空间。
2. 寻址方式, 全局变量通过符号链接直接寻址, 局部变量通过%ebp偏移寻址。
编译的汇编代码中出现一些cfi伪指令, 这个东西生产的东西没有出现在代码中,代码反编译的内容和汇编代码还是一致的。
不过反编译内容开头给出的一大堆完全不明白的东西, 从objdump的描述来看是两个部分: exception handler 和 CRTStarup 。
目前这个部分还没开始研究。
0 0
- 031 局部和全局变量
- 局部变量和全局变量
- 局部变量和全局变量
- 全局变量和局部变量
- 局部变量和全局变量
- 全局变量和局部变量
- 局部变量和全局变量
- 全局变量和局部变量
- 全局变量和局部变量
- 局部变量和全局变量
- 全局变量和局部变量
- 全局变量和局部变量
- 全局变量和局部变量
- 全局变量和局部变量
- 局部变量和全局变量
- 局部和全局变量
- 全局变量和局部变量
- 全局变量和局部变量
- 关于菜单栏的相应
- Object 九大方法之equals理解
- Fuzhou oj--2221
- mycncart之账户余额支付方式
- 工作流学习,思想上移
- 031 局部和全局变量
- 一篇影响了全球近百年的短文《年轻》
- Sping xml 配置 出错 XmlBeanDefinitionStoreException nested exception is org.xml.sax.SAXParseException
- 编译器架构的王者LLVM——(11)深入理解GetElementPtr
- 类模版的工程应用
- 如何在Fedora 17 18 19 20 21 22 23 系统中安装 openjdk 1.6 与 1.7 1.8 共存
- 【NCRE】回收考生答题文件--文件夹压缩
- mycncart 之中国银联在线支付方式
- Palindrome