• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

从汇编语言看C语言的内存管理

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne

本文试图从汇编语言的角度回答下面几个问题:

  1. C语言中直接使用寄存器;
  2. C语言如何直接操作内存;
  3. C语言的内存的管理;
  4. C语言的参数传递和返回值;
  5. C语言中的可变参数传递;

 

  1. C语言直接使用寄存器

    TC中可以直接使用寄存器.

    1 main()
    2 {
    3     _AX = 1;
    4     _BX = 1;
    5     _CX = 2;
    6     _AX = _BX + _CX;
    7     _AH = _BL + _CL;
    8 }

    debug之后的代码:

  2. C语言通过指针来直接操作内存
     1     main()
     2     {
     3         *(char *)0x2000 = 'a';                /* 0x2000是偏移地址 */
     4         *(int *)0x2000 = 0xf;
     5         *(char far *)0x20001000 = 'a';        /* 2000:1000 */
     6         
     7         _BX = 0x2000;
     8         *(char *)_BX = 'b';
     9         
    10         *(char far *)(0x20001000 + _BX) = *(char *)_AX;
    11         
    12     }

    debug之后的代码:

  3. C语言的内存的管理

    1:示例代码

     1     int a1, a2;                      /* 全局变量 */
     2     
     3     void f(void);
     4     
     5     main(void)
     6     {
     7         int b1, b2;                  /* 局部变量 */
     8         static int s;                /* static变量 */
     9         a1 = 0xa1; a2 = 0xa2;
    10         b1 = 0xb1; b2 = 0xb2;
    11         s = 0x1;
    12     }
    13     
    14     void f(void)
    15     {
    16         int c1, c2;
    17         a1 = 0xfa1; a2 = 0xfa2;
    18         c1 = 0xc1; c2 = 0xc2;
    19     }

    debug之后的代码:

    分析代码:"

    总结:

    • 局部变量放在栈区,按照声明的顺序由低到高存放。
    • 静态变量和全局变量都是放在全局区,按照声明的顺序由低到高存放。
    • [补充结论] 形参也是放在栈区,也是按照声明的顺序由低到高依次存放[后面可以证明]
  4. 参数传递和结果返回

    (1). 参数传递

     1     void f(char a, int b);
     2     
     3     main()
     4     {
     5         f('a', 2);
     6     }
     7     
     8     void f(char a, int b)
     9     {
    10         a = 'c';
    11         b = 300;
    12     }

    分析代码:

    总结:

    • 可以看出,tc编译生成的可执行程序,形参内存的分配和释放都是由主调函数完成,上图中黑色箭头所示。
    • 主调函数调用被调函数,call的过程意味着ip入栈;然后将bp入栈(bp始终记录了这被调函数的栈顶,可以通过bp向下访问形参;向上访问局部变量)sp始终指向栈顶。
    • 栈中依次排放: …<…<-(IP) <-形参<-局部变量 <-(bp)

       

    (2). 结果返回

     1     int f(void);
     2     
     3     main(void)
     4     {
     5         int c;    
     6         c = f();
     7     }
     8     
     9     int f(void)
    10     {
    11         int a, b, sum;
    12         sum = a + b;
    13         return sum;
    14     }

    debug之后

    分析代码:

    可以看出返回值是放入一个寄存器AX进行暂存的。

  5. 可变参数

    上述分析我们知道,形参可以通过BP来访问。这就为C语言使用可变参数机制va_list可以看成是对BP的抽象。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#SOCKET多线程多管道可断点传送大文件2(续)发布时间:2022-07-18
下一篇:
轻量级多级菜单控制框架程序(C语言)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap