在TopLanguage里断断续续待了一年多,对里面的谈话终于不再是一知半解,
许多题也许自己也有很好的思路,人总是还会有进步的吧。
本来提手写篇博文,准备聊一聊在俱乐部的事情,说一说自己的事情,听一听歌,想一想代码。
不过现在有点疲倦,而且这状态写正紧的事情不太妥当,于是还是扯一扯小故事吧。
在TopLanguage里断断续续待了一年多,对里面的谈话终于不再是一知半解,
许多题也许自己也有很好的思路,人总是还会有进步的吧。
本来提手写篇博文,准备聊一聊在俱乐部的事情,说一说自己的事情,听一听歌,想一想代码。
不过现在有点疲倦,而且这状态写正紧的事情不太妥当,于是还是扯一扯小故事吧。
1. GCC按照自己的格式形成汇编代码并解释(GAS:Gnu Assembler),这一点与我们常学的MASM编译有差异:
A. movl 12(%ebp), %eax 表示 %ebp偏移12位置值送%eax ,事实上GCC汇编目的地址在右边。
B. 目标文件(如: code.o) 是对独立文件编译汇编的结果。
C. 产生目标文件后通过链接使程序整合成完整的机器级代码,也就是可执行文件。
D. 简单的打个比方“01 05 64 94 04 08” 表示“add %eax, 0x8049464” 你会发现地址是反着放的。
2. 不用争字究竟多长了,其实Intel开始从16位体系扩展成32位体系时,一直把“字(word)” 表示16位。
对于多数32位机器“经典”的分配方式,“short int”整数分配2字节,“int” 分配4字节, “long int” 分配全字长。
然而这样分配是GCC的约定,至于GAS:
A. GAS 中的 movb, movw, movl, 分别移动字节,字,双字。
B. GAS中的 %eax, 表示 寄存器AX的Extend(?),也就是32位的AX。
C. Imm(Eb, Ei, S) 是一种寻址模式,调用立即数Imm, 基址寄存器Eb,
变址或索引寄存器Ei 和 伸缩因子(scale factor Ps:必须是1.2.4.8之一)
操作数值 M[Imm + R[Eb] + R[Ei]*s],
R[Ei]表示对寄存器取值, Mb[Addr]表示对内存取b长度值(这里省略b)
D. GAS同样规定不能两个操作数同时访问内存。
E. 指针保存的地址信息使得程序像低级代码一样灵活。
F. 大部分人都会头大一下 Leal 7(%edx, %edx, 4), %eax 这样的指令,其实他只是将5*%edx+7 –》 %eax,
很简单的理由是你实在没办法对%edx加载有效地址。
G. 有关GAS的特殊指令(如64位乘,除法等),有兴趣参考相关资料,这里就不特别说了。
下次开始阅读程序流控制汇编码。
原文出处:新东方
1. aboard adv. prep. 在船(车/飞机)上, 上船(车/飞机)
board n. 木板, 董事会 (包饭的)伙食 vt.上(船,车等)
abroad adv. 国外, 海外
broad adj. 宽的,广阔的,广泛的
2. abstract adj. 抽象的 n. 摘要,梗概
subtract vt. 减去(from)
attract vt. 吸引:be attracted to 迷恋,喜欢
3. accent n. 口音,重音
access n. 接近(或进入)的,机会,通道,入口
excess n. 超过,过量 adj.过量的,额外的
assess vt. 对…进行估价,评价
asset n. 财产,资产
exception n. 例外
by Elizabeth Barrett Browning.
How do I love thee? Let me count the ways.
I love thee to the depth and breadth and height
My soul can reach, when feeling out of sight
For the ends of Being and ideal Grace.
I love thee to the level of every day’s
Most quiet need, by sun and candlelight.
I love thee freely, as men strive for Right;
I love thee purely, as they turn from Praise.
I love with a passion put to use
In my old griefs, and with my childhood’s faith.
I love thee with a love I seemed to lose
With my lost saints, I love thee with the breath,
Smiles, tears, of all my life! and, if God choose,
I shall but love thee better after death.
| FFFFFF | #DDDDDD | #AAAAAA | #888888 | #666666 | #444444 | #000000 |
| #FFB7DD | #FF88C2 | #FF44AA | #FF0088 | #C10066 | #A20055 | #8C0044 |
| #FFCCCC | #FF8888 | #FF3333 | #FF0000 | #CC0000 | #AA0000 | #880000 |
| #FFC8B4 | #FFA488 | #FF7744 | #FF5511 | #E63F00 | #C63300 | #A42D00 |
| #FFDDAA | #FFBB66 | #FFAA33 | #FF8800 | #EE7700 | #CC6600 | #BB5500 |
| #FFEE99 | #FFDD55 | #FFCC22 | #FFBB00 | #DDAA00 | #AA7700 | #886600 |
| #FFFFBB | #FFFF77 | #FFFF33 | #FFFF00 | #EEEE00 | #BBBB00 | #888800 |
| #EEFFBB | #DDFF77 | #CCFF33 | #BBFF00 | #99DD00 | #88AA00 | #668800 |
| #CCFF99 | #BBFF66 | #99FF33 | #77FF00 | #66DD00 | #55AA00 | #227700 |
| #99FF99 | #66FF66 | #33FF33 | #00FF00 | #00DD00 | #00AA00 | #008800 |
| #BBFFEE | #77FFCC | #33FFAA | #00FF99 | #00DD77 | #00AA55 | #008844 |
| #AAFFEE | #77FFEE | #33FFDD | #00FFCC | #00DDAA | #00AA88 | #008866 |
| #99FFFF | #66FFFF | #33FFFF | #00FFFF | #00DDDD | #00AAAA | #008888 |
| #CCEEFF | #77DDFF | #33CCFF | #00BBFF | #009FCC | #0088A8 | #007799 |
| #CCDDFF | #99BBFF | #5599FF | #0066FF | #0044BB | #003C9D | #003377 |
| #CCCCFF | #9999FF | #5555FF | #0000FF | #0000CC | #0000AA | #000088 |
| #CCBBFF | #9F88FF | #7744FF | #5500FF | #4400CC | #2200AA | #220088 |
| #D1BBFF | #B088FF | #9955FF | #7700FF | #5500DD | #4400B3 | #3A0088 |
| #E8CCFF | #D28EFF | #B94FFF | #9900FF | #7700BB | #66009D | #550088 |
| #F0BBFF | #E38EFF | #E93EFF | #CC00FF | #A500CC | #7A0099 | #660077 |
| #FFB3FF | #FF77FF | #FF3EFF | #FF0 0FF | #CC00CC | #990099 | #770077 |
CS:APP 终于挺进了第三章,开始机器级代码优化的故事了,
因为现在大部分时间在windows下,手上没有顺手的环境,(虽然重要部分还是会去linux)。
还是谈谈Eclipse下打开优化开关的方法吧。
1.新建工程,这里取GAStest (GAS == GnuAsembler GNU汇编器)
2.修改代码
int accum = 0;
int sum(int x, int y)
{
int t = x + y;
accum += t;
return t;
}
int main()
{
return 0;
}
3. 编译,F11进入Debug模式,打开Disassembly视窗(Window->Show view)
上面的例子说明编译器编译 219ms, 产生机器指令16条(大约? 没细看)
4. 进入project选项,C/C++ Build –> setting –>tool setting –> Optimization 选择 –O2
注意使用编译器优化不是随便弄的,谨慎使用,
对大型project使用编译器优化可能会产生不可预料的错误。
5. 重复3.
上面的例子说明编译器编译 322ms, 产生机器指令10条。