Project1

标题: 关于gcc编译器优化 [打印本页]

作者: SixRC    时间: 2017-12-13 21:34
标题: 关于gcc编译器优化
本帖最后由 SixRC 于 2017-12-13 21:37 编辑

最近因为更新了编译器发现一堆新东西
其中之一就是
gcc 有一个优化选项是跳指令的对齐
比方 jmp 到的地方从 0x1A 优化为 0x1C
可能就是在目标指令前前面加一条
lea esi,[esi]  指令 正好两字节
这条指令还可以翻译成三字节 四字节 六字节 (其余?)
但是 我不懂
这样能提高效率吗...
因为寻址的关系所以对齐?
还有的情况是从 0xB 加了 nop 和 lea esi,[esi] 对齐到0x10
开 -O1 不会有这种跳的对齐 开 -O3 就会有
不懂不懂不懂
求指教
想不通想不通想不通

或者说是 在大的循环前面对齐
所以加快后面重复回跳的速度?


作者: defisym    时间: 2017-12-13 22:19
我们老师倒是更喜欢使用
XOR AX,AX来清空AX寄存器
老师对此的解释是,这样翻译成机器码更短,执行起来速度更快

寻址方面大概还有奇偶地址对齐的问题在吧
还在学习中,希望能够有大神来解释下(比如黄鸡dalao
@fux2
@guoxiaomi
打扰啦~
作者: SixRC    时间: 2017-12-14 10:35
大致了解了
intel有指令预读取
每次16字节 然后送去解码执行
假如跳转分支没有对齐
那么只能预读取到下一个对齐点
导致喂不饱指令执行器
所以循环最好16字节对齐
作者: 不死鸟之翼    时间: 2017-12-14 13:11
所以手写汇编不一定有编译器做出来的快)
据说intel编译器还有蜜汁加成
作者: guoxiaomi    时间: 2017-12-14 13:13
我不懂汇编,只会一点ruby和php without sql……

我其实是学物理的 ( x

作者: fux2    时间: 2017-12-14 17:49
我从来不关心对齐方面的东西(x
毕竟为了对齐多塞指令也不见得比不对齐的快,再说这么一点程度的优化估计解决不了什么问题(x
作者: chd114    时间: 2017-12-14 21:25
对齐这种事情只要开发者开心就好···
作者: 寒冷魔王    时间: 2017-12-22 23:22
本帖最后由 寒冷魔王 于 2017-12-22 23:24 编辑

最近刚做完一个 外部函数接口的 FFI 项目(的x64分支)。所以对 x64 的函数调用方面比较了解。

LZ 说的是指令读取方面的对齐要求,其实在栈的方面也有类似要求。

x64 下面,在调用函数的时候,必须保证栈16字节对齐。
这个在 MS64 和 SysV64 的 ABI 下都是有强制规定的。

具体可以参考 https://en.wikipedia.org/wiki/X86_calling_conventions

话说楼主对这个项目感不感兴趣? 地址 我需要苦力同伴来完成其他平台上的内容。





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1