第77部分- Linux x86 64位汇编 优化编译器代码-O1/-O2/-O3

仅仅使用汇编语言代码替换C或者C++不会必然使得程序执行的更好,因为编译器已经把所有高级语言代码都转化成了汇编语言。

这里的关键是编写比编译器生成的代码更好的汇编语言。当然也可以使用若干优化技巧来指示编译器生成汇编语言代码。我们需要了解如何从编译器生成代码,如何使用各种优化级别,以及利用了什么优化技术。

编译器的-O选项提供了GNU编译器的优化步骤。共有3个级别

-O:提供基础的级别的优化

-O2:提供更加高级的代码优化

-O3:提供最高级别的优化

O1优化

-O1支持如下的优化选项。

-fauto-inc-dec

-fbranch-count-reg

-fcombine-stack-adjustments

-fcompare-elim

-fcprop-registers

-fdce

-fdefer-pop

-fdelayed-branch

-fdse

-fforward-propagate

-fguess-branch-probability

-fif-conversion2

-fif-conversion

-finline-functions-called-once

-fipa-pure-const

-fipa-profile

-fipa-reference

-fmerge-constants

-fmove-loop-invariants

-freorder-blocks

-fshrink-wrap

-fshrink-wrap-separate

-fsplit-wide-types

-fssa-backprop

-fssa-phiopt

-ftree-bit-ccp

-ftree-ccp

-ftree-ch

-ftree-coalesce-vars

-ftree-copy-prop

-ftree-dce

-ftree-dominator-opts

-ftree-dse

-ftree-forwprop

-ftree-fre

-ftree-phiprop

-ftree-sink

-ftree-slsr

-ftree-sra

-ftree-pta

-ftree-ter

-funit-at-a-time

O2优化

-O2优化结合了第一个O1优化的所有优化技术,再加上了很多其他技术。

-fthread-jumps
                   -falign-functions -falign-jumps
                   -falign-loops -falign-labels
                   -fcaller-saves
                   -fcrossjumping
                   -fcse-follow-jumps -fcse-skip-blocks
                   -fdelete-null-pointer-checks
                   -fdevirtualize -fdevirtualize-speculatively
                   -fexpensive-optimizations
                   -fgcse -fgcse-lm
                   -fhoist-adjacent-loads
                   -finline-small-functions
                   -findirect-inlining
                   -fipa-cp
                   -fipa-bit-cp
                   -fipa-vrp
                   -fipa-sra
                   -fipa-icf
                   -fisolate-erroneous-paths-dereference
                   -flra-remat
                   -foptimize-sibling-calls
                   -foptimize-strlen
                   -fpartial-inlining
                   -fpeephole2
                   -freorder-blocks-algorithm=stc
                   -freorder-blocks-and-partition -freorder-functions
                   -frerun-cse-after-loop
                   -fsched-interblock -fsched-spec
                   -fschedule-insns -fschedule-insns2
                   -fstore-merging
                   -fstrict-aliasing -fstrict-overflow
                   -ftree-builtin-call-dce
                   -ftree-switch-conversion -ftree-tail-merge
                   -fcode-hoisting
                   -ftree-pre
                   -ftree-vrp
                   -fipa-ra

O3优化

O3选项访问编译器提供的最高级别。整合了O1和O2,还提供了非常专门的附加优化技术。

-finline-functions
-funswitch-loops
-fpredictive-commoning
-fgcse-after-reload
-ftree-loop-vectorize
-ftree-loop-distribute-patterns
-fsplit-paths
-ftree-slp-vectorize
-fvect-cost-model
-ftree-partial-pre
-fpeel-loops
-fipa-cp-clone

这些大家可以在

《Using the GNU Compiler Collection》中查看到。

