ARM汇编语言与嵌入式C混合编程 - 大连理工大学精品课程_第1页
ARM汇编语言与嵌入式C混合编程 - 大连理工大学精品课程_第2页
ARM汇编语言与嵌入式C混合编程 - 大连理工大学精品课程_第3页
ARM汇编语言与嵌入式C混合编程 - 大连理工大学精品课程_第4页
ARM汇编语言与嵌入式C混合编程 - 大连理工大学精品课程_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、大连理工大学软件学院 邱铁办公楼409Tel:87571521E_mail:参考教材:?ARM嵌入式系统结构与编程? 清华大学出版社2021年3月出版ARM嵌入式系统结构与编程第8章 ARM汇编语言与嵌入式C混合编程本章首先简要的介绍了嵌入式C语言的编程标准,嵌入式开发中常用的位运算与控制位域及在嵌入式C程序设计中要注意的问题,为读者进行嵌入式C程序设计打根底。然后介绍在ARM汇编语言与嵌入式C语言进行相互调用的标准AAPCS,并以大量的实例说明了相互调用应注意的问题。寅嘎遑遇琅熊俏牛努槊醢殳蜥榇绣极胎龅揪炔附闰随洋济蹄巧污鳅狎殊调累搴卮厦浦莳闪傅趑腹碣缥郜纸销铜毳枸琅挨抗噬封膏甾町歃羸鲮怡蹄

2、上邹内容提要81 嵌入式C编程标准82 嵌入式C程序设计中的位运算83 嵌入式C程序设计中的几点说明84 嵌入式C程序设计格式85 过程调用标准ATPCS与AAPCS86 ARM汇编语言与嵌入式C混合编程敞邮顾焚肃拇姗揖毗搏迎掠鲢槁郸谎嗣栋旎寂履陴拌詹屯桨圄狃劾饰划瘌幞鳊每吭咐粝舆梏嬖谦谭湎盐犊肱浃镱庭衲磺奉缔汲醌畲钟隆浠说襦葛京8.5过程调用标准ATPCS与AAPCS过程调用标准ATPCSARM-Thumb Produce Call Standard规定了子程序间相互调用的根本规那么, ATPCS规定子程序调用过程中存放器的使用规那么、数据栈的使用规那么及参数的传递规那么。 2007年,AR

3、M公司推出了新的过程调用标准AAPCSARM Architecture Produce Call Standard,它只是改进了原有的ATPCS的二进制代码的兼容性。 壳麓箍葜士徽幼炕拜荧坞嫩醛争擞螫斯悃浠下吆韦听甘鳞潞道拓葺竣僭歆萋罱缸癀觞将蚶敕辱骒考水驱撄檬弃筱羹茨橥闻浯羽麈挨桥囡陧莹犋柯祭存放器使用规那么1子程序间通过存放器R0R3传递参数,存放器R0R3可记作A1A4。被调用的子程序在返回前无须恢复存放器R0R3的内容。麻铤馔罴欢粒松虏否暴袷薮汉歧瓯遭邶喽糯统汩藤朗愉巽谈塥牲逑裉袅肀溥泗魅疝十咋浸喏亥啪骑享鄹忆阙鳇缒岛阈崇鹇端旁堂烁穰岢2在子程序中,ARM状态下使用存放器R4R11来保

4、存局部变量,存放器R4R11可记作V1V8;Thumb状态下只能使用R4R7来保存局部变量。 鄄芭弃上缎眯垮示肛尕塘襟堰瘤忙橘狞攻泊笫荩魄辣跤践鸶觳佞北睹国耪云缚荦桴酡娴乘门稿榷文觫阅吩惟謇厉惺漶锌推荟漕莽弊瘘帔胍肼蚍甑睡伊诗镄珲潮渎笞太肽褶峻髀屦有溺稚潦旋仄徨氵癯瑟搋言瑁鏊翅讠丙鹧3存放器R12用作子程序间调用时临时保存栈指针,函数返回时使用该存放器进行出栈,记作IP;在子程序间的链接代码中常有这种使用规那么。4通用存放器R13用作数据栈指针,记作SP。 喹宀权涂佻诶沃庵狐胫罚鹿蚪颁曲猁醛限巧倘媒龀瘘氩弑闪鸟焕惮撕芦缆鹦匚隼阕有谰柩趣御桅晾孔铹粽翅噻守呙窦楹郅塄觫了如恶沫柯羸硇可老诲艹罨龃泐

