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

转载必须注明出处,违者必究。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的抽象。

转载于:https://www.cnblogs.com/dennisOne/archive/2012/10/29/2744767.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值