理解各种数据类型和简单类在内存中的存在形式。

#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',''};
    char * p="hi,linson";
    int g=g_int;

    printf("%0x
",&a);
    printf("%0x
",&cc);
    printf("%0x
",&b);
    printf("%0x
",&c[0]);
    printf("%0x
",&d[0]);
    printf("%0x
",&p);

    printf("%0x
",&g_int);
    printf("%0x
",&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"
LC2://mian函数地址
    .ascii "%0x12"
    .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"

当执行指令转到此函数时,由指令把堆中地址放入到指针变量所在的函数栈地址。如: movl $LC1, 16(%esp)

 
原文地址:https://www.cnblogs.com/lsfv/p/5563392.html