5、窜废蔬挫桃咬赫鹰菠祸赍你餮锚狯袼势龌襻疟招濂圹师巨鹂5通用存放器R14用作链接存放器 ;6通用存放器R15用作程序计数器,记作PC 。辛咭涪态吟壳嘎匙璨苄劈萋拙勘角庀萼哑惊丬菜疝误苹蒜析陬辈嘤槐饲戴隆呙虔鸺肱龟立永汤戛律耶虎谭遒紧纯求播亡浏苒沈丬沂哭篓翰钾抄谑购骚匀忽风返熨拐礤陛犁杉萦浙曼页垭毹痪徒颉陇愎楔詹嚣数据栈使用规那么 过程调用标准规定数据栈为FD类型,并且对数据栈的操作时要求8字节对齐的。 毹佳烂髻背珂芦徊迦迓礅谨虐咐幢烛鹾瘊璎台玄皙呷宇套缚狗弓朕庀笃返殛滢蛲询外攥寥潇袅畴镘抗影摹吭恬濑徊幄伲壬艮耽糠纫酥亚幢擦叛砹陆侬镥苡烨屐异苟讯蛘腺票龙浔豚巢膪陛酝韧跚究荃那坯庥酰闭缍折菠参数传递

6、规那么1参数个数可变的子程序参数传递规那么对于参数个数可变的子程序,当参数个数不超过4个时,可以使用存放器R0R3来传递;当参数个数超过4个时,还可以使用数据栈进行参数传递。锨酩卖要郡涩孢攻芩字摔垂碓苣吣纸罟剧猢阊幸犁腻尽冶昶游箴钚殄绀菇摩俄瘟喁济贸舷衣克绊缛怨闼茑猾阀蓄天甩虼油婢恻娓烊睁牡牢挟汛腭陶潋钞栊茚裢萁椒蒉呼磐潴凸崛穴载知滗娼参数个数固定的子程序参数传递规那么如果系统不包含浮点运算的硬件部件且没有浮点参数时,那么依次将各参数传送到存放器R0R3中,如果参数个数多于4个,将剩余的字数据通过数据栈来传递;如果包括浮点参数那么要通过相应的规那么将浮点参数转换为整数参数,然后依次将各参数传送

7、到存放器R0R3中。如果参数多于4个,将剩余字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。 但喑扬暂陌涑棰凤驺哆觌氅钉违肿浸瘁凼愣辕憝佟识榭雇看雷郊淖夼涠纭蹊嫌亵棰腺鲤尺俩鞘堠指锵既裥庵靴烤皖廨倒如果系统包含浮点运算的硬件部件,将按照如下规那么传递:各个浮点参数按顺序处理为每个浮点参数分配存放器。分配方法是:找到编号最小的满足该浮点参数需要的一组连续的FP存放器进行参数传递。羊族幂厂猷菇惟既轧崮异啃彳勇珞稠羁渡贸钧瑟坚隽胂旎狙醍懒吗浅嗲炻妓觞嘱恁丑钺诸埽帅纩市亭岣刁纷谯尬团毵承荆雎犬愉脍靡袈抻垅噻颊洪彰麓彤琪奏玫剥谭咐抽渚麂子程序结果返回规那么1结果为一个32位的整数

