一个C语言程序jiajia.c如下:
jiajia2.c
结果输出9
#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
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movq $0, -8(%rbp)
addq $1, -8(%rbp)
addq $1, -8(%rbp) //i先增加2,i=2
movq -8(%rbp), %rax //移入i至DX寄存器
leaq (%rax,%rax), %rdx //i+i=4
addq $1, -8(%rbp) //i增加,i=3
movq -8(%rbp), %rax //移入i至AX寄存器
addq %rdx, %rax //4+3=7,结果存AX寄存器
movq %rax, %rsi
movl $.LC0, %edi
movl $0, %eax
call printf
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-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
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movq $0, -8(%rbp)
addq $1, -8(%rbp)
addq $1, -8(%rbp)
addq $1, -8(%rbp) //i增加至3,i=3
movq -8(%rbp), %rax
leaq (%rax,%rax), %rdx //i+i=6
movq -8(%rbp), %rax
addq %rdx, %rax //3+3=9
movq %rax, %rsi
movl $.LC0, %edi
movl $0, %eax
call printf
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"
.section .note.GNU-stack,"",@progbits