逻辑表达式汇编解析

1:or || 表达式

 如果第一个符合条件则直接执行不在验证后面的条件

int main()
{
 int a;
a=20;
int b=30;
if(a<20 || b>30)
{
b=90;
}

}

//************************//
	.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	$20, -4(%rbp)   //a=20
	movl	$30, -8(%rbp)   //b=30
	cmpl	$19, -4(%rbp)   //a-19
	jle	.L2             //a<=19 jmp .L2 
	cmpl	$30, -8(%rbp)   //b-30
	jle	.L3             //b<=30 jmp .L3 otherwhile jmp .L2 
.L2:
	movl	$90, -8(%rbp)  //next exe .L3
.L3:
	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


2:&&表达式

有一个条件不符立即跳出,不在检查下一个条件
int main()
{
 int a;
a=20;
int b=30;
if(a<20 && b>30)
{
b=90;
}
}
//************************


	.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	$20, -4(%rbp)  //a=20
	movl	$30, -8(%rbp)   //b=30
	cmpl	$19, -4(%rbp)   //a-19 
	jg	.L2            //a>19 jmp .L2
	cmpl	$30, -8(%rbp)  //b-30
	jle	.L2            //b<=30  jmp .L2
	movl	$90, -8(%rbp)
.L2:
	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
3 not !运算符
 前面只要有一个为FALSE则直接执行,不检查后面的条件
int main()
{
 int a;
a=20;
int b=30;
if(!(a<20 && b>30))
{
b=90;
}

}
//*************************
	.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	$20, -4(%rbp)  //a=20
	movl	$30, -8(%rbp)  //b=30
	cmpl	$19, -4(%rbp)  //a-30
	jg	.L2            //a>19 jmp .L2
	cmpl	$30, -8(%rbp)  //b-30
	jg	.L3            //b-30>0 jmp .L3
.L2:
	movl	$90, -8(%rbp)
.L3:
	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


4:?:三元表达式

int main()
{
 int a;
a=20;
int b=30;

int c=a>b?a:b;

}
//**************************//

	.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	$20, -4(%rbp)  //a=20
	movl	$30, -8(%rbp)  //b=30
	movl	-4(%rbp), %eax  //eax=20
	cmpl	-8(%rbp), %eax  //a-b
	jle	.L2             //a<=b jmp .L2
	movl	-4(%rbp), %eax  //eax=20
	jmp	.L3
.L2:
	movl	-8(%rbp), %eax  //eax=30
.L3:
	movl	%eax, -12(%rbp)//b=eax
	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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Farmwang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值