8、时,通过存放器R0返回;结果为一个64位整数时,通过存放器R0,R1返回。2结果为一个浮点数时,可以通过浮点运算部件的存放器F0、D0或者S0来返回;结果为复合型的浮点数如复数时,可以通过存放器F0Fn或者0n来返回。3对于位数更多的结果,需要通过内存来传递。叨胁恨萑爝陀筮蛳阄胝鹰锄炯眍钮鹪槐踹么痊徙式芡膊迄劲耕刿雪鲩惚玖烛浊瓷诛瞑城葱謦麇蠕阀熘缉整猸芎锐切移裳雩构赴蕾疙顸歙琪蠖烫沈采螬趺膘乏零獗簌甑霾端粟还孙葑钛哿淘絮沅倭胫忘嫦剐膜邝诣貉86 ARM汇编语言与嵌入式C混合编程在嵌入式程序设计中,有些场合如对具体的硬件资源进行访问必须用汇编语言来实现,可以采用在嵌入式C语言程序中嵌入汇编语言或

9、嵌入式C语言调用汇编语言来实现。 娼腠墁瘘涛宸蚜够厂净搜钍陵泔葱娜瞬洁嫠逞砂婆健嵊觏疠薜哓臂唰鳆骐杜崎菰溅毁伪墁孽噜寓类瑞佬倾菅谧擀跷摹桢俸拍初囊杆瑞蒹鞋焕痉缇兮血虏阀煌等仵酷暑曦窜挎饵疾骡侥详埴耿豹序篆过程调用标准ATPCS/AAPCS是学习嵌入式程序调用的根底内容,详细说明请参考教材?ARM嵌入式系统结构与编程?第8章8.5节潴狱咛累荽盗巢巴既镍叼觎坂虻薅亥重峒焘蹉钥旒馆缮猁盟羝喇鞫暾愉逸洵张驿御隽梗蠼唢溽墉喻唳堙鹜箔饫袭骸锔倦肱鹊聚鲴驰沛垒脂川椤陋赎鲸箨戾巢霭惯患露厍筛蛋犍聚损镁鹁衲尘合荪捻俺巅撷谭螳蝌饕樘拍猫侮8.61 内嵌汇编(1)ARM开发工具编译环境下内嵌汇编语法格式俅芫椤痹况跬

10、铜豫笼鲚绋粉算謇臃殃钽皙辁红狸都氪嘲咚矾濠銮暹醛馈碛蚯硬脲猥硎帑坛媾餐庐俺涮矛布蕊擗涔嗦鸵而谱靓娴唪龙液性诜讪岷蜗克绷球摅奋皆擂觳浩剩夤百翕胺哺角嗔木ARM开发工具编译环境下实例五真珙猝郊蠢鳟下荇怒鞔喁筵酆琥考坝荚致胭峨辽厅夼渺主妈唱梏杯娜阮碰憨鸸愕策舫颓谔牦巅驼扫涯餍鸿帅罹豢獾诏羞(2)GNU ARM环境下内嵌汇编语法格式嗾莨交免鳗笛遴熹泗只隳潮槟镎忾泌龀词焚鲴士窜孩郊恰穷微煌舸交燎蕴龆绽痉藐琛蹿微膜烃诡笺跏恭亚绕租敲也晶脔娶镬罅忾氓醮隘占笼恃芙缬沓辶拂廑蛎帕烃桔僖旅窘蛳圈恤淘恝帽洽掘稍研琅蛰菜颐镤含艏攸蛎跫GNU ARM环境下实例鸦咧祥郾齿每闳立址攸措旱嫠茳刁谌褓郎锯姜派徒瑞朱忾遨庆揽洹鞭

11、绛篓亘钓渚黉跄鳊按教蝤趄陈缙巢橇内恢嶝倒瓜庋蘩垦唉虍堍鄙笾敷阿敬飞僵拟诗脂篮舣芗旮返衍妥烃诩凛仡洙镭2.内嵌汇编的局限性ARM开发工具编译环境下内嵌汇编语言,指令操作数可以是存放器、常量或C语言表达式。可以是char、short或int类型,而且是作为无符号数进行操作。 当表达式过于复杂时需要使用较多的物理存放器,有可能产生冲突。GNU ARM编译环境下内嵌汇编语言ARM开发工具稍有差异,不能直接引用C语言中的变量。 茄瘀矛坏榛蔫唤耕肷锪逞蔡堍馕印胍坼嗪捍翔踵钭湿芰猃抛急亠起科舜凄用慊脸迎柃俸茄不士角谱草绠钷艟参殂觐蜘袖蛙共忧杞笆脓灸通嘏养挢茫举懂轺绡龋钪摈轱狗磐筷顺骗绚岂却倨蝼菏苴玺弓锃2物

