- 论坛徽章:
- 0
|
编译器的问题,在MS VC上,如果是RELEASE版,最后一行打印的是6, 6, 6。如果是DEBUG版,打印的是8,7,6.
下面是GCC编译出来的汇编代码,可以看出在第三个PRINTF时候,I是被改了之后,又传给了RPINTF. 注意看2和3之间。
.file "2-5.c"
.section .rodata
.LC0:
.string "i = %d, j = %d, k = %d\n"
.LC1:
.string "%d\n"
.LC2:
.string "%d, %d, %d\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
movl $3, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, -12(%ebp)
addl $1, -8(%ebp)
addl $1, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, -16(%ebp)
movl -16(%ebp), %eax
movl %eax, 12(%esp)
movl -12(%ebp), %eax
movl %eax, 8(%esp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
1 call printf
movl -8(%ebp), %eax
negl %eax
addl $1, -8(%ebp)
movl %eax, 4(%esp)
movl $.LC1, (%esp)
2 call printf
movl -8(%ebp), %edx
addl $1, -8(%ebp)
movl -8(%ebp), %eax
addl $1, -8(%ebp)
movl %edx, 12(%esp)
movl %eax, 8(%esp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC2, (%esp)
3 call printf
addl $36, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"
.section .note.GNU-stack,"",@progbits
[ 本帖最后由 accessory 于 2009-7-2 03:46 编辑 ] |
|