登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

仙剑奇侠传的博客

羽化成仙

 
 
 

日志

 
 

C语言内存分配  

2011-07-28 22:18:29|  分类: C |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  1. 源程序代码为:

    int intGloa=0;

    char c='a';

    int main(){

        int b;

        char s[]="abcdefghigkmnl";

        char * pChar="您好吗";

        static int sintC=88888;

        static float flsB=888.888;

        return 0;

    }

  2. 转成汇编代码为:

    .file    "demo7.c"

        .intel_syntax noprefix

    .globl _intGloa

        .bss

        .align 4

    _intGloa:

        .space 4

    .globl _c

        .data

    _c:

        .byte    97

        .def    ___main;    .scl    2;    .type    32;    .endef

        .section .rdata,"dr"

    LC1:

        .ascii "\304\372\272\303\302\360\0"

    LC0:

        .ascii "abcdefghigkmnl\0"

        .text

    .globl _main

        .def    _main;    .scl    2;    .type    32;    .endef

    _main:

        push    ebp

        mov    ebp, esp

        and    esp, -16

        push    edi

        push    esi

        push    ebx

        sub    esp, 36

        call    ___main

        lea    edx, [esp+13]

        mov    ebx, OFFSET FLAT:LC0

        mov    eax, 15

        mov    edi, edx

        mov    esi, ebx

        mov    ecx, eax

        rep movsb

        mov    DWORD PTR [esp+28], OFFSET FLAT:LC1

        mov    eax, 0

        add    esp, 36

        pop    ebx

        pop    esi

        pop    edi

        leave

        ret

        .data

        .align 4

    _flsB.1221:

        .long    1147025621

        .align 4

    _sintC.1220:

        .long    88888

  3. C程序内存分配

内存区

含义

寄存器

用来存放函数形参,与函数内变量,栈的压与出由代码区代码负责生成相关代码

ebp:栈基址寄存器

esp:栈指针

用malloc、calloc、realloc函数分配的空间,空间的释放由程序员自己处理

 

全局区

进程加载就分配了空间,直到进种程结束。存放全局变量与静态变量

ds:数据段寄存器存基址

文字区

为了加快程序速度,在编译时把字符串放在文字区,进程起动就分配空间了,其实也是属于全局区。

 

代码区

存放程序代码区

cs:代码段基地址

eip:存放下条代码偏移量

 

  1. 本程序c代码与汇编对照

C代码

汇编

int intGloa=0;

_intGloa:

    .space 4

char c='a';

.globl _c.data

_c:.byte 97 c语言的ascill字符当作整形数存在

char s[]="abcdefghigkmnl";

LC0:.ascii "abcdefghigkmnl\0"。汇编生成标签,其后添加\0表示结束,所以判断一个字符串是否结束可以用\0来判断

char * pChar="您好吗";

LC1:.ascii "\304\372\272\303\302\360\0"。中文用相应字符编码表示

static int sintC=88888;

_flsB.1221:

.long    1147025621

.align 4 对象对齐方式与二进制值

  

 

5、总结:基本上是按照汇编程序的方式进行分段

  评论这张
 
阅读(234)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018