zoukankan      html  css  js  c++  java
  • 第十章扩展——__cdecl 的压栈方式——printf

    #include<stdio.h>

    int main()

    {

      int  b = 3;

      int arr[] = {6,7,8,9,10}; 

      int *ptr = arr;

      *(ptr++) += 123;

      //printf("%d,%d\n", *ptr, *(++ptr));   //输出:8,8 

      printf("%d,%d\n", *ptr, *(ptr++));//输出:8,7

      return 0;

    }

    _cdecl 压栈方式是从右到左

    更加明显的例子:

    #include<stdio.h>

    int main()

    {

      int a = 5, b = 7;

      printf("%d  %d\n",a,b);

      return 0;

    }

    部分汇编代码:

    printf("%d  %d\n",a,b);

    00251BBC  mov         esi,esp 

    00251BBE  mov         eax,dword ptr [b] 

    00251BC1  push        eax 

    00251BC2  mov         ecx,dword ptr [a] 

    00251BC5  push        ecx 

    00251BC6  push        255858h 

    00251BCB  call        dword ptr ds:[2592BCh] 

    00251BD1  add         esp,0Ch 

    00251BD4  cmp         esi,esp 

    00251BD6  call        __RTC_CheckEsp (025113Bh) 

    对于

        int a = 5;

        printf("%d\n", (a = 2 * 5, a * 4), printf("%d\n", a));

    可见使用VS 和使用 mingw32效果是不一样的!

  • 相关阅读:
    P4009 汽车加油行驶问题
    P2761 软件补丁问题
    P1251 餐巾计划问题
    P2766 最长不下降子序列问题
    P4011 孤岛营救问题
    P2765 魔术球问题
    P2770 航空路线问题
    P2762 太空飞行计划问题
    P2764 最小路径覆盖问题
    P3355 骑士共存问题
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2497443.html
Copyright © 2011-2022 走看看