On 02/21/2012 03:18 PM, 嘉谟 wrote:
> I do a experiments to check how gcc pass the arguments.
> here is the code
> 
> #include <stdio.h>
> int main(int argc , char *argv[]){
>         int a=3;
>         int b=3;
>         int c=3;
>         printf("%d %d\n",++a+c,a+c);
>         printf("%d %d\n",++b,b);
>         return 0;
> }
> 
> the anwer is
> 
> 8 7
> 4 4
> 
> the piece of assembly language:  gcc 4.6.2
> 
>         movl    $3, 28(%esp)
>         movl    $3, 24(%esp)
>         movl    $3, 20(%esp)
>         movl    20(%esp), %eax
>         movl    28(%esp), %edx
>         leal    (%edx,%eax), %ecx
>         addl    $1, 28(%esp)
>         movl    20(%esp), %eax
>         movl    28(%esp), %edx
>         addl    %eax, %edx
>         movl    $.LC0, %eax
>         movl    %ecx, 8(%esp)
>         movl    %edx, 4(%esp)
>         movl    %eax, (%esp)
>         call    printf
>         addl    $1, 24(%esp)
>         movl    $.LC0, %eax
>         movl    24(%esp), %edx
>         movl    %edx, 8(%esp)
>         movl    24(%esp), %edx
>         movl    %edx, 4(%esp)
>         movl    %eax, (%esp)
>         call    printf
> 
> In the first case , gcc first compute the a+c to %ecx ,and pass it
> stack , the compute ++a+c to %edx ,so the answer is 8 7
> 
> In the second case , why it didn't do the same thing like
> compute b=3  and pass it to stack ,then compute ++b and pass it to
> stack .to the result 4 3. However it  first
> addl    $1, 24(%esp)  ==>  b+1  I think it compute the expression
> b+1. the pass it to stack . the b which now is 4 and was passed to
> stack.
> 
> I was wondering why gcc handle  the same mode in two ways.
> 
> Is there some errors I had made ?

http://c-faq.com/expr/evalorder2.html

Andrew.

Reply via email to