Luc@s
09-09-2004, 20:30
questo è il sorgente C che ho compilato:
/*
### Copyright (c) 2004 Luca Francesca
### This script is provided under the terms of the GNU General Public License
### (see http://www.gnu.org/licenses/gpl.html for the full license text.)
*/
#include <stdio.h>
#include <stdlib.h>
#define MASK 0x40 /* control bit 6 */
int main(int argc, char *argv[])
{
unsigned int i = 100, tmp1 , tmp2, tmp3, tmp4;
tmp1 = i & MASK;
tmp2 = i ^ MASK;
tmp3 = (i >> 2);
tmp4 = (i << 2);
printf("i = %d \n \
i & MASK = %d \n \
i ^ MASK = %d \n \
i >> 2 = %d \n\
i << 2 = %d\n", i, tmp1, tmp2, tmp3, tmp4);
char c;
scanf("%c", &c);
return 0;
}
Questo il risultato senza opt:
.file "i.c"
.def ___main; .scl 2; .type 32; .endef
.text
.align 32
LC0:
.ascii "i = %d \12 i & MASK = %d \12 i ^ MASK = %d \12 i >> 1 = %d \12 i << 1 = %d\12\0"
LC1:
.ascii "%c\0"
.align 2
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -28(%ebp)
movl -28(%ebp), %eax
call __alloca
call ___main
movl $100, -4(%ebp)
movl -4(%ebp), %eax
andl $64, %eax
movl %eax, -8(%ebp)
movl -4(%ebp), %eax
xorl $64, %eax
movl %eax, -12(%ebp)
movl -4(%ebp), %eax
shrl %eax
movl %eax, -16(%ebp)
movl -4(%ebp), %eax
addl %eax, %eax
movl %eax, -20(%ebp)
subl $8, %esp
pushl -20(%ebp)
pushl -16(%ebp)
pushl -12(%ebp)
pushl -8(%ebp)
pushl -4(%ebp)
pushl $LC0
call _printf
addl $32, %esp
subl $8, %esp
leal -21(%ebp), %eax
pushl %eax
pushl $LC1
call _scanf
addl $16, %esp
movl $0, %eax
leave
ret
.def _scanf; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef
Questo con -O3 -std=c99
.file "i.c"
.def ___main; .scl 2; .type 32; .endef
.text
.align 32
LC0:
.ascii "i = %d \12 i & MASK = %d \12 i ^ MASK = %d \12 i >> 2 = %d \12 i << 2 = %d\12\0"
LC1:
.ascii "%c\0"
.align 2
.p2align 4,,15
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
pushl %edx
pushl %edx
andl $-16, %esp
call __alloca
call ___main
pushl %eax
pushl %eax
pushl $400
pushl $25
pushl $36
pushl $64
pushl $100
pushl $LC0
call _printf
leal -1(%ebp), %edx
addl $24, %esp
pushl %edx
pushl $LC1
call _scanf
movl %ebp, %esp
xorl %eax, %eax
popl %ebp
ret
.def _scanf; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef
La v in O3 sa gia quali valori dare a printf mentre la senza opt li prende dallo stack......questo ad una prima analisi...
Ora vorrei riflettere con voi su una cosa.......ma perche cìè questo divario di codice?
P.S: qualcuno puo postare il codice del VC++6 e del VC++.NET per confrontare l'output??
P.P.S: se volete..chiudetemi il post.....ma secondo me è molto bello vedere le diff tra compilatori
/*
### Copyright (c) 2004 Luca Francesca
### This script is provided under the terms of the GNU General Public License
### (see http://www.gnu.org/licenses/gpl.html for the full license text.)
*/
#include <stdio.h>
#include <stdlib.h>
#define MASK 0x40 /* control bit 6 */
int main(int argc, char *argv[])
{
unsigned int i = 100, tmp1 , tmp2, tmp3, tmp4;
tmp1 = i & MASK;
tmp2 = i ^ MASK;
tmp3 = (i >> 2);
tmp4 = (i << 2);
printf("i = %d \n \
i & MASK = %d \n \
i ^ MASK = %d \n \
i >> 2 = %d \n\
i << 2 = %d\n", i, tmp1, tmp2, tmp3, tmp4);
char c;
scanf("%c", &c);
return 0;
}
Questo il risultato senza opt:
.file "i.c"
.def ___main; .scl 2; .type 32; .endef
.text
.align 32
LC0:
.ascii "i = %d \12 i & MASK = %d \12 i ^ MASK = %d \12 i >> 1 = %d \12 i << 1 = %d\12\0"
LC1:
.ascii "%c\0"
.align 2
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -28(%ebp)
movl -28(%ebp), %eax
call __alloca
call ___main
movl $100, -4(%ebp)
movl -4(%ebp), %eax
andl $64, %eax
movl %eax, -8(%ebp)
movl -4(%ebp), %eax
xorl $64, %eax
movl %eax, -12(%ebp)
movl -4(%ebp), %eax
shrl %eax
movl %eax, -16(%ebp)
movl -4(%ebp), %eax
addl %eax, %eax
movl %eax, -20(%ebp)
subl $8, %esp
pushl -20(%ebp)
pushl -16(%ebp)
pushl -12(%ebp)
pushl -8(%ebp)
pushl -4(%ebp)
pushl $LC0
call _printf
addl $32, %esp
subl $8, %esp
leal -21(%ebp), %eax
pushl %eax
pushl $LC1
call _scanf
addl $16, %esp
movl $0, %eax
leave
ret
.def _scanf; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef
Questo con -O3 -std=c99
.file "i.c"
.def ___main; .scl 2; .type 32; .endef
.text
.align 32
LC0:
.ascii "i = %d \12 i & MASK = %d \12 i ^ MASK = %d \12 i >> 2 = %d \12 i << 2 = %d\12\0"
LC1:
.ascii "%c\0"
.align 2
.p2align 4,,15
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
pushl %edx
pushl %edx
andl $-16, %esp
call __alloca
call ___main
pushl %eax
pushl %eax
pushl $400
pushl $25
pushl $36
pushl $64
pushl $100
pushl $LC0
call _printf
leal -1(%ebp), %edx
addl $24, %esp
pushl %edx
pushl $LC1
call _scanf
movl %ebp, %esp
xorl %eax, %eax
popl %ebp
ret
.def _scanf; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef
La v in O3 sa gia quali valori dare a printf mentre la senza opt li prende dallo stack......questo ad una prima analisi...
Ora vorrei riflettere con voi su una cosa.......ma perche cìè questo divario di codice?
P.S: qualcuno puo postare il codice del VC++6 e del VC++.NET per confrontare l'output??
P.P.S: se volete..chiudetemi il post.....ma secondo me è molto bello vedere le diff tra compilatori