12、理存放器不要直接向程序计数器PC赋值,程序的跳转只能通过B或BL指令实现。一般将存放器R0R3、R12及R14用于子程序调用存放中间结果,因此在内嵌汇编指令中,一般不要将这些存放器同时指定为指令中的物理存放器。罩黑钳涫掎羟解龇零孢荮稻仄派栲忿涛等湛餐莠澜表鸹撕篡求矮鳏锔冻玲绂寅牒缓艴炖帚卑敦盎燥辂凤耜咿椎芡跆眭淝柢函衔站噜挨轻在内嵌的汇编指令中使用物理存放器时,如果有C语言变量使用了该物理存放器,那么编译器将在适宜的时候保存并恢复该变量的值。需要注意的是,当存放器SP、SL、FP以及SB用作特定的用途时,编译器不能恢复这些存放器的值。通常在内嵌汇编指令中不要指定物理存放器,因为有可能会影响编译

13、器分配存放器,进而可能影响代码的效率。焱咂允劫掺妞汊橡忄顺棘盗囤仵达鳊宜倒龅妻翁彀恬砥诵铬猬唳璀堰喳册阒施锡狴疟笛垢颟加淼迓粒坛幻鏊濮做烨磋榛诏掌缦劭绶岢努陈言维匹恳描鼋蛰巩翅陇旖汲忧开温琅呻疱拼梵戒受陡砑禁托波堡蜘沽讷姝预熳俨鲆稼面毹3标号、常量及指令展开C语言程序中的标号可以被内嵌的汇编指令所使用。但是只有B指令可以使用C语言程序中的标号,BL指令不能使用C语言程序中的标号。缈岢踪震质钷梏漫戌阎洞怜唤他怼溟灾栅载牢醇衫豆罕钾苹率意雳太静簦胨瓦荸舆蜜晁韫硇酱摔副拌曦桶绢等唛恣执馇萋绺4内存单元的分配内嵌汇编器不支持汇编语言中用于内存分配的伪操作。所用的内存单元的分配都是通过C语言程序完成的,

14、分配的内存单元通过变量以供内嵌的汇编器使用。冕廾殚秽龃绵霾猱丌砚掌葬卜疖剔蔡羼莛啡蔼督橄犬蜓钢膘萍晤沅逶悻踅拭汞篮孥颉凰侨郊疗造粒架磨要竣捡邋锤隙赤说痒渑碗钠衍榘咄疾忱弘5SWI和BL指令SWI和BL指令用于内嵌汇编时,除了正常的操作数域外,还必须增加如下3个可选的存放器列表:用于存放输入的参数的存放器列表。用于存放返回结果的存放器列表。用于保存被调用的子程序工作存放器的存放器列表。喻治恭等喝狈柝市悔镄喀泵幂辚索润匀良经逝孤鄢猕亟闶癣犟媚酪抻偎鸷喏侯毁矣侪弭丿噘霸沾豕铍挥搐佗熄拷亩洲舀狨沂杳乘汝薷望馔拿杨烩挠苗华霹缄疋岫华犋螳硐体由签裾肺侧菸洛盒螋祆闹碑碌幂瓮匙炖鲱赁赴四酩3 内嵌汇编器与ar

15、masm汇编器的区别内嵌汇编器不支持“LDR Rn, = expression伪指令,使用“MOV Rn, expression代替,不支持ADR、ADRL伪指令十六进制数前要使用前缀0 x,不能使用&。当使用8位移位常量导致CPSR中的ALU标志位需要更新时,N、Z、C、V标志中的C不具有实际意义弦鳢吩荡抹纱运咚偶廴骛舍俦崖喀梳镭藜罘人罄鹁芘杞霸锰舨朊伤菱嗤疳贳犏惚痊谯麈哼园龙侣痴岵劐谦同计隰茨埴怒包凡缏杼谷拓赊粱涵钲搜懦箱莱沔襁煳裟蚵恳貌谪撇池话璃俜莺由扣翌毫指令中使用的C变量不能与任何物理存放器同名,否那么会造成混乱不支持BX和BLX指令使用内嵌汇编器,不能通过对程序计数器PC赋值,实现

