assemble汇编语言设计技术_第1页
assemble汇编语言设计技术_第2页
assemble汇编语言设计技术_第3页
assemble汇编语言设计技术_第4页
assemble汇编语言设计技术_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ASSEMBLE汇编语言设计技术最近,我帮助朋友编写一个使用ASSEMBLE汇编语言的程序,接触了一些ASSEMBLE行业的开发工作者以及行业管理人员,在与他们合作和交流过程中发现,我国ASSEMBLE汇编语言设计技术根本性的变化,没有一个飞跃性的发展,ASSEMBLE汇编设计技术仍然处于落后的、不发达的国家。当然,我可能言过其实,ASSEMBLE汇编设计的工作者他们使用ASSEMBLE汇编语言设计了很多的产品,在各个领域运用ASSEMBLE汇编技术创造出辉煌的成绩,我们必须认可的,并向他们表示衷心问候。但是,当我完成这一篇文章,让我们从事ASSEMBLE汇编语言设计的朋友们阅读后,我们可以讨论我所表达的意思是否正确。我已经20年没有再深入地讨论过ASSEMBLE汇编语言设计问题了,非常有信心的相信我国的ASSEMBLE汇编设计技术这一方面发展应当进入世界同等水平发展,而且有层出不穷的更新的设计技术出现,可是当我再回头接触时,令人只有伤感。一、概述通常,我们知道计算机是由电子元器件组合而成的,主要是逻辑电路组成,因此计算机中真正可以处理的仅仅只是由“0”、“1”组成的状态码或者二进制编码,实际被称为指令代码。这种指令代码对于设计人员来说不易编写或修改,非常容易出现错误,由于必须依赖于机器,使用极其不方便。于是人们在生产实践过程中发明“指令的助记符”这个概念,于是采用几个字母(往往就是其含义的英文单词或缩写)代替某条指令,如加法用ADD表示,这种符号系统的扩大就是汇编语言。使用汇编语言编程,大大提高了编写效率和质量,并且同样实现了可直接对硬件内部进行控制。当然,使用汇编语言编程,需要我们设计人员对硬件的了解,才能够编写出高质量的程序,这是汇编语言的最大缺点。如果我们对硬件的认识不具体,根本无法编写出高效率的程序,甚至不法编写汇编程序。这就是汇编语言与机器的体系结构存在的依赖关系。汇编语言设计程序,是所有程序语言的基本资源。我们不管你使用除汇编语言或指令代码以外的程序语言编程,仅仅是编程表达、编程规则和变成环境的变化,但是这些变化都是基于汇编语言或指令代码基础上形成的新型开发语言,主要是为了解决商业化服务对象、编程效率和编程目标明确化。如果我们在不同的计算机上编程,我们需要不同的资源环境,其资源环境最重要的问题是提供一个适应计算机运行的底层资源,或者目标资源,这些资源就包含有目标指令代码文件(当然也有其它部分的资源组成,我们这里不必进行详细解释)。如果我们使用高级语言编程,高级语言编译成为最终可以执行的程序,就是一个指令代码程序。不管计算机语言的发展,汇编语言或指令代码是所有计算机语言的基本,掌握汇编语言有助于设计程序。汇编语言设计程序,处理效率高、占用资源少。如果使用过各种不同的语言编程的人员都非常清楚的感受到,汇编语言编写程序生成最终执行文件,是所有语言不可达到的最小空间,并且处理目的明确,浪费代码极少,处理速度惊人。由于汇编具备所有程序语言所追求实现的目标,然而所有程序语言又不可能达到的目标,所以汇编语言仍然是最常用的设计语言之一,是不可以取代的。比如在设计最底层的资源函数,DSP硬件封装设计等,都会使用汇编语言完成。C语言或其它语言已经有替代汇编语言设计程序,其根本是为了解决一个开发设计效率和程序交流性问题,但是,如果我们深入分析的情况下作断定,汇编语言的重要地位仍然是不可磨灭的。我们从未来发展的角度来看,汇编语言永久是生产、开发、设计的一个重要语言。首先,DSP硬件封装设计、单片机功能化设计的角度出发,这类软件设计领域将会永无止境的发展下去,并且人们将会提出生产、设计达到极限效率产品,必须依赖于汇编语言实现目标;第二,我们从计算机语言发展角度出发,不管出现什么样语言,其语言已经达到更加方便,更加设计合理,设计效率更加提高等优点,它必须提供一个仿真或DEBUG测试平台,那么就必须包含有代码的意思存在,也就是依然存在汇编语言的影子;第三,从资源代码封装的角度出发,随着提供资源更加丰富,开发能力不断增强,资源的可靠性和资源的效率性随之也是永久的话题,与汇编结果对比大小、效率是设计者们永久追求的目标,最终结果依然会采用翻译成汇编代码进行优化,以达到最高境界。上面描述,主要是告诉从事汇编语言的或非从事汇编语言的设计人员,我们必须正确看待汇编语言,正确看待汇编语言设计技术,不能够忽略汇编语言的重要性和汇编语言设计技术的重要性,希望大家共同努力推动发展汇编语言设计技术。下面简单介绍本文想描述的内容。我由于与使用汇编语言的朋友的接触并一起共同开发产品,才知道我国汇编语言设计技术的落后,而且这么落后,才促使我产生必须写一些东西与大家讨论的念头。当然,我可能有些偏激,接触的任务不能够代表我国真实的汇编发展水平,这也是我需要写一些东西以其道抛砖引玉的作用,看看我国汇编设计技术实际状况。因此,首先还是按照套路写一些基本内容,对那些想看又不懂得人来说起到启发作用,对那些已经掌握汇编语言的朋友们来说,就过过目,全当废话。然后,带入我想描述真正的内容部分,主要思路是按照软件设计生命周期规范讨论汇编语言设计的起步工作,流程分析,程序结构设计、程序设计。重点在程序结构设计和程序设计两个方面,我准备比较具体的描述。在阅读整个文章后,希望你们能够明确的看到设计过程中可以实现性、设计方法可以借鉴性、设计方法具有理智性。同时,也能够看出设计如何保证可读性、唯一性、可延续性、可维护性、可更改性,除这些以外,也希望看到汇编语言产品生产所需要追求的目标,从事汇编语言设计人员应当如何提高自己的设计水平。在这里需要声明,我编写这篇文章是想讨论现在设计技术问题,所以提出的一些设计方法希望大家教条使用,而是根据自己设计环境,借鉴提出的思想,相应建立更加符合实际状况的设计技术规范,建立更加符合实际的优秀编程框架,并在长期实践过程中完善规范和设计框架,以保证长期、有效、高效率的设计工作。二、汇编指令汇编指令是计算机语言中最基本的和最原始的语言,描述计算机可运行的指令,是指令编码的“助记符”。不同的计算机有不同的指令集和指令代码集。目前最常见的汇编指令集有INTEL公司8080系列指令集,8051系列的51指令集,ATEML公司的AVR指令集,MOTOROLA公司的68000指令集,ROCKWALL公司的6502指令集,ZILOG公司的Z80命令集等等。不管是哪一种计算机,不管是哪一种指令,我们可以认为是计算机可以识别并能够相应作出动作的指令。指令代码描述是由一定的规范格式,划分格式主要分成两种形式,一种是以带参数指令和不带参数指令格式描述,一般通用格式表达命令码,具体命令需要带参数的数目,内容都必须正确无误的加上,否则会出现编译错误。另一种描述可能现在已经有很少人用了,字节数目描述,单字节指令、双字节指令、多字节指令等说法,这种描述让我们一眼就可以看出是根据指令代码形式表达的。字节数目表达方式来说,可以帮助我们使用指令是注意使用空间问题,同时也可以互助地帮助我们知道使用的执行指令周期。当然,现在汇编语言设计可能不必那么像以前刻意考虑空间和指令周期的问题,因为,现在计算机速度和可提供空间的成本问题已经可以忽略不计了。计算机指令码一般是用一个字节来表示,范围在0255的数值代码,那么指令集一般也在128个范围内。指令可以分为传送指令、跳转指令、算术/逻辑指令、外部/端口访问指令和状态指令,以及栈操作指令。一个指令执行状况可以分为影响状态位指令和不影响状态位指令;也可以分为修改结果指令和产生状态结果指令;也可以分为条件控制和无条件控制指令;一个指令执行数据操作可以分为立即数、直接地址和间接地址操作,等。总之我们必须掌握这些规律,才能够很好的使用指令编写程序。指令集有简单指令集和复杂指令集之说,也有一般指令和扩展增强指令之说。不管怎样,我们都必须根据应用环境编写有用的应用程序,不要凭自己的主观思维处理,可能会导致事成无用的局面。下面给出一个AT90PWMCPU指令集,以让你们感受一下指令的定义和描述,并且让你们注意一些描述的细节。ATMEGA8/ATMEGA48/88/168/ATMEGA8515/ATMEGA8535/AT90PWM2/3INSTRUCTIONSETTHEASSEMBLERACCEPTSMNEMONICINSTRUCTIONSFROMTHEINSTRUCTIONSETASUMMARYOFTHEINSTRUCTIONSETMNEMONICSANDTHEIRPARAMETERSISGIVENHEREFORADETAILEDDESCRIPTIONOFTHEINSTRUCTIONSET,REFERTOTHEAVRDATABOOKARITHMETICANDLOGICINSTRUCTIONSMNEMONICOPERANDSDESCRIPTIONOPERATIONFLAGSCYCLESADDRD,RRADDWITHOUTCARRYRDRDRRZ,C,N,V,H,S1ADCRD,RRADDWITHCARRYRDRDRRCZ,C,N,V,H,S1ADIWRD,KADDIMMEDIATETOWORDRD1RD,KZ,C,N,V,S2SUBRD,RRSUBTRACTWITHOUTCARRYRDRDRRZ,C,N,V,H,S1SUBIRD,K8SUBTRACTIMMEDIATERDRDK8Z,C,N,V,H,S1SBCRD,RRSUBTRACTWITHCARRYRDRDRRCZ,C,N,V,H,S1SBCIRD,K8SUBTRACTWITHCARRYIMMEDTIATERDRDK8CZ,C,N,V,H,S1ANDRD,RRLOGICALANDRDRDRRZ,N,V,S1ANDIRD,K8LOGICALANDWITHIMMEDIATERDRDK8Z,N,V,S1ORRD,RRLOGICALORRDRDVRRZ,N,V,S1ORIRD,K8LOGICALORWITHIMMEDIATERDRDVK8Z,N,V,S1EORRD,RRLOGICALEXCLUSIVEORRDRDEORRRZ,N,V,S1COMRDONESCOMPLEMENTRDFFRDZ,C,N,V,S1NEGRDTWOSCOMPLEMENTRD00RDZ,C,N,V,H,S1SBRRD,K8SETBITSINREGISTERRDRDVK8Z,C,N,V,S1CBRRD,K8CLEARBITSINREGISTERRDRDFFK8Z,C,N,V,S1INCRDINCREMENTREGISTERRDRD1Z,N,V,S1DECRDDECREMENTREGISTERRDRD1Z,N,V,S1TSTRDTESTFORZEROORNEGATIVERDRDRDZ,C,N,V,S1CLRRDCLEARREGISTERRD0Z,C,N,V,S1SERRDSETREGISTERRDFFNONE1SBIWRDL,K6SUBTRACTIMMEDIATEFROMWORDRDHRDLRDHRDLK6Z,C,N,V,S2MULRD,RRMULTIPLYUNSIGNEDR1R0RDRRZ,C2MULSRD,RRMULTIPLYSIGNEDR1R0RDRRZ,C2MULSURD,RRMULTIPLYSIGNEDWITHUNSIGNEDR1R0RDRRZ,C2FMULRD,RRFRACTIONALMULTIPLYUNSIGNEDR1R0RDRR1Z,C2FMULSRD,RRFRACTIONALMULTIPLYSIGNEDR1R0RDRR1Z,C2FMULSURD,RRFRACTIONALMULTIPLYSIGNEDWITHUNSIGNEDR1R0RDRR1Z,C2BRANCHINSTRUCTIONSMNEMONICOPERANDSDESCRIPTIONOPERATIONFLAGSCYCLESRJMPKRELATIVEJUMPPCPCK1NONE2IJMPNONEINDIRECTJUMPTOZPCZNONE2JMPNOTE1KJUMPPCKNONE3RCALLKRELATIVECALLSUBROUTINESTACKPC1,PCPCK1NONE3/4ICALLNONEINDIRECTCALLTOZSTACKPC1,PCZNONE3/4CALLNOTE1KCALLSUBROUTINESTACKPC2,PCKNONE4/5RETNONESUBROUTINERETURNPCSTACKNONE4/5RETINONEINTERRUPTRETURNPCSTACKI4/5CPSERD,RRCOMPARE,SKIPIFEQUALIFRDRRPCPC2OR3NONE1/2/3CPRD,RRCOMPARERDRRZ,C,N,V,H,S1CPCRD,RRCOMPAREWITHCARRYRDRRCZ,C,N,V,H,S1CPIRD,K8COMPAREWITHIMMEDIATERDKZ,C,N,V,H,S1SBRCRR,BSKIPIFBITINREGISTERCLEAREDIFRRB0PCPC2OR3NONE1/2/3SBRSRR,BSKIPIFBITINREGISTERSETIFRRB1PCPC2OR3NONE1/2/3SBICP,BSKIPIFBITINI/OREGISTERCLEAREDIFI/OP,B0PCPC2OR3NONE1/2/3SBISP,BSKIPIFBITINI/OREGISTERSETIFI/OP,B1PCPC2OR3NONE1/2/3BRBCS,KBRANCHIFSTATUSFLAGIFSREGS0PCNONE1/2CLEAREDPCK1BRBSS,KBRANCHIFSTATUSFLAGSETIFSREGS1PCPCK1NONE1/2BREQKBRANCHIFEQUALIFZ1PCPCK1NONE1/2BRNEKBRANCHIFNOTEQUALIFZ0PCPCK1NONE1/2BRCSKBRANCHIFCARRYSETIFC1PCPCK1NONE1/2BRCCKBRANCHIFCARRYCLEAREDIFC0PCPCK1NONE1/2BRSHKBRANCHIFSAMEORHIGHERIFC0PCPCK1NONE1/2BRLOKBRANCHIFLOWERIFC1PCPCK1NONE1/2BRMIKBRANCHIFMINUSIFN1PCPCK1NONE1/2BRPLKBRANCHIFPLUSIFN0PCPCK1NONE1/2BRGEKBRANCHIFGREATERTHANOREQUALSIGNEDIFS0PCPCK1NONE1/2BRLTKBRANCHIFLESSTHANSIGNEDIFS1PCPCK1NONE1/2BRHSKBRANCHIFHALFCARRYFLAGSETIFH1PCPCK1NONE1/2BRHCKBRANCHIFHALFCARRYFLAGCLEAREDIFH0PCPCK1NONE1/2BRTSKBRANCHIFTFLAGSETIFT1PCPCK1NONE1/2BRTCKBRANCHIFTFLAGCLEAREDIFT0PCPCK1NONE1/2BRVSKBRANCHIFOVERFLOWFLAGSETIFV1PCPCK1NONE1/2BRVCKBRANCHIFOVERFLOWFLAGCLEAREDIFV0PCPCK1NONE1/2BRIEKBRANCHIFINTERRUPTENABLEDIFI1PCPCK1NONE1/2BRIDKBRANCHIFINTERRUPTDISABLEDIFI0PCPCK1NONE1/2DATATRANSFERINSTRUCTIONSMNEMONICOPERANDSDESCRIPTIONOPERATIONFLAGSCYCLESMOVRD,RRCOPYREGISTERRDRRNONE1MOVWRD,RRCOPYREGISTERPAIRRD1RDRR1RR,R,DEVENNONE1LDIRD,K8LOADIMMEDIATERDKNONE1LDSRD,KLOADDIRECTRDKNONE2LDRD,XLOADINDIRECTRDXNONE2LDRD,XLOADINDIRECTANDPOSTINCREMENTRDX,XX1NONE2LDRD,XLOADINDIRECTANDPREDECREMENTXX1,RDXNONE2LDRD,YLOADINDIRECTRDYNONE2LDRD,YLOADINDIRECTANDPOSTINCREMENTRDY,YY1NONE2LDRD,YLOADINDIRECTANDPREDECREMENTYY1,RDYNONE2LDDRD,YQLOADINDIRECTWITHDISPLACEMENTRDYQNONE2LDRD,ZLOADINDIRECTRDZNONE2LDRD,ZLOADINDIRECTANDPOSTINCREMENTRDZ,ZZ1NONE2LDRD,ZLOADINDIRECTANDPREDECREMENTZZ1,RDZNONE2LDDRD,ZQLOADINDIRECTWITHDISPLACEMENTRDZQNONE2STSK,RRSTOREDIRECTKRRNONE2STX,RRSTOREINDIRECTXRRNONE2STX,RRSTOREINDIRECTANDPOSTINCREMENTXRR,XX1NONE2STX,RRSTOREINDIRECTANDPREDECREMENTXX1,XRRNONE2STY,RRSTOREINDIRECTYRRNONE2STY,RRSTOREINDIRECTANDPOSTINCREMENTYRR,YY1NONE2STY,RRSTOREINDIRECTANDPREDECREMENTYY1,YRRNONE2STDYQ,RRSTOREINDIRECTWITHDISPLACEMENTYQRRNONE2STZ,RRSTOREINDIRECTZRRNONE2STZ,RRSTOREINDIRECTANDPOSTINCREMENTZRR,ZZ1NONE2STZ,RRSTOREINDIRECTANDPREDECREMENTZZ1,ZRRNONE2STDZQ,RRSTOREINDIRECTWITHDISPLACEMENTZQRRNONE2LPMNONELOADPROGRAMMEMORYR0ZNONE3LPMRD,ZLOADPROGRAMMEMORYRDZNONE3LPMRD,ZLOADPROGRAMMEMORYANDPOSTINCREMENTRDZ,ZZ1NONE3SPMNONESTOREPROGRAMMEMORYZR1R0NONEINRD,PINPORTRDPNONE1OUTP,RROUTPORTPRRNONE1PUSHRRPUSHREGISTERONSTACKSTACKRRNONE2POPRDPOPREGISTERFROMSTACKRDSTACKNONE2BITANDBITTESTINSTRUCTIONSMNEMONICOPERANDSDESCRIPTIONOPERATIONFLAGSCYCLESLSLRDLOGICALSHIFTLEFTRDN1RDN,RD00,CRD7Z,C,N,V,H,S1LSRRDLOGICALSHIFTRIGHTRDNRDN1,RD70,CRD0Z,C,N,V,S1ROLRDROTATELEFTTHROUGHCARRYRD0C,RDN1RDN,CRD7Z,C,N,V,H,S1RORRDROTATERIGHTTHROUGHCARRYRD7C,RDNRDN1,CRD0Z,C,N,V,S1ASRRDARITHMETICSHIFTRIGHTRDNRDN1,N0,6Z,C,N,V,S1SWAPRDSWAPNIBBLESRD30RD74,RD74RD30NONE1BSETSSETFLAGSREGS1SREGS1BCLRSCLEARFLAGSREGS0SREGS1SBIP,BSETBITINI/OREGISTERI/OP,B1NONE2CBIP,BCLEARBITINI/OREGISTERI/OP,B0NONE2BSTRR,BBITSTOREFROMREGISTERTOTTRRBT1BLDRD,BBITLOADFROMREGISTERTOTRDBTNONE1SECNONESETCARRYFLAGC1C1CLCNONECLEARCARRYFLAGC0C1SENNONESETNEGATIVEFLAGN1N1CLNNONECLEARNEGATIVEFLAGN0N1SEZNONESETZEROFLAGZ1Z1CLZNONECLEARZEROFLAGZ0Z1SEINONESETINTERRUPTFLAGI1I1CLINONECLEARINTERRUPTFLAGI0I1SESNONESETSIGNEDFLAGS1S1CLSNONECLEARSIGNEDFLAGS0S1SEVNONESETOVERFLOWFLAGV1V1CLVNONECLEAROVERFLOWFLAGV0V1SETNONESETTFLAGT1T1CLTNONECLEARTFLAGT0T1SEHNONESETHALFCARRYFLAGH1H1CLHNONECLEARHALFCARRYFLAGH0H1NOPNONENOOPERATIONNONENONE1SLEEPNONESLEEPSEEINSTRUCTIONMANUALNONE1WDRNONEWATCHDOGRESETSEEINSTRUCTIONMANUALNONE1NOTE1THESEINSTRUCTIONSAREONLYAVAILABLEINATMEGA168THEASSEMBLERISNOTCASESENSITIVETHEOPERANDSHAVETHEFOLLOWINGFORMSRDDESTINATIONANDSOURCEREGISTERINTHEREGISTERFILERRSOURCEREGISTERINTHEREGISTERFILEBCONSTANT07,CANBEACONSTANTEXPRESSIONSCONSTANT07,CANBEACONSTANTEXPRESSIONPCONSTANT031/63,CANBEACONSTANTEXPRESSIONK6CONSTANT063,CANBEACONSTANTEXPRESSIONK8CONSTANT0255,CANBEACONSTANTEXPRESSIONKCONSTANT,VALUERANGEDEPENDINGONINSTRUCTIONCANBEACONSTANTEXPRESSIONQCONSTANT063,CANBEACONSTANTEXPRESSIONRDLR24,R26,R28,R30FORADIWANDSBIWINSTRUCTIONSX,Y,ZINDIRECTADDRESSREGISTERSXR27R26,YR29R28,ZR31R30其中出现Z,C,N,V,H,S标志,是指CPU执行结果标志寄存器,包括结果状态、高位状态、负数状态、溢出状态、半字节操作标志和信号状态。三、汇编宏指令指令集是我们选择一个型号的CPU,对应提供一套指令集,而汇编宏指令是由编译工具提供的,可以更好地帮助我们编写程序、描述程序和限制程序等描述操作。我们可以这样认为,我们编写程序,是一个完成具体事务的过程,但是我们编写的程序是一个产品,需要进行包装,需要提供合格证、说明书等东西,才是一个可以出厂的产品,如果没有包装,没有合格证和说明书等,仍然还不是可以出厂的产品,或者不是一个合格的产品。使用汇编宏指令,是对汇编语言产品的包装。现代汇编程序产品设计中,如果不是用宏指令,几乎是一个不可想象的事,甚至如果不是用宏命令就完成部了程序的设计。使用宏指令是解决程序设计过程结构问题、数据分配问题是一个最好的办法。我们可以看出一个编写优秀的汇编程序,其宏指令运用合理,非常普遍,描述注释部分,描述程序起始位置、描述数据类型、描述数据分配等,都是用到宏命令。最重要的是两个方面使用宏命令更好地解决描述层次色彩和更好地解决程序的可维护性、可更改性、可交流性问题。宏指令在编译后的程序是不会出现宏指令的影子的,所以也有把宏命令成为伪操作命令,这是又一定的道理的。下面给出AT90PWMCPU的AVR工具提供宏命令ASSEMBLERDIRECTIVESTHEASSEMBLERSUPPORTSANUMBEROFDIRECTIVESTHEDIRECTIVESARENOTTRANSLATEDDIRECTLYINTOOPCODESINSTEAD,THEYAREUSEDTOADJUSTTHELOCATIONOFTHEPROGRAMINMEMORY,DEFINEMACROS,INITIALIZEMEMORYANDSOONANOVERVIEWOFTHEDIRECTIVESISGIVENINTHEFOLLOWINGTABLEDIRECTIVEDESCRIPTIONBYTERESERVEBYTETOAVARIABLECSEGCODESEGMENTCSEGSIZEPROGRAMMEMORYSIZEDBDEFINECONSTANTBYTESDEFDEFINEASYMBOLICNAMEONAREGISTERDEVICEDEFINEWHICHDEVICETOASSEMBLEFORDSEGDATASEGMENTDWDEFINECONSTANTWORDSENDM,ENDMACROENDMACROEQUSETASYMBOLEQUALTOANEXPRESSIONESEGEEPROMSEGMENTEXITEXITFROMFILEINCLUDEREADSOURCEFROMANOTHERFILELISTTURNLISTFILEGENERATIONONLISTMACTURNMACROEXPANSIONINLISTFILEONMACROBEGINMACRONOLISTTURNLISTFILEGENERATIONOFFORGSETPROGRAMORIGINSETSETASYMBOLTOANEXPRESSIONTHESEDIRECTIVESWEREINTRODUCEDINAVRASMV174NEWDIRECTIVESDESCRIPTIONELSE,ELIFCONDITIONALASSEMBLYENDIFCONDITIONALASSEMBLYERROROUTPUTSANERRORMESSAGEIF,IFDEF,IFNDEFCONDITIONALASSEMBLYMESSAGEOUTPUTSAMESSAGESTRINGTHEFOLLOWINGDIRECTIVESAREONLYAVAILABLEWITHAVRASM2AVRASM2DIRECTIVESDESCRIPTIONDDDEFINEDOUBLEWORDDQDEFINEQUADWORDUNDEFUNDEFINEREGISTERSYMBOLWARNINGOUTPUTSAWARNINGMESSAGEOVERLAP/NOOVERLAPSETUPOVERLAPPINGSECTIONREQUIRESAVRASM21ORBETTERNOTETHATALLDIRECTIVESMUSTBEPRECEDEDBYAPERIOD看完宏指令后,如果你能够产生这样一个想法说明你已经明白了宏指令的作用了,宏指令不仅仅是程序包装的问题,还是解决汇编设计人员与汇编工具之间的交流问题,编译控制问题,把汇编人员编写程序的处理意见和处理方法告诉给编译工具,编译工具按照汇编设计人员的意图进行编译,生成目标代码。四、简单汇编语言程序设计我一直担心我用比较少量的文字编写情况下无法把汇编语言设计入门的引子写好,也不知道你们看懂了吗。总之,CPU指令是计算机语言,是计算机执行的命令,宏指令是提供程序设计的一种工具,为了更好地将汇编程序描述清楚。不管怎样我还要继续写下去,也可能通过一个具体的实例描述,胜过前面文字的描述。下面是一个具体的程序代码DEFTEMPR19DEFTEMP2R20DELAYLDITEMP,FFD1DECTEMPBRNED1RETLONG_DELAYSERTEMP2LD1RCALLDELAYDECTEMP2BRNELD1RET这段程序是我们写每一个汇编程序设计人员都会编写的代码,主要是通过CPU处理指令占用时间进行延时。这种延时程序与睡眠延时有很大的区别,睡眠延时虽然也是延时,但是不会占用CPU处理事务的时间,是通过TIMER/COUNTER控制器处理完成的,完成后后通知CPU,CPU接着继续往下处理,而我们看到的这段程序,是依赖于占用促CPU时间达到实际意义上的延时,实际运行的结果并不重要。通过这段程序我们可以看到第一行、第二行通过宏指令定义一个替代R18和R19寄存器描述;第三行命令定义指令执行次数为0XFF(256)次;第四行进行递减操作;第五行命令执行递减结果状态操作,如果TEMP不为零继续返回到第四行操作,直到TEMP结果为零,操作结束RET。下面程序类似,仅仅是用RCALLDELAY命令调用前面的延时程序,目的是达到更上时间的延时,而使用的代码量最少。五、汇编语言设计技术我们从这一章节开始逐步进入我真正想写的一些内容了,希望大家认真阅读,并发表感慨。汇编语言设计程序,首先必须掌握CPU性能、CPU指令集和宏指令系统,这是一个最基本的条件,如果这一点我们无法做到,根本无法编写出来一个具体应用程序。当然,如果你已经了解并掌握许多种汇编语言的设计,你已经掌握汇编语言编写程序的基本规律和方法,你可以不必花费过多的时间去认识指令和宏指令,就可以编写程序了,这种情况我们必须分别去看。总之,只有在熟悉汇编语言指令和汇编宏指令的情况才能够编写程序。但是,对于软件产品的设计,仅仅掌握汇编指令和汇编宏指令是不够的,我们还需要掌握工厂设计程序的基本工艺技术,掌握国家提供的程序设计规范、标准、掌握国际上的一些汇编语言设计技术,整体结合起来,才是汇编语言设计技术。而仅仅会用汇编编写一两个程序,那时做作业、做实验,根本谈不上掌握汇编设计技术。比如,软件产品第一解决实现功能问题,如果功能是达到了,性能不稳定的现象存在,你能够说产品设计过关了、合格了吗又比如,对于任何一个软件产品的设计,在实现功能设计的基础上,必须要讨论的可维护性和可更改性问题,以保障产品的市场生命力,我们实际编写程序过程中思考过没有,提出或应用了实质性的解决方法没有。等等问题,我通过朋友的交谈和网上阅读,发现我国现状应该根本没有向前发展,甚至根本没有一个规范的指导和促进。那么,我还是具体的一一个来描述。51、程序设计指标程序设计指标包括功能性指标、非功能性指标、特殊要求及安全要求和未来性保证四个方面。功能性指标包括功能、扩展性、维护维修性、逻辑性等具体指标;非功能性指标包括设计书类、设计过程控制的要求;特殊性及安全设计要求主要是商业行为控制设计指标;未来性设计主要程序结构以及程序实现的方法保证的一些设计指标。52、程序设计生命周期国家、国际上早已有描述的标准,我没有必要作解释了。53、存储资源分配设计单片机设计其最重要的一项工作就是存储资源分配、规划设计,而且在硬件设计和软件设计工作正式开展前就必须完成的工作,所以我把这项内容专门提出来。主要是通过经验判断,能够非常准确地确定数据信息量和程序占用空间,具体给出实际存储空间大小。54、设计项目目录文件管理分配我们知道,只要启动一个设计任务,我们总会在自己的计算机上定义一个目录,准备将设计工作放到这个目录下完成。这一点应当是所有设计人员共识的。但是,仅仅具备这一点是不够的,我们需要从几个方面考虑定义目录及文件。第一,工程管理角度定义需求或资料管理目录,程序设计目录、程序设计过程控制目录,以及培训计划目录;第二,应用涉及的DEF、CPU、I/O设备、TIMER、MEMORY、以及相关的功能硬件设备等建立INC文件的结构;第三,主题程序或流程描述程序和功能程序描述文件划分。我们基本上需要按照提出的三个方面建立具体应用的管理环境。保证设计、交流、档案管理的问题。55、设计流程的分析流程分析主要是根据需求或应用对象,建立一个符合实际需求的方法,也是我们程序设计的主体描述。应用的不同实际流程不同,我们必须从实际出发建立合理的流程模式,不能套模式、简单TOPTOBOTTOM式设计。一般,思考的方法有按时间处理的时序描述模式,按事件处理的事件服务模式,按操作规则描述的逻辑模式,两种或两种以上的模式混合使用的混合模式,我们根据应用准确建立具体的应用模型。56、设计容错技术如果我们设计产品仅仅完成功能设计这是不够的,我们必须在设计功能的同时设计产品的容错问题,必须清楚地认识到产品的质量控制点和质量保证点。我们尽量不要在设计完成后再来对出现的问题检查、纠正,这样往往会出现越修越错现象,生产周期无法保证。文件结构和程序结构设计是设计容错技术的一个最基本的内容。我们如果选用优秀的方法建立文件结构和程序结构,保证了程序逻辑正确描述,同事保证了更改方便性。具体描述容错技术有方法保证、环境保证、程序处理保证三个方面。看门狗处理、陷阱技术、错误处理服务等,高级的容器处理服务都是我们讨论的程序容错处理技术。57、三层结构设计这一部分设计严格来说是容错技术的一个部分,但是我把它单独提出来说明,是我发现汇编设计的朋友们在实际设计过程中根本不注意这个方面的问题了,如果出现堆栈溢出就调整一下堆栈指针,而不是在设计过程中完全可以预见性的处理好这类问题。如果我们按照三层结构设计程序,硬件支持层尽量不使用CALL调用(可能会出现使用延时过程),直接放映硬件设备功能。第二层功能模块描述,解决必要的功能描述和复用性功能描述,将会使用到CALL,以及数据堆栈保存和堆栈的存储器寄存器调换等。第一层应用流程描述,直观、尽量鲜明的描述整个应用的全貌。这样一来,我们可以分析出来,一层、二层调用的最大使用堆栈空间量和中断调用与正常运行交叉占用量,得到实际堆栈使用空间大小的判断量。58、捷克松模块分析法这一部分实际上也是容错技术的一个部分,我同样单独提出来说明是因为我们从事汇编语言设计的人员根本没有掌握这个设计方法。捷克松设计方法主要是从程序设计模块划分确定功能保障性、模块的可复用性、数据交换的保障性等问题。在国际上汇编语言设计模块分析方法普遍采用模块划分和数据流划分两种方法,最为流行的是模块分析法,捷克松模块分析法就是其中最为代表的一种方法,他是根据三层结构原理,从应用层到应用功能模块层,到硬件支持层之间,我们根据应用的功能与设备的组织进行唯一功能描述和复用性功能描述,最后,得到最少功能模块数,最佳模块定义,实现整个应用,并可以验证应用设计和理性、正确性和可以实施性等问题。59、程序编程规范设计这个部分也是容错处理技术一个部分。说到这里,我们已经不难看出,程序设计技术讨论来讨论去的问题都是怎样保证设计的正确性问题,反过来对流程建立的问题讨论比较少,这说明,对于软件生产来说,解决了功能(简单认识的功能)问题是非常容易的,生产的保证与商业利益的保证必需建立完整的有效手段,不然根本无法保证长期运作。(程序编程规范省略了)。510、程序检测规范的设计(省略了)。511、程序未来性设计功能性设计的扩展性设计、抽象化设计、模块化设计、维护维修性设计;非功能性文档描述等等。六、产品设计起步我们设计产品,起步阶段首先的工作就是收集资源,这是一个普遍的认识。只有通过收集资源才能够明确的认识到实现的可能性。如果无法收集到资源,也就无法实现了,这一点认识具有普片性和正确性。但是,我们讨论这个问题必须从定量化、指标化角度考虑,也就是从长期生产实践中建立完整的风险意识控制办法,不能简单认识这个问题。MCCALL方法就是教我们怎样去分析问题。61、提供项目可实施性依据我们常说的可行性报告,从环境条件、设计技术、资源保证,以及开发资金保证等要素分析。62、整理项目设计资源设计技术能力和设计可提供的资源,需求分析等建立可以保证在一定周期时间内完成的必要条件。如果不能够在一定周期时间内完成,对于企业来说,投入这个项目是一个受损失的或失败的。63、保证的资金解决办法具备设计方面的可能,我们还必须考虑资金保证的问题,这点我们应该都有体会了。七、程序流程分析我在汇编语言设计技术这一章节里,已经描述了程序流程分析,主要是解决如何使用计算机处理能力实现具体化应用功能,按时间、事件、逻辑建立一个有效的处理方法。在这里强调两个方面的问题,第一是我们必须使用有效的工具进行描述,第二是我们必须进行准确定量化描述。使用有效工具进行描述,如时间周期控制,需要描述流程的过程以外,需要我们建立准确的、完整的时间变化与控制和控制反馈量变化描述的时序图,是用图表描述参数值等。使用事件控制,需要我们描述流程的过程以外,需要我们准确定义事件名称、作用、目的,以及状态变化,利用状态图、图表工具,定量的描述出来。是用逻辑控制的同样也是需要使用逻辑图准确描述逻辑变化。只有获得了准确、完整的数据信息,才使我们设计工作有了保证,才使我们的设计工作正确实现。我们有一些汇编设计的朋友,他们是没有丰富的工作经验还是没有进行过系统化的训练,在描述流程分析时,没有明确的时间、事件和逻辑控制划分,在描述上把所有的工具都是用上了,让他人阅读后无法准确定位控制方法,甚至造成设计错误。我们在描述中和使用描述工具描述中,我们必须准确定位控制方法,不要出判断题。总之使用单片机设计,尤其是使用汇编技术设计,流程一般不会过于复杂的。如果使用单片机汇编技术设计一个复杂的处理过程,那是一个非常不明智的选择。通常设计复杂处理过程会使用DSP开发技术或使用嵌入开发技术。所以,我们分析流程,基本不会遇到过于复杂的,只要我们思维上基于用时间、事件和逻辑这三个思想去分析,答案应当是非常明确的,这一点是肯定的。我们只需要注意数据量的完整性和正确性问题,同时选择有效的工具正确描述。八、程序结构分析汇编语言设计产品最大缺点就是不便于交流,因此我们必须通过设计结构和设计方法上解决这个问题,尽量实现可交流性问题。这也是我编写文章所描述的主要思想。那么,为了实现这个目的,我们必须从设计结构和设计方法上保证。81、程序结构前面,我已经提到了使用捷克松模块分析法,进行三层结构设计,并且也描述道一、二、三层的划分方法,只要我们按照这种方法设计,我们阅读程序就能够非常清楚地看到流程控制方法和流程实现过程,非常清楚看出主体函数(流程描述)和功能服务模块。比如,我下面给出一个主题流程描述实例DEVICEAT90PWM2USETHEAT90PWM2CSEGINCLUDE“AT90PWM2DEFINC“INCLUDE“PJT200WINC“INCLUDE“PJT200W_LAMPINC“INCLUDE“CPUINC“INCLUDE“REGISTERINC“INCLUDE“INTERRUPTINC“INCLUDE“WATCHDOGINC“INCLUDE“TIMERINC“INCLUDE“IOINC“INCLUDE“ADCINC“INCLUDE“PSCINC“ORG0X0PROGRAMSTARTADDRESSCREATEINTERRUPTSERVERCREATEINTERRUPTVOCTERSERVERSTARTUPRESETINTERRUPTINTOPROGRAMSTARTUPINITIALIZESTACKINITIALIZESTACKINITIALIZEREGISTERINITIALIZESYSTEMREGISTERINITIALIZEIOPORTINITIALIZEI/OPORTSETBITLED_PORT0X20,LED0LED0TURNONSETBITLED_PORT0X20,LED1LED1TURNONSETBITLED_PORT0X20,LED2LED2TURNONINITIALIZEADCINITIALIZEADCADC_CHANNELSELECTADC3SELECTADC3DELAY_80USECDELAY1S80TOWAITPOWERSTABLECLEARBITLED_PORT0X20,LED0LED0TURNOFFCLEARBITLED_PORT0X20,LED1LED1TURNOFFCLEARBITLED_PORT0X20,LED2LED2TURNOFFWATCHDOGTIMER_ONTURNONWATCHDOGTIMERENABLEINTERRUPTENABLEINTERRUPTINITIALIZEPSC0159INITIALIZEPCS0,DATA159100KHZMAINLOOPCALLMAINCONTROLLERRJMPMAINLOOPMAINPROCESSEND,ORRESERINTERRUPTENDPSC2_CAPTPSC2CAPTUREEVENTHANDLERRETIPSC2_ECPSC2ENDCYCLEHANDLERRETIPSC1_CAPTPSC1CAPTUREEVENTHANDLERRETIPSC1_ECPSC1ENDCYCLEHANDLERRETIPSC0_CAPTPSC0CAPTUREEVENTHANDLERRETIPSC0_ECPSC0ENDCYCLEHANDLERRETIANA_COMP_0ANALOGCOMPARATOR0HANDLERRETIANA_COMP_1ANALOGCOMPARATOR1HANDLERRETIANA_COMP_2ANALOGCOMPARATOR2HANDLERRETIEXT_INT0IRQ0HANDLERRETITIM1_CAPTTIMER1CAPTUREHANDLERRETITIM1_COMPATIMER1COMPAREAHANDLERRETITIM1_COMPBTIMER1COMPAREBHANDLERRETITIM1_OVFTIMER1OVERFLOWHANDLERRETITIM0_COMPATIMER0COMPAREAHANDLERRETITIM0_OVFTIMER0OVERFLOWHANDLERRETIADC_PROCADCCONVERSIONCOMPLETEHANDLERRETIEXT_INT1IRQ1HANDLERRETISPI_STCSPITRANSFERCOMPLETEHANDLERRETIUSART_RXCUSART,RXCOMPLETEHANDLERRETIUSART_UDREUSART,UDREMPTYHANDLERRETIUSART_TXCUSART,TXCOMPLETEHANDLERRETIEXT_INT2IRQ2HANDLERRETIWDTWATCHDOGTIMERHANDLERJUMPRUNNINGPROCESSRETIEE_RDYEEPROMREADYHANDLERRETITIM0_COMPBTIMER0COMPAREBHANDLERRETIEXT_INT3IRQ3HANDLERRETISPM_RDYSTOREPROGRAMMEMORYREADYHANDLERRETI我们编写过汇编语言的人,阅读这个程序,我认为已经达到了交流的效果了。82、程序管理结构使用国际化的结构设计仍然不能够完全说明清楚我需要表达的问题,不能够完全看出设计方法的优越性,也不能够看出三层结构设计的效果,那好,我们在这一节里通过程序管理结构进行深入地描述。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论