




已阅读5页,还剩70页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
培训课件嵌入式系统课件汇编及C语言程序嵌入式系统汇编及C语言程序主要内容ARM汇编语言的指示符ARM汇编语言语句格式ARM汇编语言程序格式ARM汇编语言程序举例ARM汇编程序设计文件格式汇编语言设计的意义汇编语言程序设计更能充分发挥处理器的硬件特性两个优势操作系统移植需要编写几百行底层硬件的汇编语言程序,这是C语言不可取代的。优化算法的时空效率,C语言的目标代码优化是编译器完成的,而汇编语言的目标代码优化是人工完成的。人是算法的创造者,也是编译器的设计者,人工优化比编译器质量高。弱点编程效率低,开发周期长,经济代价大。预定义寄存器名ARM汇编器中将几十个寄存器名称作为保留字预先给与了定义,这些预定义寄存器名都是大小写敏感的,它们都与具体的寄存器一一对应。ADS预定义的寄存器名预定义寄存器名描述R0R15ANDR0R15ARM处理器的通用寄存器A1A4入口参数,处理结果,暂存寄存器;R0R3的同义词V1V8变量寄存器,R4R11SBANDSB静态基址寄存器,R9SLANDSL栈界限寄存器,R10FPANDFP帧指针寄存器,R11IPANDIP内部过程调用暂存寄存器,R12SPANDSP栈指针寄存器,R13ADS预定义的寄存器名(续)预定义寄存器名描述LRANDLR连接寄存器,R14PCANDPC程序寄存器,R15CPSRANDCPSR当前程序状态寄存器SPSRANDSPSR保存的程序状态寄存器F0F7ANDF0F7浮点数运算加速寄存器S0S31ANDS0S31单精度向量浮点数运算寄存器D0D15ANDD0D15双精度向量浮点数运算寄存器P0P15协处理器015C0C15协处理器寄存器015内置变量名内置变量ARM汇编器所定义的内置变量如表所示。值得注意的是内置变量的设置不能用SETA、SETL或SETS等指示符来设置,只能用于表达式或条件语句。例如IFARCHITECTURE“4T”内置变量名清单内置变量描述PCOR当前指令地址VAROR内存区位置计数器的当前值TRUE逻辑值真FALSE逻辑值假CONFIG汇编器如果在汇编ARM指令,取值为32,如果汇编THUMB指令,取值16ENDIAN如果汇编器是大端序,则取值BIG;如果是小端序,则取值LITTLE。CPU被选择的CPU名称。缺省值是ARM7TDMI。ARCHITECTURE该变量内容是被选择的ARM体系结构的名称。如3,3M,4T内置变量名清单内置变量描述OPT当前设置列表选项值,OPT用来保存当前列表选项,改变选项值,恢复它的原始值FPU选定的FPU名,缺省时为SOFTVFPPCSTOREOFFSET选定的ARM体系结构的值;3,3M,4,4T和4TXMARMASM_VERSIONARM汇编器的版本号,为整数或|ADSVERSION|CODESIZECONFIG的同义词内部变量名使用范例GBLLTHUMBCODE设置一个全局逻辑变量CONFIG16IFCONFIG16这里表示处于16位编译方式THUMBCODESETLTRUE设置THUMBCODE为TRUECODE32转入32位编译模式|ELSETHUMBCODESETLFALSE设置THUMBCODE为FALSETHUMBCODEIFTHUMBCODETRUECODE32FORSTARTUPCODEFORTHUMBMODE转入32位编译方式ARM汇编语言程序的语句格式ARM汇编语言程序的语句格式格式如下SYMBOLINSTRUCTION|DIRECTIVE|PSEUDOINSTRUCTIONCOMMENT对应的中文语句格式描述是符号指令|指示符|伪指令注释语句格式中,花括号括起来的部分表示可以省略;竖线分隔的字段表示可以替换。ARM汇编语言程序中的符号ARM汇编语句中的符号可以是指令地址或标号、变量、常量和局部标号,符号属性可以是程序相关的、寄存器相关的或者是绝对地址。在符号中,有程序相关的指示符,例如DCB、DCD等;有寄存器相关的指示符,例如MAP、SPACE、DCDO等;还有绝对地址。绝对地址是范围在2321的整数常数,直接用来表示地址。符号命名和书写规则符号的命名和书写有以下规则符号命名可以使用大小写字母,数字和下划线。符号是大小写字母敏感的。除本地行号外,名称不能不能以数字开头。一个程序段中不能重名。符号在其作用范围内必须唯一。符号不能够与系统内部变量或者系统预定义的符号同名。例如A1ORR0、SP、CPSR、PCOR、VAROR、CONFIG、CPU等等。符号命名和书写规则(续)当程序中的符号与指令助记符或者指示符同名时,用双竖线将符号括起来。如|BUFFE_A|,这时双竖线并不是符号的组成部分。在ARM汇编语言程序中,所有符号必须在一行的最左边位置开始书写,即所谓的顶格书写,不允许包含空格或者制表符。符号的字符序列中不能大小写字母相混杂。可以用反斜线作为这一行最后的符号,然后另起一行接下去写数字常量ARM汇编语言中使用到的常量可以是数字常量、字符常量、字符串常量和布尔常量。数字常量有以下3种表示方式1)十进制数,如535,246。2)十六进制数,如0X645,0XFF00。3)N进制数,格式为N_XXX,其中N表示N进制,从29,XXX是具体的数字。例如8_3777,8_5237702字符常量字符常量由一对单引号括起来,包括一个单字符或者标准C中的转义字符。例如A,N。字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准C中的转义字符。如果需要使用双引号或字符,则必须用”和代替。例如执行语句STRTWOSETS“THISISCHARACTEROF”其编译结果是字符串“THISISCHARACTEROF”被赋值给STRTWO变量。在汇编语句中的使用举例GBLSADD4FFADD4FFSETS“ADDR4,R4,0XFF“SETUPADD4FFADD4FF00INVOKEADD4FFTHISPRODUCESADDR4,R4,0XFF00ELABORATESUBSTITUTIONGBLSS1GBLSS2GBLSFIXUPGBLACOUNTCOUNTSETA14S1SETS“ABCOUNT“S1NOWHASVALUEAB0000000ES2SETS“ABC“FIXUPSETS“|XYS2Z|“FIXUPNOWHASVALUE|XYABCZ|CCODE|MOVR4,16BUTTHELABELHEREISCCODE逻辑值常量布尔常量TRUE和FALSE在表达式中写为TRUE,FALSE。逻辑表达式由逻辑常量、逻辑操作符、关系操作符以及括号组成。取值范围为FALSE和TRUE。THUMBCODESETLFALSE表达式ARM汇编语言中的表达式由符号、数值、单目操作符、双目操作符以及括号组成。运算的优先级次序与标准C一样。字符串表达式字符串由字符串常量、字符串变量、操作符以及括号组成。最大长度为512字节,最短0个字节。字符串表达式的组成元素有字符串常量、字符串变量、操作符等。字符串常量由包含在双引号内的一系列字符组成。当在字符串中包含美元符号或者引号”时,用表示一个,用”表示一个”。字符串变量用指示符GBLS(全局字符串)或者LCLS(局部字符串)声明,用SETS赋值。取值范围与字符表达式相同。ARM汇编语言中的字符串操作符操作功能操作符功能符LEN返回字符串的长度CHR将0255之间整数变为单个字符STR将一个数字量变换为串LEFT返回字符串的左子串RIGHT返回字符串的右子串CC连接两个字符串BASE返回基于寄存器的表达式中INDEX将0255之间整数变为单个字寄存器的编号BASEX符返回某代码行所生成的可DEFT判断是否定义某个符号执行代码的长度XDEFX数字表达式数字表达式由数字常量、数字变量、操作符和括号组成。数字表达式表示的是一个32位数的整数,其取值范围为02321;当作为有符号数时,其取值范围为2312311。汇编器对N和232N不做区别,汇编时对关系运算符采用无符号数方式处理,这就意味着01是FALSE。地址标号当符号代表地址时称为标号(LABEL)。以数字开头的标号其作用范围是当前段(没有使用ROUT指示符时),这种标号又称为局部标号(LOCALLABEL)。三种类型标号PC相关标号寄存器相关标号绝对地址PC相关标号PC相关标号表示程序计数器加减一个数值常数后得到的地址值。常用来指明一个分支指令的目标地址,或者访问嵌入在代码段中的一个数据项。具体标记方法是在汇编语言程序指令的前面写入标号,或者在一个数据指示符前面写入标号。通常用DCB或者DCD等指示符定义。寄存器相关标号寄存器标号表示指定寄存器的值加减一个数值常数后得到的地址值。常常用于访问位于数据段中的数据。通常用MAP或者FIELD等指示符定义。绝对地址绝对地址是一个32位的无符号数字常量,可寻址范围是02311。使用它可以直接寻址整个地址空间。段内标号和段外标号ARM处理器的地址标号分为段内标号和段外标号。段内标号的地址值在汇编时确定,段外标号的地址值在连接时确定。局部标号ARM汇编语言的宏常常使用局部标号。局部标号提供分支指令在汇编程序的局部范围内进行跳转,主要用途是汇编子程序中的循环和条件编码。它是一个099之间的数字,后面可以有选择地附带一个符号名称。局部标号特别适用于宏。局部标号(续1)使用ROUT指示符可以限制局部标号的范围。只能在该局部标号的范围引用局部标号。如果在该范围的上下两个方向都没有匹配的标号,汇编器将给出一个错误信号并停止汇编。局部标号语法格式如下NROUTNAME被引用的局部标号语法规则是F|BA|TNROUTNAME局部标号(续2)N是局部标号的数字号。ROUTNAME是当前局部范围的名称。表示引用操作。F指示汇编器只向前搜索B指示汇编器只向后搜索A指示汇编器搜索宏的所有嵌套层次T指示汇编器搜索宏的当前层次如果F和B都没有指定,则汇编器首先向前搜索,再向后搜索。如果A和T都没有指定,汇编器搜索从宏的当前层次到宏的最高层次,比当前层次低的宏不再搜索。汇编指令正确的例子STR1SETS“MYSTRING1”设置字符串变量STR1COUNTRNR0定义寄存器名COUNTUSR_STACKEQU64定义常量STARTLDRR0,0X123456781235678HMOVR1,0LOOPMOVR2,1FIELD4FIELD指示符操作正确的ARM汇编语句举例AREASTARTUP,CODE,READONLY代码段首条指令STR1SETS“THISISANARMPROCESSOR”设置字符串变量SENTB标号LDRR3,BLKADDRESS地址赋值给R3ANDSR2,R2,0X40逻辑运算指令FIELD4FIELD指示符操作汇编指令错误的例子AREAEXAMPLE1,CODE,READONLYENTRY标识程序入口CODE32声明32位ARM指令DOBMOVR0,1ABCMOVR1,2MOVR2,3LOOPMOVR2,3BLOOPENDARM汇编语言指示符ARM汇编语言程序指示符的英文原文是DIRECTIVE,ARM指示符相当于X86处理器汇编语言程序中的伪指令。ARM指示符语句与ARM机器指令不存在一一对应的关系,它指示汇编器在汇编目标代码时进行变量定义、存储单元分配等操作。ARM指示符大致可以分成5种类型,分别是符号定义、数据定义、汇编控制、信息报告和杂项。符号定义数据定义汇编控制或IF这三个符号连用,进行条件汇编|或ELSE或ENDIF汇编控制MACRO这二个符号连用,定义一个宏定义指示符MENDMEXIT用来在结束前退出宏定义WHILE这二个符号连用,进行重复汇编或重复相同的源代码WEND报告指示符ASSERT如果ASSERT条件不成立,在第二次汇编时产生错误信息或INFO在汇编时显示信息报告指示符OPT可在源代码中设置列表选项TTL在一个列表文件每页的开始插入一个标题,每一页的标题在下一个TTL之前都有效SUBT在一个列表文件的页中设置一个子标题,每一页的子标题在下一个SUBT之前都有效杂项指示符ALIGN从一个字边界开始AREA指示汇编器汇编一段新的代码或数据部分CODE16指示汇编器将随后的指令作为16位THUMB指令CODE32指示汇编器将随后的指令作为32位ARM指令END表示源程序的结束ENTRY程序的入口,一个源文件中只能有一个ENTRY或EQU对一个常量赋予一个符号名杂项指示符EXPORT或GLOBAL说明了由链接器在目标和库文件中使用的符号IMPORT或EXTERN提供汇编器在当前汇编中未曾定义的符号名GET或INCLUDE包含一个文件,在GET处汇编包含的文件INCBIN包含一个未被汇编过的文件KEEP指示汇编器保留符号表中的局部符号NOFP在汇编语言程序中禁止浮点指令REQUIRE指示两段之间的依赖关系REQUIRE8指示当前文件请求堆栈为8字节对准PRESERVE8指示当前文件保持堆栈为8字节对准RN给特定的寄存器命名ROUT标记局部标号使用范围的界面ATPCSATPCS(ARMTHUMBPROCEDURECALLSTANDARD)规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。有了这些规则之后,单独编译的C语言程序就可以和汇编程序相互调用。使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS类型。而对于汇编语言来说,则需要用户来保证各个子程序满足ATPCS的要求。AAPCS2007年ARM公司正式推出了AAPCS标准ARMARCHTECTUREPROCEDURECALLSTANDARDAAPCS是ATPCS的改进版目前,AAPCS和ATPCS都是可用的标准AAPCS和ATPCS规范要点寄存器的使用规则堆栈使用规则参数传递规则寄存器的使用规则子程序间通过寄存器R0R3来传递参数。这时,寄存器R0R3可记作A0A3。被调用的子程序在返回前无需恢复寄存器R0R3的内容。在子程序中,使用寄存器R4R11来保存局部变量。这时,寄存器R4R11可以记作V1V8。如果在子程序中使用了寄存器V1V8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。在THUMB程序中,通常只能使用寄存器R4R7来保存局部变量。寄存器R12用作过程调用中间临时寄存器,记作IP。在子程序之间的连接代码段中常常有这种使用规则。寄存器的使用规则(续)寄存器R13用作堆栈指针,记作SP。在子程序中寄存器R13不能用作其他用途。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。寄存器R14称为连接寄存器,记作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。寄存器R15是程序计数器,记作PC。它不能用作其它用途。堆栈使用规则ATPCS规定堆栈为FD类型,即满递减堆栈,并且对堆栈的操作是8字节对齐。对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件(1)外部接口的堆栈必须是8字节对齐的。(2)在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的。参数传递规则根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变化的子程序。这两种子程序的参数传递规则是不一样的。参数个数可变传递规则对于参数个数可变的子程序,当参数个数不超过4个时,可以使用寄存器R0R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。如果参数多于4个,则将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。参数个数固定传递规则如果系统不包含浮点运算的硬件部件,浮点参数会通过相应的规则转换成整数参数(若没有浮点参数,此步省略),然后依次将各字数据传送到寄存器R0R3中。如果参数多于4个,将剩余的字数据传送堆栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。在参数传递时,将所有参数看作是存放在连续的内存字单元的字数据。子程序结果返回规则子程序中结果返回的规则如下结果为一个32位整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和RL返回;结果为一个浮点数时,可以通过浮点运算部件的寄存器F0、D0或S0来返回;结果为复合型浮点数(如复数)时,可以通过寄存器F0FN或D0DN来返回;对于位数更多的结果,需要通过内存来传递。ARM编译器保有的特定关键字ARM编译器支持一些对ANSIC进行扩展的关键词。这些关键词用于声明变量、声明函数、对特定的数据类型进行一定的限制。用于声明函数的关键词双下划线起头_ASM,内嵌汇编_INLINE,内联展开_IRQ,声明IRQ或FIQ的ISR_PURE,函数不修改该函数之外的数据_SOFTFP,使用软件的浮点连接件_SWI,软中断函数_SWI_INDIRECT,软中断函数用于声明变量的关键词REGISTER声明一个变量,告诉编译器尽量保存到寄存器中。_INT64该关键词是LONGLONG的同义词。_GLOBAL_REG将一个已经声明的变量分配到一个全局的整数寄存器中。汇编语言程序举例VOIDLOADINTIVOIDROUTINE1INT1VOIDROUTINE2INT2AREALOAD,CODE,READONLYIMPORTROUTINE1IMPORTROUTINE2EXPORTLOADLOADSTMFDR13,R4,R14LDRR4,ROUTINE1首先将32位地址存放在附近的区域CMPSR0,1LDRNER4,ROUTINE2LDRR00X11552634函数的第1个INT参数BXR4LDMFDR13,R4,R14BXR14调用ARM汇编语言子程序在ARM汇编语言中,子程序调用是通过BL指令完成的。BL指令的语法格式如下BLSUBNAME其中,SUBNAME是调用的子程序的名称。BL指令完成两个操作将子程序的返回地址放在LR寄存器中,同时将PC寄存器值设置成目标子程序的第一条指令地址。在子程序返回时可以通过将LR寄存器的值传送到PC寄存器中来实现。子程序调用时通常使用寄存器R0R3来传递参数和返回结果。调用汇编子程序举例子程序DOADD完成加法运算,操作数放在R0和R1寄存器中,结果放在R0中。AREAEXAMPLE2,CODE,READONLYENTRYSTARTMOVR0,10R0设置输入参数MOVR1,3R1设置输入参数BLDOADD调用子程序DOADDDOADDADDR0,R0,R1子程序实体MOVPC,LR从子程序中返回END循环结构在ARM汇编中,没有专门的指令用来实现循环,一般通过跳转指令加条件码的形式来实现。可以采用比较指令CMP或者减法指令SUB等实现。参看下面的指令段LOOPADDR4,R4,R0ADDR0,R0,1CMPR0,R1BLELOOPR0小于等于R1场合跳转在做完了两次加法操作后,比较R0,R1的值,影响条件标志。最后的条件跳转语句根据CMP指令执行的结果来决定是否进行循环。例数据块复制本程序将数据从源数据区复制到目标数据区复制时,以8个字为单位进行。对于最后所剩不足8个字的数据,以字为单位进行复制,这时程序跳转到COPYWORDS处执行。在进行以8个字为单位的数据复制时,保存了所用的8个工作寄存器。数据块复制AREABLOCK,CODE,READONLYNUMEQU20;设置将要复制的字数ENTRY;标识程序入口点STARTLDRR0,SRC;R0寄存器指向源数据区SRCLDRR1,DST;R1寄存器指向目标数据区DSTMOVR2,NUM;R2指定将要复制的字数MOVSP,0X400;设置数据栈指针R13,BLOCKCOPY;进行以8个字为单位的数据复制MOVSR3,R2,LSR3;复制次数BEQCOPYWORDS;剩下不足8个字的数据STMFDSP,R4R11;保存工作寄存器,压栈OCTCOPYLDMIAR0,R4R11STMIAR1,R4R11SUBSR3,R3,1BNEOCTCOPY数据块复制LDMFDSP,R4R11COPYWORDSANDSR2,R2,7BEQSTOPWORDCOPY;从源数据区读取1个字的数据,放到R3寄存器中,并更新目标数据区指针R0,后索引偏移LDRR3,R0,4STRR3,R1,4SUBSR2,R2,LBNEWORDCOPYSTOPAREABLOCKDATA,DATA,READWRITESRCDCD1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4DSTDCD0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0END内嵌汇编内嵌汇编(INLINEASSEMBLY)的语法如下_ASM指令指令/注释/指令内嵌汇编的指令用法内嵌在C或者C程序中的ARM汇编指令与普通(ADS)格式的ARM汇编指令有所不同。其主要原因在于C/C编译器在编译C/C源代码的同时要兼顾处理内嵌汇编程序,因此CPU的内部寄存器资源使用有额外约束。以下讲解内嵌ARM汇编指令的用法。ARM内嵌汇编程序的操作数内嵌汇编指令中作为操作数的寄存器和常量可以是表达式。这些表达式可以是CHAR,SHORT或INT类型,而且这些表达式都是作为无符号数进行操作。若需要带符号,用户需要自己处理与符号有关的操作。编译器将会计算这些表达式的值,并为其分配寄存器。ARM内嵌汇编程序的物理寄存器内嵌汇编程序中使用物理寄存器有以下限制。不能直接向PC寄存器赋值,程序跳转只能使用B或BL指令实现不要使用过于复杂的C表达式,因为将会需要较多的物理寄存器,这将导致与其他指令中用到的物理寄存器产生使用冲突。编译器可能会使用R12或R13存放编译的中间结果,在计算表达式的值时可能会将寄存器R0R3,R12和R14用于子程序调用。因此在内嵌的汇编指令中不要将这些寄存器同时指定为指令中的物理寄存器。通常内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而影响代码的效率。其他内嵌汇编程序的编写注意点常量在内嵌汇编指令中,常量前面的“”可以省略。指令展开内嵌汇编指令中,如果包含常量操作数,该指令可能被内嵌汇编器展开成几条指令。标号C程序中的标号可以被内嵌的汇编指令使用,但是只有指令B可以使用C程序中的标号,而指令BL则不能使用。内存单元的分配所有的内存分配均由C编译器完成,分配的内存单元通过变量供内嵌汇编器使用。内嵌汇编器不支持内嵌程序中用于内存分配的伪指令。内嵌汇编程序中的SWI和BL指令SWI和BL指令在两个指令使用到内嵌汇编中,除了正常的操作数域外,还必须增加以下3个可选的寄存器列表用于输入参数的寄存器列表。用于存储返回结果的寄存器列表。用于表示那些寄存器将有可能会被修改的寄存器列表。内嵌汇编代码举例字符串复制(1)INCLUDEVOIDSTR_CPYCONSTCHARSRC,CHARDSTINTCH_ASMLOOP/普通ARM汇编代码中的标号后面不能跟冒号。C程序中/的标号可以被内嵌的汇编指令使用。ARM内嵌汇编代码中/只有B指令可以使用C的标号,而BL指令不能够使用C代码/的标号。C程序的标号后面跟冒号,由GOTO语句转向标号处。LDRBCH,SRC,1STRBCH,DST,1CMPCH,0BNELOOP内嵌汇编代码举例字符串复制(2)INTMAINVOIDCONSTCHARA“HELLOWORLDN“CHARB20/DOINLINEASSEMBLYROUTINESTR_CPYA,B_ASMMOVR0,A/将串A的串首地址送到R0寄存器MOVR1,B/将串B的串首地址送到R1寄存器BLSTR_CPY,R0,R1/调用C函数STR_CPYPRINTF“ORIGINALSTRINGSN“,APRINTF“COPIEDSTRINGSN“,B/半主机方式显示复制前后的两个串RETURN0汇编、C和C混合编程在C/C程序中如果必须使用汇编指令来完成某些操作,可以采用两种方法1采用内嵌汇编,即在C/C源程序中嵌入一块汇编代码,让这块汇编代码来完成特定的操作;2将必须使用汇编代码的部分独立编写成在一个文件中,形成一个子程序,C/C程序可以调用这些汇编程序来完成特定的操作。C/C与汇编语言的相互调用C/C程序与汇编程序相互调用时,应遵守相应的ATPCS,主要有五种调用。ARM汇编子程序调用C语言子程序ARM汇编子程序调用C语言子程序C语言程序调用ARM汇编语言子程序C语言程序调用ARM汇编语言子程序C语言程序调用C语言子程序C/C程序调用ARM汇编程序设计汇编程序必须遵守ATPCS,保证程序调用时参数的正确传递。在汇编程序中使用EXPORT指示符声明本程序可以被别的程序调用。在C语言程序中使用EXTERN关键词声明该汇编程序可以被调用,C语言程序使用EXTERN“C”来声明该汇编程序可以被调用。例C程序调用ARM汇编子程序/MAIN_0522CSEMIHOSTINGOUTPUTMODE/INCLUDEEXTERNINTASMFILEINTARG1,INTARG2,INTARG3INTMAINVOIDINTA11,A22,A34PRINTF“EXAMPLEOFCPROGRAMCALLINGASSEMBLYPROGRAMN“PRINTF“DDD600DN“,A1,A2,A3,ASMFILEA1,A2,A3C程序调用ARM汇编子程序(续)ASM_0522SEXPORTASMFILEAREAMY_PRO,CODE,READONLYASMFILESTMFDSP,R4R6,R8,R7ADDR0,R0,R1ADDR0,R0,R2MOVR4,600MULR3,R0,R4MOVR0,R3LDMFDSP,R4R6,R8,R7MOVPC,LREND例2ARM汇编程序调用C子程序本案例程序比较两个IP地址的大小,A1A4存放IP地址1的值(按照ATPCS传递参数),B1B4存放IP地址2的值(通过栈传递参数),如果I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 长期卧床便秘病人的护理
- 亲子自驾旅行课件
- 景区讲解人员培训
- 关注口腔健康预防蛀牙医疗保健演示模板
- 亲子关系构建课件
- 行政人事工作总结计划
- 公司级爆破企业安全培训课件
- 公司级安全生产培训记录课件
- 《西游记》课件内容
- 事故安全预案培训总结课件
- 职高课件模板
- 【生物】第四节 激素调节课件-2025-2026学年人教版生物八年级上册
- 卫生院安全生产培训课件
- 期中专题复习-词汇句型训练-2025-2026学年 译林版2024 英语八年级上册 原卷
- 2025年全国中小学校科普知识竞赛题库(+答案)
- 2.2创新永无止境教学课件 2025-2026学年度九年级上册 道德与法治 统编版
- 矿山爆破作业安全培训课件
- 2025-2026学年九年级英语上学期第一次月考 (四川成都专用) 2025-2026学年九年级英语上学期第一次月考 (四川成都专用)解析卷
- 高陡边坡稳定性控制技术及其工程实践
- 河南省委党校在职研究生入学考试真题及答案
- 2025年社区工作者招聘考试宗教学试卷
评论
0/150
提交评论