那年声明理解不了定义与初始化
- MD建档:2/5/2016 7:36:43 PM by Jimbowhy
- CSDN系列发布:
- http://blog.csdn.net/WinsenJiansbomber/article/details/50641687
- http://blog.csdn.net/WinsenJiansbomber/article/details/50646981
本文开编的时候,预想只要一篇写完就可以舒服过年的,万万没想到,太多内容联系太深,不写显得不够完整。于是写写就上了瘾,听着林海的《让爱》,就当两篇来写;听着罗大估的《现象II》、听着比才的《卡门》,写着写着,就成了三篇,结果整个春节都变了另一种味道。Markdown,我中毒太深了。
第一部分内容
- 编程之外
- 追逐简单美
- 编程之内
- 回顾微机原理-浮点数
神秘角色-机器码
在学汇编的时候,有种极其想深究汇编指令背后的事情,可是书上没有资料。这种感觉在开始学习C语言的时候已经开始了,看着函数符号在那,一组括号想要结果就回来了,究竟计算机背后在干些什么勾当呢?十分渴望接触到最原本的东西。
可惜的事,我在大学时已经翻到了 Intel 在网络上发布的 CPU手册了,但是每天时间好像总是不够24小时一样,时间都去哪了呢!谁知道!机器指令构造的事直到后来工作后才补上,其实,随着时间的前行,很多时候,以前一直想做的事会慢慢变得淡漠,到后来也不见得会有机会再拿起来。
这里简要地分解一下x86机器码的构造,因为不同的CPU设计体系,它的机器码结构都不一样。x86这种结果的CPU在PC中是数量最多的,它具有代表意义。其实知道机器码可以做什么呢?开始接触机器硬件,对于从事软件的人员来说是可以完全忽略的事。但如果是从事底层软件的人,这是必修课。知道机器码的构造,就可以通过算法来实现自己的编译器,将高级的语句编译成为机器理解的二进制机器码,想想这都让人兴奋不已。
谈CPU的都要涉及到x86,这是因为 x86 CPU 的开发标志着计算机进入高速发展的时代!而提到 x86 CPU 又要追溯到 CPU 的始祖 Intel 4004,如果让我看到真实的 4004 芯片,怕我肯定难以相信,就是这样一块16脚双列直插式的集成芯片改变我的一生。intel 4004 CPU 纪念馆 说到,1969 当时 Intel 公司接到一单生意,为 Nippon 计算器公司设计12块集成电路,而 Intel 的工程师建议设计4块,其中一块是可编程芯片,最后那块可编程芯片就成了改变世界的原力,Intel impacting the World!
当我看到 AMD-K5 CPU 的图片时,不禁想起当年,为什么别人都说 Windows 是装在电脑里面的了:{},只是我没有听到别人说 Windows 95 窗口图案上面还有一行字“Design for”。
1971年 Intel 正式研发出 Intel® 4004 的时候,集成电路规模是 2,300 晶体管,主频0.74MHz,运行的频率为108KHz。到了 2010,Intel® Core™ 32纳米技术的酷瑞CPU出现时,晶体管数量已经是 5.60亿个,差距是50万倍,运行速度则上 GHz 数量级(1GHz=1000Mhz)。Intel 于 1978 年所设计的第一款 16 位微处理器 Intel® 8086,则是 40,000 晶体管规模,它是 x86 架构的鼻祖,随后出现的 286、386、486、586 就像魔法一样吹到世界的每个角落。
电路的尺寸上,Intel® 4004 的只有 10 微米宽,等于 10,000 纳米 ,1 microns=1000 nanometers。今天的工艺水平已经到达几米纳米,而作为对比,人类头发丝的直径为 100,000 纳米,那就是几千分之一的水平。
那是个逻辑电路的时代,像日本任天堂 (任天堂株式会社,Nintendo かぶしきがいしゃ),就是凭借着集成电路,开发出了风靡全球的红白机,从1985年开始的那个年代的记忆就是顶蘑菇、魂斗罗。只是背后的东西属于另一个世界,在流行书信的年代,资讯是匮乏的。当我们拆开机盒,看得到的只是几个电零件,还有所有电路都汇集到一块的那个黑点。那个年代,别人在制造机器,我们只能拆拆变压器,连连电阻,玩三极管。
随着技术的发展,新的CPU指令不断被开发出来,旧有的在 8086 上使用的那套指令就成了流行的 x86 指令集。1996年,Intel 又开发出 MMX(Multi Media eXtensions)多媒体扩展指令集,SIMD(Single Instruction Multiple Data)单指令多数据指令集,伴随 MMX 到来的就是多媒体电脑时代,多媒体这个概念不知道吸引了多少爱好者为其发高烧!1999年,SSE(Streaming SIMD Extensions)流式单指令多数据扩展指令集随着英特尔在Pentium III处理器推出,将矢量处理能力从64位扩展到了128位,数据处理量成倍的增长。
到现在,Intel 在 2010 年通过代号为 Sandy Bridge
的处理器带来全新的指令扩展集 AVX (Intel Advanced Vector Extensions),将 SSE 的 128bit 矢量处理能力扩展到256bit,其重要性堪比1999年 Pentium III 引入SSE。
Intel 将这些指令的信息编制成手册,透过网络以PDF文件的形式发布,手册的第二卷就是指令参考 Instruction Set Reference,其中第二章讲的就是指令的格式。Intel 还提供了一个以C++实现的高组指令库,Intrinsics
,通过它可以很方便地在开发过程中以函数的方式来调用这些高级的指令。在线手册地址 Intel Intrinsics Guide,它是交互式指令速查手册。
在开始分解指令之前,讲讲CPU的运行模式,第一块16位CPU生产出来的时候,即8086是可以寻址1MB内存的,由于机器是16位的,总线应该是16位,可以寻址的内存就是 2^16=64KB,但最后采用20位地址总线来实现1MB的寻址能力。在16位机上,寄存器只有16位,这多出来的4位地址信息怎么办呢?解决办法就是增加一个寄存器,使用两个寄存器来实现20位的地址信息,所以就产生了地址分段的概念,相应的寄存器就称为段寄存器了。在初期设计的CPU是没有内存保护概念的,程序基本上想怎么使用内存就怎么用。到1982年,80286 CPU出来的时候,就有了内存保护机制,程序再不能任意使用内存,因此把CPU的这种模式称为保护模式 Protected mode,而 8086 那种工作方式就称为实地址模式 Real Address Mode,也简称为实模式。80286 作为新一代CPU,它为旧的16位程序提供兼容,旧程序在它上面运行就像在旧式的CPU一样,所以这种兼容能力就被称为虚拟8086模式 Virtual-8086 Mode,简称为虚拟86模式。PC电脑CPU的架构经过了前期的 x86,到后又出现 x86-64、IA-32 和 IA-64等等架构,x86-64 是AMD研发的64位CPU。IA-32 是x86 体系中的32位架构,较新的 IA-32 CPU 提供了64位支持,称为 EM64T (Extended Memory 64 Technology),也称为 IA-32e(Intel Architectur-32 extension) 工作模式。在 IA-32E 模式下又分为兼容模式和 64-bit 模式,前者可以使用64位系统平滑兼容保护模式的程序,后者则支持64位系统运行程序请问 64-bit 内存空间。
神秘角色-机器码结构
来看一幅简图吧,一条经典的汇编指令格式会按如下的方式编写,可以将它进行拆解分不同的零件:
mov word ptr es:[eax + ecx * 8 &#