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

}

  

posted @ 2012-08-25 21:37  庄庄庄  阅读(831)  评论(0编辑  收藏  举报