运算符汇编解释

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), %eax
addl          $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



a=(x++,++y,z++);结果是 a=z;
       movl       z(%rip), %eax
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




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Farmwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值