C99 变长数组 测试

#include <stdio.h>
#include <stdlib.h>
#define dprint(A) printf("%s:\t\t%p\n", #A, A);
void foo(int n, int m)
{
    int xy = 8;
    int a[n];
    int x = 1;
    float y = 1.0;

    dprint(&xy);
    dprint(&x);
    dprint(&y);
    printf("&a[%d]:\t%p\n",m, &a[m]);
    dprint(a);

}

int main(int argc, char *argv[])
{
    if(argc == 3)
        foo(atoi(argv[1]), atoi(argv[2]));
    return 0;
}

/* ---------------------
测试结果:
-->gcc -g -std=c99 Noname1.c -o a.exe

-->a 100 115
&xy:            0x22ff24
&x:             0x22ff20
&y:             0x22ff1c
&a[115]:        0x22ff1c
a:              0x22fd50

-->a 1000 1015
&xy:            0x22ff24
&x:             0x22ff20
&y:             0x22ff1c
&a[1015]:       0x22ff1c
a:              0x22ef40
------------------------ */

  可以看出,变长数组被当做特殊的局部变量,相对于普通局部变量,它的位置总是在栈的低地址处。。 只是这个常数15该如何解释?

反汇编下,期待高人分析:

-->objdump -dS a.exe > tmp.txt
#define dprint(A) printf("%s:\t\t%p\n", #A, A);
void foo(int n, int m)
{
  4013d9:       55                      push   %ebp
  4013da:       89 e5                   mov    %esp,%ebp
  4013dc:       57                      push   %edi
  4013dd:       56                      push   %esi
  4013de:       53                      push   %ebx
  4013df:       83 ec 5c                sub    $0x5c,%esp
  4013e2:       89 e0                   mov    %esp,%eax
  4013e4:       89 c7                   mov    %eax,%edi
    int xy = 8;
  4013e6:       c7 45 dc 08 00 00 00    movl   $0x8,-0x24(%ebp)
    int a[n];
  4013ed:       8b 75 08                mov    0x8(%ebp),%esi
  4013f0:       8d 46 ff                lea    -0x1(%esi),%eax
  4013f3:       89 45 e0                mov    %eax,-0x20(%ebp)
  4013f6:       89 f0                   mov    %esi,%eax
  4013f8:       ba 00 00 00 00          mov    $0x0,%edx
  4013fd:       89 c1                   mov    %eax,%ecx
  4013ff:       80 e5 ff                and    $0xff,%ch
  401402:       89 d3                   mov    %edx,%ebx
  401404:       83 e3 0f                and    $0xf,%ebx
  401407:       89 c8                   mov    %ecx,%eax
  401409:       89 da                   mov    %ebx,%edx
  40140b:       0f a4 c2 05             shld   $0x5,%eax,%edx
  40140f:       c1 e0 05                shl    $0x5,%eax
  401412:       89 c1                   mov    %eax,%ecx
  401414:       80 e5 ff                and    $0xff,%ch
  401417:       89 4d c0                mov    %ecx,-0x40(%ebp)
  40141a:       89 d1                   mov    %edx,%ecx
  40141c:       83 e1 0f                and    $0xf,%ecx
  40141f:       89 4d c4                mov    %ecx,-0x3c(%ebp)
  401422:       8b 45 c0                mov    -0x40(%ebp),%eax
  401425:       8b 55 c4                mov    -0x3c(%ebp),%edx
  401428:       89 f0                   mov    %esi,%eax
  40142a:       ba 00 00 00 00          mov    $0x0,%edx
  40142f:       89 c1                   mov    %eax,%ecx
  401431:       80 e5 ff                and    $0xff,%ch
  401434:       89 4d b8                mov    %ecx,-0x48(%ebp)
  401437:       89 d1                   mov    %edx,%ecx
  401439:       83 e1 0f                and    $0xf,%ecx
  40143c:       89 4d bc                mov    %ecx,-0x44(%ebp)
  40143f:       8b 45 b8                mov    -0x48(%ebp),%eax
  401442:       8b 55 bc                mov    -0x44(%ebp),%edx
  401445:       0f a4 c2 05             shld   $0x5,%eax,%edx
  401449:       c1 e0 05                shl    $0x5,%eax
  40144c:       89 c1                   mov    %eax,%ecx
  40144e:       80 e5 ff                and    $0xff,%ch
  401451:       89 4d b0                mov    %ecx,-0x50(%ebp)
  401454:       89 d1                   mov    %edx,%ecx
  401456:       83 e1 0f                and    $0xf,%ecx
  401459:       89 4d b4                mov    %ecx,-0x4c(%ebp)
  40145c:       8b 45 b0                mov    -0x50(%ebp),%eax
  40145f:       8b 55 b4                mov    -0x4c(%ebp),%edx
  401462:       89 f0                   mov    %esi,%eax
  401464:       c1 e0 02                shl    $0x2,%eax
  401467:       83 c0 0f                add    $0xf,%eax
  40146a:       83 c0 0f                add    $0xf,%eax
  40146d:       c1 e8 04                shr    $0x4,%eax
  401470:       c1 e0 04                shl    $0x4,%eax
  401473:       e8 f8 02 00 00          call   401770 <___chkstk>
  401478:       8d 44 24 0c             lea    0xc(%esp),%eax
  40147c:       83 c0 0f                add    $0xf,%eax
  40147f:       c1 e8 04                shr    $0x4,%eax
  401482:       c1 e0 04                shl    $0x4,%eax
  401485:       89 45 e4                mov    %eax,-0x1c(%ebp)
    int x = 1;
  401488:       c7 45 d8 01 00 00 00    movl   $0x1,-0x28(%ebp)
    float y = 1.0;
  40148f:       b8 00 00 80 3f          mov    $0x3f800000,%eax
  401494:       89 45 d4                mov    %eax,-0x2c(%ebp)

    dprint(&xy);
  401497:       8d 45 dc                lea    -0x24(%ebp),%eax
  40149a:       89 44 24 08             mov    %eax,0x8(%esp)
  40149e:       c7 44 24 04 64 80 40    movl   $0x408064,0x4(%esp)
  4014a5:       00 
  4014a6:       c7 04 24 68 80 40 00    movl   $0x408068,(%esp)
  4014ad:       e8 fe fe ff ff          call   4013b0 <_printf>
    dprint(&x);
  4014b2:       8d 45 d8                lea    -0x28(%ebp),%eax
  4014b5:       89 44 24 08             mov    %eax,0x8(%esp)
  4014b9:       c7 44 24 04 71 80 40    movl   $0x408071,0x4(%esp)
  4014c0:       00 
  4014c1:       c7 04 24 68 80 40 00    movl   $0x408068,(%esp)
  4014c8:       e8 e3 fe ff ff          call   4013b0 <_printf>
    dprint(&y);
  4014cd:       8d 45 d4                lea    -0x2c(%ebp),%eax
  4014d0:       89 44 24 08             mov    %eax,0x8(%esp)
  4014d4:       c7 44 24 04 74 80 40    movl   $0x408074,0x4(%esp)
  4014db:       00 
  4014dc:       c7 04 24 68 80 40 00    movl   $0x408068,(%esp)
  4014e3:       e8 c8 fe ff ff          call   4013b0 <_printf>
    printf("&a[%d]:\t%p\n",m, &a[m]);
  4014e8:       8b 45 e4                mov    -0x1c(%ebp),%eax
  4014eb:       8b 55 0c                mov    0xc(%ebp),%edx
  4014ee:       c1 e2 02                shl    $0x2,%edx
  4014f1:       01 d0                   add    %edx,%eax
  4014f3:       89 44 24 08             mov    %eax,0x8(%esp)
  4014f7:       8b 45 0c                mov    0xc(%ebp),%eax
  4014fa:       89 44 24 04             mov    %eax,0x4(%esp)
  4014fe:       c7 04 24 77 80 40 00    movl   $0x408077,(%esp)
  401505:       e8 a6 fe ff ff          call   4013b0 <_printf>
    dprint(a);
  40150a:       8b 45 e4                mov    -0x1c(%ebp),%eax
  40150d:       89 44 24 08             mov    %eax,0x8(%esp)
  401511:       c7 44 24 04 83 80 40    movl   $0x408083,0x4(%esp)
  401518:       00 
  401519:       c7 04 24 68 80 40 00    movl   $0x408068,(%esp)
  401520:       e8 8b fe ff ff          call   4013b0 <_printf>
  401525:       89 fc                   mov    %edi,%esp

}