1:a++ ,与++a的区别
int main()
{
int a=0;
int b=0;
int c=0;
b=++a;
c=a++;
}
/**********************************/
.file "b01.cpp"
.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
movl $0, -4(%rbp) //分配a空间
movl $0, -8(%rbp) //分配b空间
movl $0, -12(%rbp) //分配c空间
addl $1, -4(%rbp) //分配a=a+1
movl -4(%rbp), %eax //a-->eax
movl %eax, -8(%rbp) //eax-->b
movl -4(%rbp), %eax //a-->eax
leal 1(%rax), %edx //a+1-->edx
movl %edx, -4(%rbp) //edx-->a
movl %eax, -12(%rbp) //eax-->c
movl $0, %eax //返回值
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-11)"
.section .note.GNU-stack,"",@progbits
b=++a; 先addl加1 但是由于内存到内存不能直接赋值需要用eax寄存器中转一下
addl $1, -4(%rbp)
movl -4(%rbp), %eax //a-->eax
movl %eax, -8(%rbp) //eax-->b
c=a++; a的值先暂存到eax,用leal指令快速实现加一操作暂存到edx,
edx数据传送到a ,eax 数据传送到c
movl -4(%rbp), %eax //a-->eax
leal 1(%rax), %edx //a+1-->edx
movl %edx, -4(%rbp) //edx-->a
movl %eax, -12(%rbp) //eax-->c
逗号运算符
1:定义多个变量时用于分割变量。
2:作为一个运算符用于分割表达式,在这种情况下他只产生最后一个表达式的值。
a=(x++,y++,++z);结果是a=z+1;
movl z(%rip), %eaxaddl $1, %eax
movl %eax, z(%rip)
movl z(%rip), %eax
movl %eax, -4(%rbp)
int x,y,z;
int main()
{
x=10;
y=20;
z=30;
int a;
a=(x++,y++,++z);
(a=x++),y++,z++;
}
//***********************
.file "b03.cpp"
.globl x
.bss
.align 4
.type x, @object
.size x, 4
x:
.zero 4
.globl y
.align 4
.type y, @object
.size y, 4
y:
.zero 4
.globl z
.align 4
.type z, @object
.size z, 4
z:
.zero 4
.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
movl $10, x(%rip)
movl $20, y(%rip)
movl $30, z(%rip)
movl x(%rip), %eax
addl $1, %eax
movl %eax, x(%rip)
movl y(%rip), %eax
addl $1, %eax
movl %eax, y(%rip)
movl z(%rip), %eax
addl $1, %eax
movl %eax, z(%rip)
movl z(%rip), %eax //z---->eax
movl %eax, -4(%rbp) //eax--->a
movl x(%rip), %eax
leal 1(%rax), %edx
movl %edx, x(%rip) //x++
movl %eax, -4(%rbp) //a=x
movl y(%rip), %eax
addl $1, %eax
movl %eax, y(%rip)
movl z(%rip), %eax
addl $1, %eax
movl %eax, z(%rip)
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-11)"
.section .note.GNU-stack,"",@progbits
movl z(%rip), %eax
leal 1(%rax), %edx
movl %edx, z(%rip)
movl %eax, -4(%rbp)
leal 1(%rax), %edx
movl %edx, z(%rip)
movl %eax, -4(%rbp)
int x,y,z;
int main()
{
x=10;
y=20;
z=30;
int a=(x++,++y,z++);
}
//************************
.file "b04.cpp"
.globl x
.bss
.align 4
.type x, @object
.size x, 4
x:
.zero 4
.globl y
.align 4
.type y, @object
.size y, 4
y:
.zero 4
.globl z
.align 4
.type z, @object
.size z, 4
z:
.zero 4
.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
movl $10, x(%rip)
movl $20, y(%rip)
movl $30, z(%rip)
movl x(%rip), %eax
addl $1, %eax
movl %eax, x(%rip)
movl y(%rip), %eax
addl $1, %eax
movl %eax, y(%rip)
movl z(%rip), %eax
leal 1(%rax), %edx
movl %edx, z(%rip)
movl %eax, -4(%rbp)
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-11)"
.section .note.GNU-stack,"",@progbits