逆向知识第七讲,三目运算符在汇编中的表现形式,以及编译器优化方式

本文详细介绍了编译器优化的多种方式,包括常量折叠、常量传播、复写传播等,并深入探讨了三目运算符在汇编语言中的不同表达形式,结合具体示例解释了它们如何被编译器优化为无分支或少分支的代码,以提高程序执行效率。
摘要由CSDN通过智能技术生成

一丶编译器优化方式

首先说一下编译器优化方式.

1.常量折叠

2.常量传播

3.复写传播

4.公共表达式

5.去掉不可达到分支

6.顺序代替分支

7.数学变化

8.代码外提

9.减少变量.

10 强度削弱.

优化方式解析

1.常量折叠

  常量折叠已经讲过, 就是两个常量相加  8 + 8 ,那么在编译前期就能计算出来.

2.常量传播

  当一个变量,没有对齐进行写入或者更改的时候,这个时候可以当做常量.(优化为常量)

3.复写传播

  这个需要好好说说了,我们都知道,C语言中,C调用约定都需要平栈.比如你调用完毕一个printf,那么就需要平栈.

     而优化的时候,直接一起平栈了.

就比如:

  int i = (a * a + b);

  int j = i * 5;

那么此时可以变成  int j = (a * a + b) * 5 ;这样就会省掉一个变量(当然和去除变量不一样)

call addr

add esp,8

call  addr

add esp,8

此时汇编代码可以变成

call addr

call addr

add esp,16   这样就省掉了一个add 指令了.

4.公共表达式

公共表达式和复写传播有点不一样.(看着是相反的.但是不能说是相反的.)

比如 int i = (a *a * b) * 7;

  int j = (a * a * b) * 7 * 3

优化之后变成.

int j = i * 3;

什么是公共表达式,就是说,表达式用的都是一样的.重复使用,这样的时候,可以使用变量来存着了.或者中专一个寄存器保存其结果.

这样效率会很快,不用重新计算了.

5.去掉不可达到分支

这个应该很好理解.

复制代码
if(1)
{
    ......
}
else
{
    .....  
}
复制代码

此时if语句会成立,而else永远不会成立,那么编译器优化的时候就可以去掉else语句了.

 

6.顺序代替分支

这个下方讲解三木运算符的时候可以明白.

7.数学变化

这也很好理解.

3a + 5a

那么此时可以变为一条表达式计算直接变成8a

8.代码外提

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值