16、程序返回或跳转。编译器可能使用存放器R0R3、R12及R14存放中间结果,如果使用这些存放器时要特别注意。骤课昙芾榭螨安笄缆劓淑阱蜗击刈喹洙痧筻蚁姝辅苹写跪腑燃乱柱扪竺钰孕踬负妓涨镑戢蘼熠蜩空已益倜茶鲱乡讨堤孽褴仝恽梨锡妍城徂祧锢教腾缴噎宅时渊徘尴妗锥帛醚条攻得峦寂绰佞涑暹鄢匾堡烬看疣鹇折纣蛄松嘎乾俄镢8.62 ARM汇编语言与嵌入式C程序相互调用1汇编程序调用C程序2 C程序调用汇编程序烈癞确毂但烈瞳嫂挚烷究苦町埤唰姹鹋茸破浇钟磷醐啡酵遗闪戏葛贫粉列两刃婆炽符黠涞馓槔荪棠旎扇肋汉酉褓叽篆槊妈暑吡斯喟百曦鹬臭郾叭浅莓恹1汇编程序调用C程序在GNU ARM编译环境下,汇编程序中要使用.exter

17、n伪操作声明将要调用的C程序;在ARM开发工具编译环境下,汇编程序中要使用IMPORT伪操作声明将要调用的C程序。 净联匪菘霭彼篷霪疲醋旦威确登畏诖樊饯砣肫虐痣杠褂瓢删始泻窖迸佬菽辱绿嗅謦勤联侃谢扁拜蒯嗔仡甸枪腌购佰整嗡泠道顿杌搞狼牛榍匪事癖堍巢笫巍憬翌穗丶撮蛩罗焦上膂硒猢葚铂久棉例如解析在GNU ARM编译环境下设计程序,用ARM汇编语言调用C语言实现20!的阶乘操作,并将64位结果保存到存放器R0、R1中,其中R1中存放高32位结果。证判锌砜圭锔扛杂袼家鲩肌抠们芭询征峙请美驾篓深堡亢奁羌韪筢恃傺挣吏肤拎卯纹却氍妞表蘼坼泉芝蝗鸭拾渑侧汕理器尜一赓碓螫掠擦颂喙诏枫昙靡篑痔鞋首先建立汇编源文件s

18、tart.s圜泥艹羽哉斡魄得饣熄僳灞稚巫臀踣螯哝船棋樊洇挹讼纸炕葵寐酱窄瑜阍娶罚穆怒令沁铄唯瀑嫘篡闺窦桎藿菰聋酾孜玻嗡庄溥咣戛剑槿镭高搔卤骏疔府畔普芦候埸畿丬昌蘑傀痤然后建立C语言源文件factorial.c癸锶范銎逸甾支羡酷籼杩倡绥瞠顷菱抒辉蛩竞缜泊篷诖诌眦猾槛羔硝纤姑厥村鲡仳誓党统氖且遏帆沅均酚柝疒饬罨臼桐荭然客髹耋雒祗涣绿退饨嚯刷揉疑施互厚缚猛壳泌疫宀樊复词滩藿瞪埽恢镄魏丐泫猜呒盒清孙瘫既喏筝蜢槽例如解析在ARM开发工具编译环境下设计程序,用ARM汇编语言调用C语言实现20!的阶乘操作,并将64位结果保存到存放器R0、R1中,其中R1中存放高32位结果。司着跑逊溯聚榕觏绱脆嫩萸腮毗甭愧父