第77部分- Linux x86 64位汇编 优化编译器代码相关推荐

  1. 第19部分- Linux x86 64位汇编GDB单步调试

    第19部分- Linux x86 64位汇编GDB单步调试 本篇我们使用gdb来调试上篇中的汇编代码. gdb调试 使用gdb进行调试. #gdb ./addsum_arg 设置参数: (gdb) s ...

  2. 第41部分-Linux x86 64位汇编MMX使用

    第41部分-Linux x86 64位汇编MMX使用 使用MMX架构需要一下步骤 从整数值创建打包整数值 把打包整数值加载到MMX寄存器中 对打包整数值执行MMX数学操作. 从MMX寄存器获得结果放到 ...

  3. 栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(二)shellcode

    shellcode 是一组指令opcode, 是可以被程序运行,因为shellcode是要直接操作寄存器和函数,所以opcode 必须是十六进制的形式. 既然是攻击,那shellcode 主要的目的是 ...

  4. Mac OS X下64位汇编与Linux下64位汇编的一些不同

    1 首先系统调用号大大的不同:mac64和linux32的系统调用号也不同(虽然局部可能有相同) 2 mac64的系统调用号在: /usr/include/sys/syscall.h 可以查到,但是调 ...

  5. 64位汇编之linux系统调用

    linux系统中64位汇编和32位汇编的系统调用主要有以下不同: (1)系统调用号不同.比如x86中sys_write是4,sys_exit是1:而x86_64中sys_write是1, sys_ex ...

  6. 虚拟机上安装 Red Hat Enterprise Linux 7 64位

    一 .准备 1)可以支持64位 电脑一台: 2)安装VMware Workstaition 10及以上版本: 3)下载Red Hat Enterprise Linux 7 64位镜像: 二.安装 1) ...

  7. arm linux 64位,微软准备让Linux作为64位ARM Hyper-V客户机运行

    原标题:微软准备让Linux作为64位ARM Hyper-V客户机运行 虽然微软的Hyper-V虚拟化管理程序和他们的Azure云在很大程度上是以x86_64为中心的,但随着Linux 5.13内核的 ...

  8. visual studio 64位汇编 listing列表文件

    编写64位汇编与32位汇编步骤一样,但要增加一步 右键项目找到属性弹出窗口,如下图所示 在visual studio中生成列表文件 右键项目找到属性弹出窗口,如下图所示

  9. 查看linux是不是64位的命令

    方法1: 查看linux是不是64位的命令: #file /sbin/init 结果会出来 xx bit 方法二: # getconf LONG_BIT 32 getconf命令还可以获取系统的基本配 ...

最新文章

  1. set_origin_pose算子说明
  2. granfana telegraf influx安装与使用
  3. Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解
  4. NOI入门级:排序算法
  5. 正则表达式2-测试代码
  6. 服务应用监控健康检测
  7. kubernets 集群和本地环境联调环境打通工具kt-connect
  8. python newbie——PE No.3
  9. [转自他人]一款好用的软件安装管理器
  10. PxCook安装文件有问题处理办法
  11. 天使之火Angelfire:CIA入侵Windows系统的恶意软件
  12. 流浪是对另一种生活的执着
  13. 为什么会用到浅拷贝和深拷贝
  14. 机器自动翻译古文拼音 - 十大宋词 - 声声慢 寻寻觅觅 李清照
  15. python学习记录——容器篇
  16. Tensorflow2.0版本下如何实现Kronecker积
  17. 日常生活中使用的台式计算机,台式电脑鼠标不动应该怎么办
  18. Github每日精选(第48期):SQLite下的知识库memos
  19. 用CSS实现圆环倒计时
  20. nmap工具介绍及常用命令

热门文章

  1. python如何剪辑音频_剪辑音乐要很久?3行语句Python瞬间搞定
  2. 怎么取消苹果手机自动续费_探探怎么取消自动续费
  3. 基于java springboot框架开发机动车驾驶员计时培训监管系统平台
  4. Android 不归路之百度地图API学习(导航篇)
  5. Delphi 读XML文件
  6. vue路由传参的方式
  7. python新建项目没有venv_pycharm配置venv虚拟环境
  8. 怎么连别人虚拟机里面的数据库_VMWare Workstation 虚拟机软件常见使用技巧(2)...
  9. ts实现去除字符串空格
  10. html表格设置静态数据,构建静态页面 之 [ 表格 ]