明学的白板 2017-12-24
3.2 程序编码
计算机机器级编程重要的两类抽象:
第一种是将机器级程序的格式和行为抽象形成instruction set architecture,即ISA(指令集体系结构)。
对于ISA,要有以下基本观念:IA32的ISA和x86-64的ISA,在抽象时都将指令按顺序执行抽象。但是处理器的硬件可以并发地执行许多指令,并且采用了一些保护措施来确保并行执行之后的结果和一条一条顺序执行的结果一样。
第二种是将整个计算机中的存储器地址用虚拟地址来抽象,使得存储器地址是一个非常大的字节数组。这个抽象对应的实际计算机基础是一些分离的硬件存储器和操作系统软件。
操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器中的物理地址。
当一个源文件生成了'.o'的目标二进制文件后,无法直接查看。
但是还是有个查看目标代码文件内容的方法,就是对'.o'目标文件使用反汇编器(disassembler)。它的输出还是二进制文件,但是,反汇编器将这些二进制按照指令进行了分段,让我们知道哪一段是一个指令(格式上与汇编器产生的汇编文件一样)。
关于ISA的指令(以IA32为例),我们要有以下基本观念:
3.3 数据格式
由于是从16位体系结构扩展成32位,intel用术语字(word)表示16位数据类型,因此32位为双字(double words),64位数为4字(quad words)。
以下是比较容易模糊的数据类型大小:
32位机上:float 4、long int 4、double 8、longlong 8、char* 4、unsigned long 4 64位机上:float 4、long int 8、double 8、longlong 8、char* 8、unsigned long 8
另外,GCC 用long double表示扩展精度(10字节),出于存储器性能考虑,会被存储为12字节
3.4访问信息
一个IA32 CPU包含一组8个存储32位值的寄存器,用以存整数数据和指针:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp。大多数情况下前六个都用作通用寄存器,%eax,%ecx,%edx的保存和恢复惯例不同于%ebx,%edi,%esi;最后两个用于存储指针,由于在过处理中非常重要,分别指向栈帧的顶部和底部。
操作数指示符
大多数指令有一到多个操作数,操作数有三种:
立即数:即常数值 寄存器:表示某个寄存器内容 存储器引用:根据计算出来的地址(通常称有效地址)访问某个存储器位置
因此寻址方式也有多种,如:立即数寻址、寄存器寻址、绝对寻址、间接寻址、变址寻址、比例变址寻址……
数据传送指令
几个重要数据传送指令:MOV类、pop、push。
MOV类,movb传送字节、movw传送字、movl传送双字,MOVS、MOVZ分别为符号扩展、零扩展,它们只拷贝一个字节,源操作数均为单字节,并设置目的操作数中其余的位,效果如下:
初始假设:%dh=CD %eax=98765432
1 movb %dh,%al ;%eax=987654CD 2 movsbl %dh,%eax ;%eax=FFFFFFCD(目的操作数高24位设为源字节最高位,在这里很显然为1,所以前24位为全F) 3 movzbl %dh,%eax ;%eax=000000CD(目的操作数高24位被设为0)
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 75/75 | 1/1 | 5/0 | |
第二周 | 135/210 | 1/2 | 4/9 | |
第三周 | 234/444 | 1/3 | 6/15 | |
第四周 | 486/930 | 1/4 | 8/23 | |
第五周 | 753/1683 | 3/7 | 43/66 | |
第六周 | 503/2186 | 2/9 | 54/120 | |
第七周 | 823/3006 | 2/11 | 43/163 | |
第八周 | 756/3762 | 1/12 | 52/215 | |
第九周 | 1120/4882 | 3/15 | 63/278 | |
第十周 | 420/5302 | 0/15 | 32/310 | |
第十一周 | 531/5833 | 2/17 | 46/356 | |
第十二周 | 243/6076 | 0/17 | 20/376 | |
第十三周 | 359/6435 | 2/19 | 42/418 | |
第十四周 | 126/6561 | 1/20 | 22/440 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
参考:软件工程软件的估计为什么这么难,软件工程 估计方法
计划学习时间:XX小时
实际学习时间:XX小时
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)