您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 汇编语言差异比较——从X86到ARM
第22期2019年8月江苏科技信息JiangsuScience&TechnologyInformationNo.22August,2019汇编语言差异比较——从X86到ARM过怡,刘文芝(苏州市职业大学计算机工程学院,江苏苏州215104)摘要:文章从5个方面比较了教学中普遍采用的两种CPU——X86CPU和ARMCPU的差异。X86作为典型的CISC计算机汇编语言,指令系统复杂,主要应用于通用计算机中。ARM采用嵌入式系统中广泛采用的RISC结构,多应用于嵌入式领域〉只有采用比较的学习方法才能更好地掌握不同处理器的特点及应用需求,更有利于实际的系统开发,关键词:X86;ARM;CPU;指令系统中图分类号:TP393.1文献标志码:A0引言嵌入式应用技术专业通常开设的第一门和底层硬件相关的专业基础课程就是“汇编语言与接口技术”,讲解X86体系结构中,CPU的内部编程结构和PC机主板上的接口控制。随着学习的深入,会进一步开设51单片机或者STM32单片机课程,讲授单片机内部编程结构和接口开发技术。为了配合Linux操作系统和Android操作系统底层驱动及中间件开发,还会进一步开设精简指令集架构(AdvancedRiseMachines,ARM)CortenxA系列处理器课程,讲授ARM内核控制器芯片的编程结构和接口开发技术。处理器的技术发展迅速,各种处理器都有各自的优缺点。下面针对教学中普遍采用的X86(8086/8088)处理器和ARM处理器进行体系结构和指令系统的比较。1体系结构的差异X86CPU采用冯诺依曼体系结构,数据和程序存储在同一个存储器中,指令和数据使用相同的总线访问.无法实现同时取指令和取数据,总线访问成为系统的瓶颈。在单片机和嵌入式系统中,由于程序和数据共用同一个存储器,导致程序空间不封闭,程序空间的数据在运行期间可以也可能被修改,程序跑飞可能会修改数据空间,造成严重后果。ARM的CPU除了ARM7采用冯诺依曼体系结构外,后面的产品都采用哈佛体系结构。程序和数据采用各自独立的存储器,指令和数据有各自的总线,在处理器高速运行时,大大提高了存储器带宽,提高了访问速度。由于程序和数据的存储空间是独立的,程序空间是封闭的,代码不会被改写,程序只能在封闭的代码空间运行,即使跑飞也不会对数据空间造成影响,从而也大大降低了代码跑飞的概率和跑飞后造成的后果叫图1和图2分别为冯诺依曼体系结构和哈佛体系结构的框架。图1冯诺依曼体系结构2寄存器使用的差异X86CPU的可编程寄存器分为通用寄存器和专用寄存器两大类,其中.通用寄存器包括:AX,BX,CX.DX,SI,DI,BP,SP;专业寄存器包括:FLAGS,IP,CS,SS,DS,ES,每个寄存器都有各自特定的功能,名称也是特定功能英文的缩写。例如,AX是在算数及逻辑运算中担任累加器的功能,累加器的英文名称是Accumulator,因此,命名为AX海个寄存器的具体功能,如图3所示。由于每个寄存器的命名和功能都不同,因此,初学者必须在学习初期记忆每个寄基金项目:苏州市教育科学“十三五”规划2019年度课题;项目名称:新工科背景下网络教学资源建设与学生自主学习的研究与实践;项目编号:SZDJG-1900L作者简介:过怡(1977—),女,江苏苏州人,副教授,硕士;研究方向:计算机应用技术,嵌入式系统。-39-第22期2019年8月No.22August,2019江苏科技信息•基础研究存器的功能特点,为今后的使用做准备。»数為存器\殿篩器组}酬雋存鞠图38086/8088CPU内部寄存器ARMCPU内部拥有的寄存器较多,共有37个寄存器,其中,31个为通用寄存器,6个为特殊功能寄存器,即状态寄存器⑷。尽管寄存器较多,但是寄存器的命名很有规律,通用寄存器R0-R15,R就是寄存器register的首字母,除了R13作为堆栈指针,R14作为程序链接寄存器,R15作为程序计数器外,其他的寄存器在使用上没有特殊要求,因此更易于学习和使用。状态寄存器为CPSR和SPSR.SPSR为CPSR的备份,旨在提高异常发生时的响应速度。主要使用的CPSR与X86CPU类似,也是按位来使用的,分为状态标志(条件码标志)和控制标志,在状态标志中只保留了常用的NZCV这4位,去掉了使用频率较低的PF和AF。控制标志中同样包括中断禁止位,但是由于ARM内核有2个中断(IRQ和FIQ)所以有2位中断禁止位,由于ARM内核有2种指令状态,因此增加了指令状态位,ARM内核有7种工作模式,又增加了5位模式位方便进行CPU模式的切换。不同的CPU都为根据自身的特点来设置状态寄存器的位。3寻址方式的差异X86采用复杂指令集(CISC指令集),所有指令都可以访问存储器,指令不等长,执行的时间也不等长,对旧的指令集有很好的兼容性,从而使指令的解码系统越来越复杂⑷。而ARM是采用精简指令集(RISC指令集),只有load/store指令可以访问存储器,其他指令是不能访问存储器的,指令是等长的,大部分算术运算和逻辑运算指令都是单周期执行,执行效率较高⑷。对于堆栈和数组的访问方式差异较大:X86只能一个数据一个数据地入栈和出栈,在访问连续存储空间时也只能以间接寻址的方式一个数据一个数据地读或写,程序必须手动更新指针寄存器的值,效率较低。例如:PUSHAX〃人栈1个寄存器POPAX〃出栈1个寄存器MOVAX,[SI]〃装载1个寄存器INCSI〃手动修改指针MOV[D1],AX〃存储1个寄存器而ARM对于堆栈和数组这类连续存储的存储器空间都可以批量访问,最多可以使用16个寄存器进行数据读和写,即16x32位的数据同时入栈或出栈,16x32位的数据同时从数组中批量次地读或写。并且在ARM中为了方便批量操作,提供了“!”运算符,可以在指令中加入“!”让系统执行完指令后自动修改指针。这样大大提高了效率。例如:STMFDSP!,{R4-R7,LR}//入栈8个寄存器,堆栈指针SP自动更新LDMFDSP!,{R4-R7,PC}〃出栈8个寄存器,堆栈指针SP自动更新LDMIAR12!,{R0-R11}//装载12个寄存器,指针R12自动更新STMIAR13!,{R0-R11}//存储12个寄存器,指针R13自动更新4指令的差异X86指令和ARM指令都由操作码和操作数两部分组成,X86指令大部分是两个操作数,而ARM指令大部分是3个操作数。X86指令中只有跳转指令可以加条件码,成为条件转移指令,当条件成立,例如运算结果为0,有进位、有借位、有溢出时实现程序的跳转。其他所有的指令都不能有条件执行,因此,分支、循环结构都要借助于这类条件转移指令实现。这样增加了汇编代码长度和设计难度,同时,也使汇编代码结构性较差。ARM指令所不同的是不仅是跳转指令后可以加条件码,大部分常用的ARM指令后面都可以加条件码,成为有条件执行指令,也就是MOV,ADD,AND这类常用指令后都可以加条件码,这样使ARM汇编程序设计更灵活,不需要频繁跳转。同样的功能,ARM汇编需要的指令比X86汇编需要的指令更少,结构性更好。例如:if(a==0)x=0;if(a0)x=l;实现上述程序,分别用X86和ARM汇编代码实现如下:X86汇编代码CMPAX,0//AX存储a-40-第22期2019年8月No.22August,2019江苏科技信息•基础研究JZEQJGGJMPOTEQ:MOVBX,0〃BX存储xJMPOTG:MOVBX,1OT:...............ARM汇编代码:CMPRO,#0//RO存储aMOVEQRl,#0//Rl存储xMOVGTRl,#l比较发现ARM汇编代码更简洁,结构性更好。X86指令执行完对于FLAGS标志寄存器中状态标志的影响是固定的,例如MOV指令不影响状态标志位。AND,OR,XOR,TEST指令均设置CF=OF=0,根据结果设置SF,ZF和PF状态,而对AF未定义。由于每条指令对标志位的影响不同,初学者必须要熟练记忆,增加了学习的难度。ARM指令执行完对标志位的影响是通过在指令后加S来实现的,是否加S是由程序员决定的,程序员根据代码的需要在指令后加S,使指令执行后将结果状态反应到状态寄存器中。如果指令后不加S,即使是ADD,SUB这种指令执行完也不会修改状态标志,从而减少了需要记忆的内容,代码控制更加灵活。例如:ADDR0,R0,Rl〃R0+Rl-R0,不修改条件标志SUBSRO,R0,#200//R0-200-R0,修改条件标志5子程序调用差异X86的子程序定义要用函数伪指令定义,格式如下:函数名PROC[NEAR/FAR]……过程体函数名ENDP函数之间调用采用CALL指令,即CALL子函数名即可,子函数返回使用指令RET。CALL指令的功能是首先保存返回地址到堆栈,然后修改程序计数器为子程序地址,跳转到子程序执行。RET指令的功能就是从堆栈中弹出返回地址给程序计数器,从而回到被调用程序继续往下运行。统一的函数定义及调用方式使代码的可读性较好,但是向程序员掩盖了函数调用和返回的具体细节。ARM的子程序没有独特的定义格式,函数名只是一个标号(Iable)和其他标号没有什么区别,函数调用采用BL指令,即BL子函数名,子函数返回使用MOV指令,即MOV,PC丄4BL指令的功能首先保存返回地址到LR链接寄存器中,然后修改程序计数器PC,使CPU跳去执行子程序的代码。返回指令非常直接,就是将保存的返回地址还给程序计数器PC,使CPU回到被调用程序继续往下执行。以下为求最大公约数的X86函数和ARM函数汇编代码,两个代码比较发现,X86函数代码格式清晰、可读性好,ARM函数代码简洁,但是与其他程序一起时结构不够清晰。X86汇编函数GCDPROCGCDBEGIN:CMPAX,BXJZGCDENDJBBLOWSUBAX,BXJMPBEGINBLOW:SUBBX,AXJMPBEGINGCDEND:RETENDPARM汇编函数GCDBEGIN:CMP0,rlSUBLTrl,rl,rOSUBGTrO,rO,rlBNEBEGIN6结语X86CPU采用冯诺依曼体系结构,指令和数据存储在同一个存储器中,指令和数据只能采用相同的宽度,并且总线在同一时刻只能传递一种内容,指令或者数据,速度受限。ARMCPU采用哈佛体系结构,指令和数据采用不同的存储器,因此,指令和数据可以采用不同的数据宽度,并且总线操作较快。X86CPU是采用CISC指令集,拥有丰富的指令,每一代新的CPU为了保持对前期产品的兼容,会在保留原有指令的基础上扩展新的指令,导致指令系统越来越复杂,但是程序员有更多可选择的指令。ARMCPU采用RISC指令集,只保留常用的指令,指令结构简单,程序员可选择的指令也少。随着高级语言不断发展,作为低级语言的汇编语言的应用场合逐渐减少,但是在操作系统的部分内核代码,无操作系统的启动代码,软件系统中对运行效率有要求的部分代码,仍然采用汇编语言编写,尤其在嵌入式领域汇编还是有着重要的作用,因此,有效地掌握和使用不同CPU的汇编语言有着重要的实际意义。参考文献[1]马忠梅,徐慧英.ARM嵌入式处理器结构与应用基础[M].北京:机械工业出版社,2002.[2]钱晓捷.16/32位微机原理、汇编语言及接口技术教程[M].北京:机械工业出版社,2011.[3]马忠梅.ARM&Linux嵌入式系统教程[M].3版.北-41-第22期2019年8月No.22August,2019江苏科技信息・基础研究京:北京航空航天出版社,2014.[4]百度百科.复杂指令集[EB/O叮・(2012-10-11)[2019-08-10].=aladclin.[5JSLOSSA,DOMINICS,CHRISW,etal.ARM嵌入式系统开发一软件设计与优化[M].沈建华,译.北京:北京航空航天出版社,2005.(
本文标题:汇编语言差异比较——从X86到ARM
链接地址:https://www.777doc.com/doc-8590349 .html