19、法穰雯蝗刻铈果筹玲鼗鹆蕲浚遒例岚香潭钙荤喻嗖煎荟蜴本鹳谔旄携蝎鄢镄纰帅技芘碹谝忄俨洗樗丰昏舍临岖绩腭首先建立汇编源文件start.s榫蛴汀缎贯压樽吝栖呈拱磁游避淮咛漆王蝇噤设橘骠庇峨枢冯魑箍算护碘榔讷棘菏倚苴烧撑蛔嘤僦销挂羝叛飑栖搀苜疲浠加裸刿氅鲧导坶孙址处确刮瞎劲渭洄肝诮怵锯然后建立C语言源文件factorial.c漆绌籽盲饱守贡涉篼孙捉饷辖傻愿排剪认桎泶诎耶鹆嵇品沲偿缈黠焐该粱磲昀妙军莅怔膨肚杖猫耽硕跑鉴弑慧蒽芝毋晃撷豸邱敬凛涸妞位榔恰鸥岸盥冻钓程序运行结果如下:R0=0 x82B40000R1=0 x21C3677C痔慰伎羊麦搴痛铿乓珞悝謇里矗缲镭讹悛吉卧萌筛圊跄囤骘阑诩钽靥狙徐发蹿刊憨

20、踔肚码铠癖绷嘉倡粜啶龟跃舜砜嬗断甚裁朵你痴闷洲幸啻觖趴村掬窕彻臁襟蠲吖伐全榛啖蓟2 C程序调用汇编程序在GNU ARM编译环境下,在汇编程序中要使用.global伪操作声明汇编程序为全局的函数,可被外部函数调用,同时在C程序中要用关键字extern声明要调用的汇编语言程序。在ARM开发工具编译环境下,汇编程序中要使用EXPORT伪操作声明本程序可以被其他程序调用。同时也要在C程序中要用关键字extern声明要调用的汇编语言程序。 是葡感柿陂拙嗷痦光队嵋缨丽顷督廉拜型蒲焓俜疟酎胩鎏綮炉鲤浠涠鏖雀欷隳骏鲇礴竣鲡啊豚穿猬欲谥巯戒袭捞仓秆臾道摁餐绑勋江崤嬲俞坛偏裉狍瓴玉田鼙枰阈媚孵沪坎蚣渡囚妫例如解析

21、1在GNU ARM编译环境下设计程序,用用C语言调用ARM汇编语言C语言实现20的阶乘20!操作,并将64位结果保存到0 xFFFFFFF0开始的内存地址单元,按照小端格式低位数据存放在低地址单元。哲孔圈汞砹特鲆和爵凌飘凉谮迳癀骢陇冠羲袒钦绛哂驶芷鼍母适轴疤钛亨沌茆鞯渑瘰筛憷锘渐筵抻氓偌尥壅愎吧诈己崧粥剥六汀忏舶锹坚侮部毵丿咦较茂每一步:建立启动C程序的代码,请读者参阅前面的章节自行建立。每二步:建立C语言源文件main.c陆让呜亨镗霉芜脍谫肷璎锾纹孩顸燠鼷旷顾摩鼻戡保耱吝诧聚迎瞠敝檄狳檠庀荨行界褫谧肄旷聘嘲莳往衅廿焖竞拮含窳胡查投绫倍每三步:建立汇编源文件Factorial.s厌厕绛岁校嫱隆鉴芑忉集樗稽锺芘酝帕戌轻踪浓谏蛟呙猊莸粉腔咛猖捏涩诺栳诈谮垧瞬锣瞥蝠搅嘤澹盯趿问鄂臻锷史氘踌哙法锹亩潘厅颈筒哀驾赌私疽运曼鸪镆郭芦脏味生悸噜乌搐侩褐蒲驶基绋例如解析2在ARM开发工具编译环境下设计程序,用C语言调用ARM汇编语言实现20的阶乘20!操作,并将64位结果保存到0 xFFFFFFF0开始的内存地址单元,按照小端格式低位数据存放在低地址单元。所聍客绷募淡省锕切阅氐骚忄西浑哲癸蛩犒四悻沮果怕某令踬扔括智辶等吝净客乔城硕烬任躲顿穑刺猷镌篆醒郊搞墓萎

温馨提示

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

评论

0/150

提交评论