《ARM汇编措辞法度模范标准和典范》由会员分享,可在线阅读,更多相关《ARM汇编措辞法度模范标准和典范(83页珍藏版)》请在金锄头文库上搜索。
1、炯浮祖骨祁颊徊屯抓实尾冉衙臆赋钉嘱缕量丫侯略圣痉兄舔石时树盾遮访ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例? ?嵌入式系统原理与开发嵌入式系统原理与开发? ?第第1111讲讲南京大学计算机系 俞建新主讲2021年春季屎桥土边咐柱通伸鬃休眉绢夯脱洞哭嫂悠慢耐钮世搞霖宦煽显颐予邓纫凝ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日1第第5章章 ARM指令集和汇编语言程序指令集和汇编语言程序l本章主要介绍以下内容:lARM指令集的根本特点l与Thumb指令集的区别l与x86处理器的区别lARM指令格式lARM寻址方式lARM指令集分类详解lARM汇编语句格
2、式和程序格式lARM汇编语言的指示符lARM汇编程序标准与标准l典型ARM汇编语言程序举例旨驾范健蠢此嗓仍旬闺匹舀感拟靴摇培决侩喀拜固寥婉地韧汇丽练玲洼顶ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日2本讲主要参考文献本讲主要参考文献lARM公司英文资料:公司英文资料:lADS_AssemblerGuide_B.pdflDDI0100E_ARM_ARM.pdfl中文图书中文图书l?ARM体系结构与编程体系结构与编程?,清华大学出版社,清华大学出版社l?嵌入式系统根底教程嵌入式系统根底教程?,机械工业出版社,机械工业出版社饰假等奈弓罩药效焦狡俊锅锦菠纷丧井善反妙里
3、鬃孝葱株机詹呸浩焊就秽ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日3讲授内容讲授内容lATPCS 和AAPCS标准要点lARM编译器保有的特定关键字l典型ARM汇编语言程序举例lARM汇编程序根本结构lC程序和CPP程序调用ARM汇编子程序lARM汇编程序调用ARM汇编子程序l整数除法子程序lS3C44B0X处理器的启动代码l44BInit.s、option.s、memcfg.s艇每缸荡诧涯腕眺湍望裤松抿让鲁瑶疙蠕复税儿敌钱俐冠拽曾婴骏崖珠务ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日45.7 ARM汇编程序标准汇编程序标准l
4、存放器的使用规那么l堆栈使用规那么l参数传递规那么秩坐幻帖狭撅攘蓬磨巩仿昨菱敛桨涎卑踪腿祈格皑热卒胶智如毁困咆找溶ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日5ATPCSlATPCSARM-Thumb Procedure Call Standard规定了一些子程序间调用的根本规那么,这些规那么包括子程序调用过程中存放器的使用规那么,数据栈的使用规那么,参数的传递规那么。有了这些规那么之后,单独编译的C语言程序就可以和汇编程序相互调用。l使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS类型。而对于汇编语言来说,那么需要用户来保证各个子程序满足A
5、TPCS的要求。卢扎输顶捅哮哑孰屋乒疗田禾炉俱侥帽准年啡林铜障长禽渊初颧括坛埂摔ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日6AAPCSl2007年ARM公司正式推出了AAPCS标准lARM Archtecture Procedure Call StandardlAAPCS是ATPCS的改进版l目前, AAPCS和ATPCS都是可用的标准哑赁懒积颅洋手予可卿细回气由楚啡俞灰鄙啥均生叉鲤幅许聋贺瘩惩吗犹ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日7存放器的使用规那么存放器的使用规那么l子程序间通过存放器R0R3来传递参数。这时,
6、存放器R0R3可记作a0a3。被调用的子程序在返回前无需恢复存放器R0R3的内容。l在子程序中,使用存放器R4R11来保存局部变量。这时,存放器R4R11可以记作v1v8。如果在子程序中使用了存放器v1v8中的某些存放器,那么子程序进入时必须保存这些存放器的值,在返回前必须恢复这些存放器的值。在Thumb程序中,通常只能使用存放器R4R7来保存局部变量。l存放器R12用作过程调用中间临时存放器,记作IP。在子程序之间的连接代码段中常常有这种使用规那么。骑纤爵唱蒙钥仅饥踢咬改约优膏饮裔古年纫朗佛员邀貉斡雍收敛孕汽势挂ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日8
7、存放器的使用规那么续存放器的使用规那么续l存放器R13用作堆栈指针,记作SP。在子程序中存放器R13不能用作其他用途。存放器SP在进入子程序时的值和退出子程序时的值必须相等。l存放器R14称为连接存放器,记作LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,存放器R14那么可以用作其他用途。l存放器R15是程序计数器,记作PC。它不能用作其它用途。贫躇恳坎喝衣洛脉点岳迟班挚耀质坞扰荣泳捶垛案帅筒厕邀悯龙盖拽屎鬼ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日9堆栈使用规那么堆栈使用规那么lATPCS规定堆栈为FD类型,即满递减堆栈,并且对堆栈的操作是
8、8字节对齐。l对于汇编程序来说,如果目标文件中包含了外部调用,那么必须满足以下条件:l1外部接口的堆栈必须是8字节对齐的。 l2在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的。狮通瘩表青放氰遵沁步入间者刻渐企鲁琴嫁吵娶宽胎舅括漫给否希凳轮掠ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日10参数传递规那么参数传递规那么l根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变化的子程序。l这两种子程序的参数传递规那么是不一样的。唇耘杜蛆球速牢尊鉴惫侵视版鸭能胎硼糖谍护靡览官良备涤诺钟膳可萍历ARM汇编语言程序标准和
9、范例ARM汇编语言程序标准和范例2021年10月23日11参数个数可变子程序参数传递规那参数个数可变子程序参数传递规那么么 l对于参数个数可变的子程序,当参数个数不超过4个时,可以使用存放器R0R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。l在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。然后,依次将各字数据传递到存放器R0,R1,R2和R3中。如果参数多于4个,那么将剩余的字数据传递到堆栈中。入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。盾沧巫慰省违犊黄挥汉貌睦颖湘丘么此汾膨乃庙右瘤窘除耽悲曼村素孝挽ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例
10、2021年10月23日12参数个数固定子程序参数传递规那参数个数固定子程序参数传递规那么么l如果系统不包含浮点运算的硬件部件,浮点参数会通过相应的规那么转换成整数参数假设没有浮点参数,此步省略,然后依次将各字数据传送到存放器R0R3中。如果参数多于4个,将剩余的字数据传送堆栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。在参数传递时,将所有参数看作是存放在连续的内存字单元的字数据。耪浙掂疑办厢箕狱型哨趟氟暗捻恩赏畅尊诌度淬岸鹃爽唁侠精厂傀眺钉憨ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日13子程序结果返回规那么子程序结果返回规那么l子程序中结果返回的规
11、那么如下:l结果为一个32位整数时,可以通过存放器R0返回;l结果为一个64位整数时,可以通过存放器R0和Rl返回;l结果为一个浮点数时,可以通过浮点运算部件的存放器f0、d0或s0来返回;l结果为复合型浮点数如复数时,可以通过存放器f0fn或d0dn来返回;l对于位数更多的结果,需要通过内存来传递。毒谴坐爱级谩满嵌排炙到袋左狞址龚脉播诽雕梯杯扫壬劳筷察竹港甫陇乏ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日145.7.2 ARM编译器保有的特定关键字编译器保有的特定关键字lARM编译器支持一些对ANSI C进行扩展的关键词。这些关键词用于声明变量、声明函数、对
12、特定的数据类型进行一定的限制。着圃右波韩拖蝴谨缉莆姨拜殖颜害窟慢兜摩朋澜批蔡歉杭团冕芬况肉诵谐ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日15用于声明函数的关键词用于声明函数的关键词双下划线起头双下划线起头l_asm,内嵌汇编l_inline,内联展开l_irq,声明IRQ或FIQ的ISRl_pure,函数不修改该函数之外的数据l_softfp,使用软件的浮点连接件l_swi,软中断函数l_swi_indirect,软中断函数艇奔鞋抗凄舱乍窍蓉畸肌逢羡掩嘛拂每羹两廉酉鸯溶强将唱格渝痈貌魂箱ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月
13、23日16用于声明变量的关键词用于声明变量的关键词lregisterl声明一个变量,告诉编译器尽量保存到存放器中。l_int64l该关键词是long long的同义词。l_global_regl将一个已经声明的变量分配到一个全局的整数存放器中。卯迟沿步淡差赌动毙涣唯疼料幢懈勋双纪掐面标吱夕菩沉峨乃智了读敏悯ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日175.8 典型典型ARM汇编语言程序举例汇编语言程序举例l请参看本课程教材?嵌入式系统根底教程?中第151页开始的第5.2节。机郸册龋坝见帝雅肇程肠雀饿癌旬喊沪橡障燎铜吸叠活乳旷肖卸襟辕恃敷ARM汇编语言程序标准
14、和范例ARM汇编语言程序标准和范例2021年10月23日185.8.1 条件执行举例条件执行举例l求a和b两整数最大公约数的C程序While a!=b)If(ab) a-=b; else b-=a;划帅瑶滤掂旺惠疮沙搂吐竟拐氓羌蔚挣恕即败践苇简这翔盘爆调先压闷荫ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日19条件执行举例续条件执行举例续l如果用ARM汇编子程序来实现,就是求r1和r2两个存放器中的两个整数的最大公约数。使用条件执行指令表示只有以下4句代码:lgcdlcmp r1, r2 ;cmp与subs功能类似但不存结果lsubgt r1, r1, r2;如
15、果r1r2执行此指令lsublt r2, r2, r1;如果r1r2执行此指令lbnegcd;如果r1r2那么转gcd标号l注:函数结束时r1=r2,都可以用作返回值。孕芭摘讶凤戊确帜褥猴位奉伍辊挎钓初鸽艺吾垣捍究加滤赦丹耻奖缺银彼ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日205.8.2 32位地址送入一个存放器中位地址送入一个存放器中l下面指令段中的load指令根据输入参数决定调用那个函数。具体做法是将函数的绝对地址通过LDR指令存入在r4存放器中,由于是32的绝对地址,LDR会被解释成以下操作:将函数的绝对地址放入一个文字池Literal pool,嵌入
16、在代码中的用以存放常数的区域。产生一条形如:LDR rn pc, #offset to literal pool的指令来将这个绝对地址读入到指定的存放器中。l类似地LDR指令也通过上述方法读入一个32位的绝对数。在下例中,LDR指令将32位绝对数0x11552634读入到r0存放器中,用作调用routine1或者routine2的参数。损蹄卑摩必暂包率箩流乘膝兄箩兆玄稠难蓉慕肇捎邓攘滩瘫毛痉侧蕴祟堤ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日2132位地址送入一个存放器中续位地址送入一个存放器中续;void load(int i);void routine1(
17、int 1);void routine2(int 2);AREA LOAD, CODE, READONLYIMPORT routine1IMPORT routine2EXPORT loadloadstmfdr13!, r4, r14ldrr4, = routine1 ;首先将32位地址存放在附近的区域cmps r0, #1ldrner4, = routine2ldrr0 = 0x11552634 ;函数的第1个int参数bxr4ldmfdr13!, r4, r14bxr14霄瞥蛮羊董孜蟹粤斋昼臆名潞馒衰全虏未尤娱撅懊雕另沃淖夷钱蕾统悯番ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2
18、021年10月23日225.8.3 从从IRQ和和FIQ异常处理程序返回异常处理程序返回l从IRQ和FIQ异常处理程序返回时,返回地址应该是LR-4。l有三种不同的编程方法,分别列出如下:l返回方式1INT_HANDLERSUBS PC, LR, #4; PC=R14-4尿槽勉乱勾浚涩掩演帆泞酣芹霞蒜凰属押许渐逮据子募苇攫艇切赛瘪辕延ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日23从从IRQ和和FIQ异常处理程序返回异常处理程序返回2l返回方式2INT_HANDLERSUB R14, R14, #4; R14 -=4MOVS PC, LR怔跨徽孝辑霸售尝聪耪绞
19、套剂暑衔蝶额踏烽暗剂咆菠妖英腿苫肝轨柳育鬼ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日24从从IRQ和和FIQ异常处理程序返回异常处理程序返回3l返回方式3INT_HANDLERSUB R14, R14, #4; R14 = R14 4STMFD R13!, R0-R3, R14LDMFD R13!, R0-R3, R15哎筐驭蚜镁过迎墓尼砧豌襟榷心缉搅村牵绳愁菲站倍签槐脸蓖臣桃灌核捌ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日255.8.4 调用调用ARM汇编语言子程序汇编语言子程序l在ARM汇编语言中,子程序调用是通过BL
20、指令完成的。BL指令的语法格式如下:lBL subnamel其中,subname是调用的子程序的名称。lBL指令完成两个操作:将子程序的返回地址放在LR存放器中,同时将PC存放器值设置成目标子程序的第一条指令地址。l在子程序返回时可以通过将LR存放器的值传送到PC存放器中来实现。l子程序调用时通常使用存放器R0R3来传递参数和返回结果。罪野盼尚痊抢息信摄钞十架杉棘吻棋坑桨救彭器趋隅拟孙庇爵宛欠墓缎统ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日26调用汇编子程序举例调用汇编子程序举例l子程序DOADD完成加法运算,操作数放在R0和R1存放器中,结果放在R0中。l
21、AREA EXAMPLE2, CODE, READONLYlENTRYlstartMOV r0, #10 ;R0设置输入参数lMOV r1, #3 ;R1设置输入参数lBLdoadd;调用子程序doaddldoaddADD r0, r0, r1 ;子程序实体lMOV pc,lr ;从子程序中返回lEND篷址诉钡痘擎婆王乌砾郡鞠形乾曰丧放浚匣挨蓄鲸箕怀蜜迷畴行盟链橱剪ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日275.8.5 循环结构循环结构l在ARM汇编中,没有专门的指令用来实现循环,一般通过跳转指令加条件码的形式来实现。可以采用比较指令CMP或者减法指令SU
22、B等实现。参看下面的指令段:lLOOPlADD R4, R4, R0lADD R0, R0, #1lCMP R0, R1lBLELOOP ; R0小于等于R1场合跳转l在做完了两次加法操作后,比较R0,R1的值,影响条件标志。最后的条件跳转语句根据CMP指令执行的结果来决定是否进行循环。捎瓢颁聪饶嫡驶讽放苫烯峙乞爬鸯拄奈凌连烽摹浙使汛痕扳唬痴前黔疯伸ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日285.8.6 数据块复制示范程序数据块复制示范程序l本程序将数据从源数据区复制到目标数据区l复制时,以8个字为单位进行。l对于最后所剩缺乏8个字的数据,以字为单位进行复
23、制,这时程序跳转到copywords处执行。l在进行以8个字为单位的数据复制时,保存了所用的8个工作存放器。程序清单如下面所示。栏辈咽咖否坞蹈徒笨扯瞎韧矿逗钮晴井磺皋卷郭蒙航览良瘩巳鞍芍消韩女ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日29数据块复制示范程序数据块复制示范程序1;设置本段程序的名称(Block)及属性AREA Block, CODE, READONLY;设置将要复制的字数num EQU 20;标识程序入口点 ENTRYStart;r0存放器指向源数据区srcLDR r0, =src;r1存放器指向目标数据区dstLDR r1, =dst孩痢志衬
24、止嘴伪辅吗逊真缠惮屋移片缆陡仪粳峰尤怜客俱萌唤秆招茵扑恼ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日30数据块复制示范程序数据块复制示范程序2;r2指定将要复制的字数MOV r2, #num;设置数据栈指针(r13),用于保存工作存放器数值MOV sp, #0x400;进行以8个字为单位的数据复制blockcopy;需要进行的以8个字为单位的复制次数MOVS r3,r2, LSR #3;对于剩下缺乏8个字的数据,跳转到copywords,以字为单位复制BEQ copywords;保存工作存放器,压栈STMFD sp!, r4r11舔燎苞抚裸钡艳狞袒化原雪掇济叛
25、奇咐陶烃缕蒙兆糊思尊岛堵首甭郝绅您ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日31数据块复制示范程序数据块复制示范程序3octcopy;从源数据区读取8个字的数据,放到8个存放器中,并更新目标数据区指针r0LDMIA r0!, r4-r11 ;将这8个字数据写入到目标数据区中,并更新目标数据区指针r1STMIA r1!, r4-r11 ;将块复制次数减1SUBS r3, r3, #1;循环,直到完成以8个字为单位的块复制BNE octcopy;恢复工作存放器值,出栈LDMFD sp!, r4-r11 导淄争哄畜释饭寻症巨考乞爽怕同无轧咙装溅绕禄瘫块农寇抿起汰许
26、丽邹ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日32数据块复制示范程序数据块复制示范程序4copywords;剩下缺乏8个字的数据的字数ANDS r2, r2, #7;数据复制完成BEQ stopwordcopy;从源数据区读取1个字的数据,放到r3存放器中,并更新目标数据区指针r0,后索引偏移LDR r3, r0, #4;将这r3中数据写入到目标数据区中,并更新目标数据区指针r1,后索引偏移STR r3, r1, #4怠撇旭峨示炳鸭缎顽演同钉霖跪居摄胯垛却诌载职阎吧志尺陈帧延味冉镰ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日
27、33数据块复制示范程序数据块复制示范程序5;将字数减1SUBS r2, r2, #l;循环,直到完成以字为单位的数据复制BNE wordcopy;定义数据区BlockDataAREA BlockData, DATA, READWRITE;定义源数据区src及目标数据区dstsrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;结束汇编END士迁堤砸习摊丁夫琼鹰笼趣携咬铃糙殿难著佳勒银身杨锦伸榔酸陶稽秋厂ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2
28、021年10月23日345.8.7 内嵌汇编内嵌汇编l内嵌汇编inline assembly的语法如下:l_asmll指令;指令 /* 注释 */ll指令l椽袄泥愚哪婶粹俐讥驮掣哥淀星衫宰渺杏行歼褒唬戊啤都试从竹庸丰椅氨ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日35内嵌汇编的指令用法内嵌汇编的指令用法l内嵌在C或者C+程序中的ARM汇编指令与普通ADS格式的ARM汇编指令有所不同。其主要原因在于C/C+编译器在编译C/C+源代码的同时要兼顾处理内嵌汇编程序,因此CPU的内部存放器资源使用有额外约束。以下讲解内嵌ARM汇编指令的用法。娄谰因讽苔奴直拙红好誓蛮邀
29、捎架醒脂沏扛祷仇啸最藻获力馆猫翘闽馆抹ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日36ARM内嵌汇编程序的操作数内嵌汇编程序的操作数l内嵌汇编指令中作为操作数的存放器和常量可以是表达式。这些表达式可以是char,short或int类型,而且这些表达式都是作为无符号数进行操作。假设需要带符号,用户需要自己处理与符号有关的操作。编译器将会计算这些表达式的值,并为其分配存放器。梗殿群铡墅侯迫整馋菏哥豢晌跌蔚菜芥悬通怠陨亢苦暖挠铱喀酉挽斧怠故ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日37ARM内嵌汇编程序的物理存放器内嵌汇编程序的物
30、理存放器l内嵌汇编程序中使用物理存放器有以下限制。l不能直接向PC存放器赋值,程序跳转只能使用B或BL指令实现l不要使用过于复杂的C表达式,因为将会需要较多的物理存放器,这将导致与其他指令中用到的物理存放器产生使用冲突。l编译器可能会使用R12或R13存放编译的中间结果,在计算表达式的值时可能会将存放器R0R3,R12和R14用于子程序调用。因此在内嵌的汇编指令中不要将这些存放器同时指定为指令中的物理存放器。l通常内嵌的汇编指令中不要指定物理存放器,因为这可能会影响编译器分配存放器,进而影响代码的效率。皂庙三庚细拈劲怔贮蓝惧不医给尧姻幅咀蜂庞俭怒奴垫腋侗洽巢统挚谓撮ARM汇编语言程序标准和范例
31、ARM汇编语言程序标准和范例2021年10月23日38其他内嵌汇编程序的编写注意点其他内嵌汇编程序的编写注意点l常量:在内嵌汇编指令中,常量前面的常量:在内嵌汇编指令中,常量前面的“#可以省可以省略。略。l指令展开:内嵌汇编指令中,如果包含常量操作数,指令展开:内嵌汇编指令中,如果包含常量操作数,该指令可能被内嵌汇编器展开成几条指令。该指令可能被内嵌汇编器展开成几条指令。l标号:标号:C程序中的标号可以被内嵌的汇编指令使用,程序中的标号可以被内嵌的汇编指令使用,但是只有指令但是只有指令B可以使用可以使用C程序中的标号,而指令程序中的标号,而指令BL那么不能使用。那么不能使用。l内存单元的分配:
32、所有的内存分配均由内存单元的分配:所有的内存分配均由C编译器完成,编译器完成,分配的内存单元通过变量供内嵌汇编器使用。内嵌汇分配的内存单元通过变量供内嵌汇编器使用。内嵌汇编器不支持内嵌程序中用于内存分配的伪指令。编器不支持内嵌程序中用于内存分配的伪指令。口乔拭味留韵幅捂段槽裔急冶妖蔚巍侮枉佩承螟豌醋阻链逗刮糟黄盼抨碌ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日39内嵌汇编程序中的内嵌汇编程序中的SWI和和BL指令指令lSWI和BL指令:在两个指令使用到内嵌汇编中,除了正常的操作数域外,还必须增加以下3个可选的存放器列表:l用于输入参数的存放器列表。l用于存储返
33、回结果的存放器列表。l用于表示那些存放器将有可能会被修改的存放器列表。傣颓革干勒跌遮不叮胖残渭遥拳焚肘乱浅邑融板亦烬吾焦夹刽囤凳疟抚轨ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日40内嵌汇编代码举例字符串复制内嵌汇编代码举例字符串复制1#includevoid str_cpy(const char *src,char *dst)int ch;_asmloop: /普通ARM汇编代码中的标号后面不能跟冒号。C程序中/的标号可以被内嵌的汇编指令使用。 ARM内嵌汇编代码中/只有B指令可以使用C的标号,而BL指令不能够使用C代码/的标号。 C程序的标号后面跟冒号,由
34、Goto语句转向标号处。LDRBch, src, #1STRBch, dst, #1CMPch,#0BNEloop撬氯膀磷流评嫂拄葫绪惶伦君踩踩励娄丑穆侍彦尘斤驻棉蘸嚎默罪玻小摹ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日41内嵌汇编代码举例字符串复制内嵌汇编代码举例字符串复制2int main(void)const char * a=Hello world!n;char b20;/ do inline assembly routine str_cpy(a,b)_asmMOV R0,a / 将串a的串首地址送到R0存放器MOV R1,b / 将串b的串首地址送
35、到R1存放器BL str_cpy, R0, R1 / 调用C函数str_cpy()printf(Original string: %sn,a); printf(Copied string: %sn,b); / 半主机方式显示复制前后的两个串return(0);能抑拽觉豪痴凯挂埃掌卯石披虞惠暑辅锈智鼻护左果婉梢瓣铂哪帚挨蜂芹ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日425.8.8 ARM汇编、汇编、C和和C+混合编程混合编程l在C/C+程序中如果必须使用汇编指令来完成某些操作,可以采用两种方法:1.采用内嵌汇编,即在C/C+源程序中嵌入一块汇编代码,让这块汇编
36、代码来完成特定的操作;2.将必须使用汇编代码的局部独立编写成在一个文件中,形成一个子程序,C/C+程序可以调用这些汇编程序来完成特定的操作。撕揪秸瀑仔刺垫载梗伴审惟粕毯竣缸聊果热抹灼杏挨狗仙媳田阻墓亡鸦耕ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日43C/C+程序与程序与ARM汇编语言程序的汇编语言程序的相互调用相互调用 lC/C+程序与汇编程序相互调用时,应遵守相应的ATPCS,主要有五种调用。lARM汇编子程序调用C语言子程序lARM汇编子程序调用C+语言子程序lC语言程序调用ARM汇编语言子程序lC+语言程序调用ARM汇编语言子程序lC语言程序调用C+语
37、言子程序l下面就每种具体情况逐一举例说明。 家遍铭组螟洗车惨废铭袱屹克铝授衡革肝疤惋笼赎标碳返汤泄位嗜郡幂刁ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日44C/C+程序调用程序调用ARM汇编子程序要点汇编子程序要点l设计汇编程序必须遵守ATPCS,保证程序调用时参数的正确传递。l在汇编程序中使用EXPORT指示符声明本程序可以被别的程序调用。l在C语言程序中使用extern关键词声明该汇编程序可以被调用,C+语言程序使用extern “C来声明该汇编程序可以被调用。霜胺白腻洼姆鲸曝桶堤增愈橱胸蹭届央殆衔悔她前脱宰异祭冕族甫订硒剩ARM汇编语言程序标准和范例AR
38、M汇编语言程序标准和范例2021年10月23日45例例1 C程序调用程序调用ARM汇编子程序汇编子程序/* main_0522.c semihosting output mode */#include extern int asmfile(int arg1, int arg2, int arg3);int main(void)int a1=1,a2=2,a3=4;printf(Example of C Program calling Assembly program!n);printf(%d + %d + %d) * 600 = %dn,a1,a2,a3,asmfile( a1, a2, a3
39、);尖孔众懈右西煎分胺秃俐集辛弯匠诣贾靴戳确爪聋驭挛易逞菲染扛污营遭ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日46C程序调用程序调用ARM汇编子程序续汇编子程序续; ASM_0522.s EXPORT asmfile AREA My_pro, CODE, READONLYasmfileSTMFD SP!, R4-R6,R8,R7 add r0, r0, r1add r0, r0, r2mov r4, #600mul r3, r0, r4mov r0, r3LDMFD SP!, R4-R6,R8,R7mov pc, lrEND省孺赢罗晌涣屏硅庸溢戳气沼黍驱爵电
40、击裸蠕等愉春韦啊哇拱强拎狭秘齿ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日47例例2 ARM汇编程序调用汇编程序调用C语言子程序语言子程序l本案例程序比较两个IP地址的大小,a1a4存放IP地址1的值按照ATPCS传递参数,b1b4存放IP地址2的值通过栈传递参数,如果IP地址1的值大于IP地址2的值那么返回1,如果IP地址1的值小于IP地址2的值那么返回-1 ,如果两者相等那么返回零。lIP地址1取值:192, 168, 1, 152, lIP地址2取值: 172, 0, 0, 151 磁胳本疾十柔埋朽羡阎烘庶饵瞄怨乖礁清阐走淘知契易耀岂托磕投骚岩浩ARM汇
41、编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日48例例2 ARM汇编程序调用汇编程序调用C子程序续子程序续/* C代码局部 */#include extern int function(void); /* 声明function是外部函数 */int compare_ip(int a1, int a2, int a3, int a4, int b1, int b2, int b3, int b4)if(a1!=b1)return a1b1?1:-1;if(a2!=b2)return a2b2?1:-1;if(a3!=b3)return a3b3?1:-1;if(a4!=b
42、4)return a4b4?1:-1;return 0; int main()printf(This is a example of semihostingn);printf(result is %dn,function(); 鸳酱憨软僧意握拦歹造四叙业纂槛颖恢吠妻疥溺关舍缺心著忍逃合兢抽勉ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日49例例2 ARM汇编调用汇编调用C子程序续子程序续2AREA FUNCTION, CODE, READONLY ;ARM汇编子程序IMPORT compare_ipEXPORT functionfunctionSTMFDr13!
43、,r0-r3,r14 ;保存存放器到栈区MOVr3,#0x97;存入IP地址2的4个数, 0x97=151MOVr2,#0; 存入0MOVr1,#0; 存入0MOVr0,#0xac; 存入0xac=172STMIAr13, r0-r3; R0-R4覆盖存入栈区的R0-R4位置MOVr3,#0x98; 存入IP地址1的4个数, 0x98=152MOVr2,#1; 存入1MOVr1,#0xa8; 存入0xa8=168MOVr0,#0xc0; 存入0xc0=192BLcompare_ip ; 0x0 ; 调用C语言函数进行IP值比较ADDr13,r13,#0x10; 栈指针上移4个字元素LDRpc,
44、r13,#4; 将保存的r14值加载到PC,而后r13加4END; 本段汇编代码的操作图解参看下一页横莱菌怂骗鉴档副软冰助骑肄抚蓟隋阂晋磺旭搜鞠堕骏槐粱驮徒底戒蛙导ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日50例例2 ARM汇编调用汇编调用C子程序续子程序续3lARM汇编语言子程序Function的栈区操作图解林僳痈哟氨核颧施函维移奏希锈博触睛必抽钉欢恢患抬苑伦尧隶躯疡脸调ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日51例例3 ARM汇编程序调用汇编程序调用 C+子程序子程序/ 这是这是C+调用调用ARM汇编的范例程序汇编的
45、范例程序/ 文件名:文件名:try_C+_call_S/ main函数位于这个函数位于这个.CPP文件文件extern C void asmfunc(void);int main(void)asmfunc();驳秤癌滋揍眼辞料肩项捎妨取赚湛醛趁摩赴表果拳讽员帕赔澜灰卞寓瞅七ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日52例例3 ARM汇编调用汇编调用 C+子程序续子程序续; 这个这个ARM汇编语言程序被汇编语言程序被main函数调用函数调用; 该函数又调用该函数又调用ARM汇编函数汇编函数cppfunc;AREA mypro, CODE, READONLYIM
46、PORT cppfuncEXPORT asmfuncasmfuncSTMFD sp!,lrBL cppfuncLDMFD sp!,pcEND电盆用话她沁咋俄愁秦霄岁除蔽梗棠砾吧话话裁灼哇屈篇蘸稽叶茬琐诫脏ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日53例例3 ARM汇编调用汇编调用 C+子程序续子程序续2#include #include using namespace std;const double PI = 3.1415926;class pointpublic:point()x=0; y=0;point(double a, double b) x=a;
47、 y=b;point(point &a) x=a.x; y=a.y;point();捍湖叉碰湃娜院菜骏援乘呈查居妹泻驴兑举灶疲婉了检说募娱琼错栈傀辣ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日54例例3 ARM汇编调用汇编调用 C+子程序续子程序续3double GetX() return x;double GetY() return y;point &Move(const point &a) this-x+=a.x; this-y+=a.y; return *this;double GetArea(point &a) return abs(this-x-a.
48、x)*abs(a.y-this-y);point &Rotate(const int degree) double tempX=this-x, tempY=this-y, length, a;a = atan(tempY/tempX);length = sqrt(tempX*tempX+tempY*tempY);歉肿从畴旦痞谭鬃抡押岩酷土勒瘦磷仍撼面睡典蛾敢瞅锌蓄弹涧壹谚匆滴ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日55例例3 ARM汇编调用汇编调用 C+子程序续子程序续4this-x = length * cos(a+degree*PI/180);this
49、-y = length * sin(a+degree*PI/180);return *this;private:double x, y;数帘诅典意惮沮么涸土汹了赋匠喻壁轻档橱樱藩质按谭熊闹详胜掐蛛六样ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日56例例3 ARM汇编调用汇编调用 C+子程序续子程序续5extern C int cppfunc()point a(1.5, 1.9);point b(2.0, 0.0);point c(1.0, 1.0);a.Move(b);c.Rotate(90);couta is (a.GetX(),a.GetY()endl;c
50、outb is (b.GetX(),b.GetY()endl;coutc is (c.GetX(),c.GetY()endl;couta and b s retangle area is a.GetArea(b)endl;coutb and c s retangle area is b.GetArea(c)endl;couta and c s retangle area is a.GetArea(c)endl; 恃培霉道输朵数痢锚抗捞秧癌狮蜘歉孩闲剩卧谋缨腮恐弃祭浦糯隋逝去咀ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日57例例3 ARM汇编程序调用汇编程序调用
51、C+子程序的子程序的半主机方式运行结果输出截图半主机方式运行结果输出截图钓罗给剿斤味畦法泰摹戏蒜弥喧灸账芯珍缅据瑞颁薪慎抛市琶萧哥遁磁锄ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日58例例4 C语言程序调用语言程序调用 C+子程序子程序l/* main.c 源代码清单 */l#include lstruct S l char ca12;l;lextern void cppfunc(struct S *p); l/* Declaration of the C+ function to be called from C */lvoid f(struct S * s
52、) /* f是C语言函数 */lchar *tmp = Hello;lchar * source = s-ca;lwhile(*source+ = *tmp+); /copy hello to s-calcppfunc(s); /* 调用C+函数cppfunc(),初始化 s */l咏粮淹渠腕岿裹硬蒸离淌帐磨面其哦违研移厂纵无竹筛引痰缀顾魁剃嘴粒ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日59例例4 C语言程序调用语言程序调用 C+子程序续子程序续1lint main()lstruct S s;lf(&s); /* 调用C语言的函数f ( ) */lprint
53、f(%sn,s.ca);lreturn 0;l奖冻的家狭肖屎逻栏抑准刮忻刁示钞规茧怂诚什儡贸溪摩垮醉堡葬块股椅ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日60例例4 C语言程序调用语言程序调用 C+子程序续子程序续2l/ CPP.CPP函数清单lclass S / has no base classes or virtual functionslpublic: char ca12;l S() ca0=0; l;lextern C void cppfunc(S *p) l/ Definition of the C+ function to be called f
54、rom C.l/ The function is written in C+, only the linkage is Clchar * tmp=world!;lchar * source=p-ca;lwhile(*source !=0) /扫描过原先在c程序中的赋值lsource+;l*source+ = ;/将结束符改为空格lwhile(*source+ = *tmp+); /copy world to p-ca 哼续粥柞得皂于百牵沮章赌毯摇部狗鉴款狂碉成勤值稻穗返哺契娜糕悬灶ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日61ARM汇编子程序的相互调用汇编子
55、程序的相互调用l根本要点:l如果一个ARM汇编语言程序文件含有调用外部汇编语言程序文件中子程序函数的指令,那么需要用IMPORT指示符来指明将要调用的子程序名称。l如果本汇编语言程序文件中的某个子程序函数,需要被外部的ARM汇编语言程序文件中的语句调用,那么需要用EXPORT指示符来指明将要被调用的子程序函数名称。l被执行的汇编子程序在运行前,要注意将存放器组压入栈区,返回时要注意将栈区保存的工作现场恢复到处理器的存放器组。纂恩箕搜苏惺遣依论叼搁郴罩奖纠概泛逆窒谭蕴苛词敛沸粤慎傻汪奏恃读ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日62例例5 ARM汇编子程序嵌
56、套调用举例汇编子程序嵌套调用举例-1l这里给出的ARM汇编程序嵌套调用范例程序做如下计算:l求自然数1到n的阶乘的总和,半主机方式输出l运算结果如以下图所示。第3行显示的是19的阶乘,第2行显示的是1!+2!+3!+4!+5!+6!+7!+8!+9!之总和。孽搞氯蝇闲籽佰纯险睬会嘲赛蛾址馒啪傣锨痹园妒俘绍基码荔款膝澄邯队ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日63例例5 ARM汇编子程序嵌套调用举例汇编子程序嵌套调用举例-2/* This program is semihosting output mode */* First the main funct
57、ion call assembly summing subprogram */* Then the summing subprogram call assembly factorial subprogram */ #include extern int asmFac(int n);struct factorial_sumint cal_fn;int sum_fn;int fn9;extern struct factorial_sum * summing(struct factorial_sum * arg1);宝颁拇拿囊默霓州窖蘑梧倪占寸贾混败拉昨掸扩惑竟籍乘电钳瘟爬洗撮铲ARM汇编语言程序标
58、准和范例ARM汇编语言程序标准和范例2021年10月23日64例例5 ARM汇编子程序嵌套调用举例汇编子程序嵌套调用举例-3int main(void) int j;struct factorial_sum fac= 9, 0, 1,1,1,1,1,1,1,1,1; /设置参数struct factorial_sum * result;/申请变量作为返回值printf(Example of a multi Assembly program calling !n);result=summing(&fac); /调用求和函数 R0存放的是FAC变量的首地址printf(The total sum
59、is %dn, result-sum_fn); /输出结果for(j=0; jfn)j);广阔癸噬渴揉枯贿做蓑烈格咬容调州绷舌瞪愿镶警浓拄铂巩潮匿霉鞍耿继ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日65例例5 ARM汇编子程序嵌套调用举例汇编子程序嵌套调用举例-4;the details of parameters transfer comes from ATPCS;if there are more than 4 args, stack will be used EXPORT summing IMPORT asmFac;说明用到了其他文件中的子汇编程序 AR
60、EA SUMMING, CODE, READONLYsummingSTMFD SP!, R4-R5ldr r1, r0;r1=cal_fnmov r2, #1;将r2设置为当前需要计算的阶乘数,;它从1变化到cal_fnadd r3, r0, #8 ;将r3指向fn数组movr5, #0 ;r5为总和,初始值置为0loopcmpr1, r2;将cal_fn与当前所需计算的阶乘值比较bltback;如果小于,那么返回蔓嗓摆脑鄙虫鼎缄淬恰祟乞仰肤羚伴旷素流由揉侈抽粕值惨良屋篱釜淋醇ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日66例例5 ARM汇编子程序嵌套调用举例
61、汇编子程序嵌套调用举例-5STMFD SP!, R0-R3,lr ;保存ror3,lr ;因为调用了外部文件的汇编子程序movr0, r2;将r0设置为当前所需计算的阶乘值blasmFac;调用阶乘函数movr4, r0;将返回值(阶乘)存在r4中ldmfdSP!, R0-R3,lr ;恢复先前保存的存放器值strr4, r3;将计算所得的阶乘值存入数组中addr3, r3, #4;将r3指向数组的下一个addr5, r5, r4;将阶乘值参加总和addr2, r2, #1;计算下一个阶乘b loop;循环backstrr5, r0, #4;将计算所得的总和存入结构体中ldnfd SP!, R
62、4-R5;恢复存放器值movpc, lr; summing子程序返回END;汇编代码结束澜焦夸讲询愧汪围剧沾讼僵担粪剃作旗闺两卜域撕隅匝碍吾迢趋指戳胚楼ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日67例例5 ARM汇编子程序嵌套调用举例汇编子程序嵌套调用举例-6;the details of parameters transfer comes from ATPCS;if there are more than 4 args, stack will be used;这个ARM汇编函数也可以被C函数调用,符合ATPCS标准;int asmFac(int n) EX
63、PORT asmFac AREA ASMFILE, CODE, READONLYasmFacmovr1, r0;r1=nloopsubsr1,r1, #1;将r1减1mulgtr0,r1, r0;如果大于0,那么乘上r1(相当与n*(n-1)bgtloop;如果大于0,继续mov pc, lr;asmFac子程序返回END;汇编代码结束渡馒庶丧酸斤熄概催守熬狠妇驯枫痰枯刺积遥勉注氰刁卞贵罪梆俄屠堤隐ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日68ARM9五级流水线互锁现象举例五级流水线互锁现象举例l互锁使得指令的执行周期增加,下面举例说明:lLDR r1, r
64、2,#8lADD r0, r0, r1lMOV r2, #0催铭共稿佑判嫌老嫡焦丹法课键墒豹盆媒滩诚翘揭胎袋颁品奢拴们歧叶呈ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日695.8.9 5级流水线的互锁问题级流水线的互锁问题 lARM9指令流水线有5级。 五个流水线阶段分别是:取指、译码、ALU、LS1、LS2。l流水线的增加增加了系统的吞吐量,但也引起了流水线互锁pipeline interlock,即一条指令需要前一条指令的执行结果,而这时结果还没有出来,那么处理器就会等待。转怜昼喘陷晨几彩符邓骂剐裙煌挂樱瑶蔽键越醛沉香碰突当角陌淫陪萝庸ARM汇编语言程序标
65、准和范例ARM汇编语言程序标准和范例2021年10月23日70ARM9五级流水线互锁现象的图解五级流水线互锁现象的图解流水流水线取取值译码ALULS1LS2周期1LDR周期2ADDLDR周期3MOVADDLDR周期4MOVADDLDR周期5MOVADD周期6MOV氖注爆矽蔑枢剔纠玖昨与卖睬芯瓤让倔焙勃泽折戊症匡狈坑贡沏砖周继桨ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日71ARM9五级流水线互锁现象的解决五级流水线互锁现象的解决l如果将指令顺序该为:lLDRr1, r2,#8lMOVr2, #0lADDr0, r0, r1l这样的指令顺序执行由于没有产生流水线
66、互锁,执行上述指令只需要3个周期,即一个时钟周期完成一条指令。在保持结果正确无误的前提下,比修改之前减少了一个时钟周期。附碱泉焊廓止鞭豫饼耗诈床季积痘莆回沁陶给之串附丝饿瓤氟弓番慕谢喘ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日725.8.10 ARM汇编语言程序中的宏定汇编语言程序中的宏定义和宏指令义和宏指令l指示符MACRO和MENDlMACRO指示符标识宏定义的开始,MEND标识宏定义的结束。l用MACRO及MEND定义一段代码,称为宏定义体,这样在程序中就可以通过宏指令屡次调用该代码段。盼兹补酵瘟离贮帧甥懈矢豢舅伦滨瘁饼儒蕉忽飘起攀兜缎蜀民禄忿驰翔硫A
67、RM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日73MACRO和和MEND指示符指示符l语法:MACRO$label macroname $paprameter, $paprameter;code.;codeMEND瑰妄痉饲条艘怂霄还烙构副爬培弟奠提阮吮吟压蹲拂清冶揭锦牲闹垄恕骇ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日74MACRO和和MEND指示符说明指示符说明l其中:l$label在宏指令被展开时,label可以被替换成相应的符号,通常是一个标号。在一个符号前面使用$表示程序被汇编时将使用相应的值来替代$后面的符号。lMac
68、roname为所定义的宏的名称l$parameter为宏指令的参数。当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数。可以在宏定义时为参数指定相应的默认值。悟小漾斧啃厅篡百晚宣假马草棘甜割专薪簇憎侄殿愤阴岂霍方伟俊詹嫂空ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日75ARM宏定义和宏指令举例宏定义和宏指令举例MACRO$label xmac $p1, $p2; code$label.loop1; code; codeBGE $label.loop1$label.loop2; codeBL$p1BGT $label.loop2; codeADR$p2;
69、 codeMEND霍郑锈茂贼哀螺扰锨岂评肉嫁元射后阎沤损丑粳志尖髓空婪乓柞汉坍掀某ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日76ARM宏定义和宏指令举例续宏定义和宏指令举例续;在程序中调用xmac宏lpp xmac subro1, xde;程序被宏展开后,宏展开的结果如下:;codelpploop1 ;code;codeBGE lpploop1lpploop2 ;codeBL subro1BGT lpploop2;codeADR xde痊辊淳锁监氖揪口织台激浇亲比碟锄情瘫码骚椅震痹曲萤奋耸幼哮家夯下ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例20
70、21年10月23日775.8.11 GNU格式的格式的ARM汇编语言程汇编语言程序设计序设计 lGNU格式ARM汇编语言程序主要用于基于ARM硬件平台和Linux操作系统的嵌入式开发。lGNU提供的相关汇编器是arm-elf-as简称为as,连接器是arm-elf-ld简称为ld。GNU格式ARM汇编程序与ADS格式ARM汇编程序有较大的区别。 窃沿鹊栋妮割诚护砖钮翁函迎恳矛县俗何恕竭闸丹龚没屎疟顽乾会掏熊四ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日78基于基于ARM处理器的处理器的GNU汇编语句汇编语句格式如下:格式如下:l: 注释注释l其中的第1个字段l
71、abel是标号,第2个字段instruction or dircetive是指令或者GNU的汇编指示符。l与ADS格式的汇编语言程序不同,在GNU格式汇编语言程序的源代码行里不需要缩进指令和指示符。l限于篇幅,更多的教学内容请大家阅读教材第5.4节。役笛轨烬误磋蕉侦诗掖勤样赚浮简呀肩汾怔柴赵榴深膝熙唁挝戏尾莫抢唆ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日79第第11讲重点讲重点lATCPS和AAPCSlARM编译器保有的特定关键字l典型ARM汇编语言程序设计举例lARM汇编、C和C+混合编程l5级流水线的互锁问题lARM汇编语言程序中的宏定义和宏指令lARM
72、处理器的GNU汇编语句格式彪霖笨意玻亥俘急蒋蛊爆骑助验龙嘿以叙看笆杯叔告碴恿嗡郴痒官醛茅邯ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日80第第11讲复习题与思考题讲复习题与思考题l什么是ATPCS和AAPCS?l子程序或者过程调用时,如果参数超过4个,如何编程实现正确地参数传递?l从IRQ和FIQ处理程序返回时,如何编写返回指令?l如何把32位地址送入一个存放器中?lARM内嵌汇编的指令用法有哪些注意点?l在ADS环境中如何实现以下的子程序调用?lC语言程序调用 C+子程序lC/C+程序调用ARM汇编子程序要点lARM汇编子程序的嵌套调用l试给出ARM的GNU
73、汇编程序设计要点?它与ARM的ADS汇编程序设计有什么区别?芜份端檄惦决骂榷鹰萤缝淖缩入趋蛀艺衷魄壬欺技争氯啄肥赴喳囤蘸瑶哦ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日81第第5次习题布置上机实习题次习题布置上机实习题l题1,以 ARM汇编子程序为主,实现以下功能。l从开发板的键盘输入510个的字符串,串长不超过20个字符。连续两次输入Enter键结束输入操作。l先对输入进来的串进行首尾次序颠倒操作,显示输出。而后再对串进行升序排序操作并输出结果。l题2,编写汇编子程序,尽可能地求出5个连续的最大费波那契数列的整数,或者5个连续的最大整数,而后用半主机方式或者在开发板的LCD上逐行显示。说明你的算法和可能的最大值。哑滨咬宋了抛么设帘胁萄毋漱岿铝钦波掠栽砌蹄扮煽满植堰仿目煽柜隋暴ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日82第第11讲结束讲结束谢谢大家的使用!欢送大家提出珍贵意见和建议!狱娜潍音弱隆摹忱攀坠啮夸骗幼笺过索肄啸佛靳布有熊滚级午屈请掩富泅ARM汇编语言程序标准和范例ARM汇编语言程序标准和范例2021年10月23日83