3.4.3 ARM、MIPS之战
由于ARM公司和MIPS公司的商业模式相同,因此它们也经常被人们拿来作对比。很长一段时间内,在处理器本身的技术路线上,MIPS要强于ARM,但是在商业上,ARM要更强一些。
设计ARM的原始想法完全来自于MIPS研究小组发表的论文,两位优秀并敏感的英国工程师Sophie Wilson和Steve Furber看到论文后专门跑到美国去参观实习了一把,回去后就说服老板开始设计ARM1。ARM十几年磕磕碰碰走来,从ARM1一直做到现在的Cortex,其中有几个系列取得了巨大的商业成功:ARM7、ARM9、ARM11和Cortex。
一直到2000年前后,ARM和MIPS两个公司在业务规模上还是基本旗鼓相当的,差距出现在之后的IT泡沫破灭,MIPS的地盘在电信和网络市场,受到了惨重的打击。而手机日渐成为普通消费品,因此ARM的市场风生水起,从此这两家公司的差距增大。
人们买东西都会有一个特点:喜欢去人多的地方买。越拥挤,就会觉得店子越好,就越要挤进去。股市也有类似的一句话,叫:追涨杀跌。ARM这几年过的是越来越好,而MIPS的发展则相差甚远。
现在MIPS和ARM的市场定位有大量的重合,它们之间的竞争将会更加激烈。
3.5 汇编语言格式——没有规矩不成方圆
我对上帝说西班牙语,
对女人说意大利语,
对男人说法语,
对我的马说德语。
——查理五世,法国国王
有这样一个笑话:中国留学生在国外的高速公路出车祸了,连人带车翻下悬崖,交警赶到后向下喊话:“How are you?”留学生回答:“I’m fine, thank you.”然后交警就走了,留学生于是死了。
由此可见,语言是很重要的,程序员学习处理器的语言也是很重要的,一来可以更了解处理器,二来在某些领域,如从事破解的,都需要知道一些汇编知识。、
3.5.1 机器字长
机器字长表示处理器一次处理数据的长度,主要由运算器、寄存器决定,如32位处理器,每个寄存器能存储32bit数据,加法器支持两个32bit数进行相加。
x86指令集的鼻祖是1978年出的16位处理器8086,现在Intel的处理器都是32位/64位的了,但是仍然能兼容传统的16位汇编进行编程。
32位处理器的地址总线通常都是32位,可寻址范围是4Gbyte,地址总线越宽,可寻址范围越大。通常数据总线的带宽都要高于机器字长,32位处理器很多都采用64bit、128bit的数据带宽,这样可以一次读取更多的数据。
目前嵌入式处理器大都以32位为主,而服务器和PC已经进入了64位时代。最早将x86扩展到64位的并不是大哥Intel,而是小弟AMD。2003年,AMD 推出 Opteron(皓龙),这是第一款含 x86-64 技术的处理器。AMD x86-64完美的兼容性和不错的性能赢得了一片喝彩,Intel立即意识到了问题的严重性,并迅速推出了自己的64位架构——EM64T,总算是扳回了一局。
3.5.2 操作数个数
x86处理器由于设计时间很早,那个时候晶体管紧张,寄存器数目较少,因此指令集在设计时,只使用了两个寄存器:
ADD BX, AX;源和目的操作数共用一个寄存器。
Intel后来扩充了一些SSE指令,有些SSE指令也使用3个操作数,1个源操作数,1个目的操作数,还有1个操作数作为mask(掩码)使用。
后来的RISC指令集,基本运算都使用了3个操作数,2个源操作数,1个目的操作数:
ADD A1, A2, A3
3.5.3 操作数顺序
在x86处理器中,目的操作数放在前面,在C6000 DSP中,目的操作数放在最后。
x86指令格式:ADD BX, AX;表示将BX和AX的值相加,结果放到BX中。
C6000 DSP指令格式:ADD A1, A2, A3;表示将A1和A2的值相加,结果放到A3中。
MIPS指令集也是3个操作数,不过和C6000 DSP不同的是:目的操作数是第一个操作数。