一個C語言程式jiajia.c如下:
#include<stdio.h>int main(){ long i; i=0; printf("%ld\n",(++i)+(++i)+(++i)); } 該程式在X86、linux機器上編譯後的運行結果為7,而在SPARC/SUNOS機器上編譯後的運行結果為6.試分析結果不同的原因。
jiajia.s
.file"jiajia.c".section.rodata.LC0:.string"%ld\n".text.globlmain.typemain, @functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6subq$16, %rspmovq$0, -8(%rbp)addq$1, -8(%rbp)addq$1, -8(%rbp)//i先增加2,i=2movq-8(%rbp), %rax//移入i至DX寄存器leaq(%rax,%rax), %rdx//i+i=4addq$1, -8(%rbp)//i增加,i=3movq-8(%rbp), %rax//移入i至AX寄存器addq%rdx, %rax//4+3=7,結果存AX寄存器movq%rax, %rsimovl$.LC0, %edimovl$0, %eaxcallprintfleave.cfi_def_cfa 7, 8ret.cfi_endproc.LFE0:.sizemain, .-main.ident"GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3".section.note.GNU-stack,"",@progbits
jiajia2.c
#include<stdio.h>int main(){ long i; i=0; printf("%ld\n",(++i)+((++i)+(++i))); //改為後兩個加括弧}
結果輸出9
jiajia2.s
.file"jiajia2.c".section.rodata.LC0:.string"%ld\n".text.globlmain.typemain, @functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6subq$16, %rspmovq$0, -8(%rbp)addq$1, -8(%rbp)addq$1, -8(%rbp)addq$1, -8(%rbp)//i增加至3,i=3movq-8(%rbp), %raxleaq(%rax,%rax), %rdx//i+i=6movq-8(%rbp), %raxaddq%rdx, %rax//3+3=9movq%rax, %rsimovl$.LC0, %edimovl$0, %eaxcallprintfleave.cfi_def_cfa 7, 8ret.cfi_endproc.LFE0:.sizemain, .-main.ident"GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3".section.note.GNU-stack,"",@progbits