#include <iostream> #include <stdio.h> using namespace std; int g_int=5; int main() { int a=3; char cc='a'; float b=3.12; char c[]="hi"; char d[9]={'h','i','.','i','i','i','\0'}; char * p="hi,linson"; int g=g_int; printf("%0x\n",&a); printf("%0x\n",&cc); printf("%0x\n",&b); printf("%0x\n",&c[0]); printf("%0x\n",&d[0]); printf("%0x\n",&p); printf("%0x\n",&g_int); printf("%0x\n",&p[0]); return 0; }
结果:
汇编代码:
.file "main.cpp" .lcomm __ZStL8__ioinit,1,1 .globl _g_int .data .align 4 _g_int://全局变量 .long 5 .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC1://指针数据 .ascii "hi,linson\0" LC2://mian函数地址 .ascii "%0x\12\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $48, %esp call ___main movl $3, 40(%esp) movb $97, 39(%esp) movl LC0, %eax movl %eax, 32(%esp) movw $26984, 29(%esp) movb $0, 31(%esp) movl $0, 20(%esp) movl $0, 24(%esp) movb $0, 28(%esp) movb $104, 20(%esp) movb $105, 21(%esp) movb $46, 22(%esp) movb $105, 23(%esp) movb $105, 24(%esp) movb $105, 25(%esp) movl $LC1, 16(%esp) movl _g_int, %eax movl %eax, 44(%esp) leal 40(%esp), %eax movl %eax, 4(%esp) movl $LC2, (%esp) call _printf leal 39(%esp), %eax movl %eax, 4(%esp) movl $LC2, (%esp) call _printf leal 32(%esp), %eax movl %eax, 4(%esp) movl $LC2, (%esp) call _printf leal 29(%esp), %eax movl %eax, 4(%esp) movl $LC2, (%esp) call _printf leal 20(%esp), %eax movl %eax, 4(%esp) movl $LC2, (%esp) call _printf leal 16(%esp), %eax movl %eax, 4(%esp) movl $LC2, (%esp) call _printf movl $_g_int, 4(%esp) movl $LC2, (%esp) call _printf movl 16(%esp), %eax movl %eax, 4(%esp) movl $LC2, (%esp) call _printf movl $0, %eax leave ret .def ___tcf_0; .scl 3; .type 32; .endef
结论:
全局变量:放入堆中。所以所有函数都可以引用,只要未free。
如:语句:int g_int=5; 汇编:_g_int:
局部基本类型变量:只存在指令中,当执行指令转到此函数时,由指令把数据放入到函数栈地址。
如:
语句:int a=3; movl $3, 40(%esp)
指针:程序一加载,和全局变量一样,数据放入堆中,
语句:char * p="hi,linson"; 如:LC1:.ascii "hi,linson\0"
当执行指令转到此函数时,由指令把堆中地址放入到指针变量所在的函数栈地址。如: movl $LC1, 16(%esp)