04 汇编 启动代码 混合编程5 5-5 6 arm程序设计2012-3_第1页
04 汇编 启动代码 混合编程5 5-5 6 arm程序设计2012-3_第2页
04 汇编 启动代码 混合编程5 5-5 6 arm程序设计2012-3_第3页
04 汇编 启动代码 混合编程5 5-5 6 arm程序设计2012-3_第4页
04 汇编 启动代码 混合编程5 5-5 6 arm程序设计2012-3_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章ARM程序设计本章主要内容集成开发环境使用 汇编语言程序设计方顺序程序设计分支程序设计循环程序设计子程序设计/参数传递方法C语言与汇编语言混合程序设计方法5.05.5 子程序设计1. 无嵌套的子程序调用与返回2. 子程序嵌套与现场保护、现场恢复3. 主程序和子程序之间的参数传送方法0.子程序格式子程序格式如下:子程序名指令序列返回调用指令的下一条指令AREA Init,CODE,READONLYEntryStart BL DELAYDELAY 1.无嵌套的子程序调用与返回;子程序调用MOV PC,RLEND(1) BL 子程序名(2)LDR R1,=子

2、程序名BL R1;返回可用下面两种指令或类似指令实现(1)MOV PC,RL;(2) B RL (3) PUSH(RL) / POP PC2. 子程序嵌套与现场保护、现场恢复(1) 子程序可能会用到主程序所使用的寄存器,(2) 使用前为防止数据丢失,应先保护现场;(3) 返回前恢复现场main. . .BL fun1. . .fun1STMFDSP!,R0-R8,LR;保存使用到的寄存器. . .BLfun2. .LDMFDSP!,R0-R8,PC;返回. . .fun2STMFDSP!,R9-R12,LR ;保存使用到的寄存器. . . . .LDMFDSP!,R9-R12,PC;返回3.

3、主程序和子程序之间的参数传送方法主程序在调用子程序时,经常需要传送一些参数给子程 序;子程序运行完后经常要回送一些信息给主程序。这种主程序和子程序之间的信息传送称为参数传送的主 要方法有以下几种:(1)通用寄存器传送参数寄存器参数可以是一个地址指针,也可以是其他参数,所以可以非常灵活传递参数,可以传递少量参数也可以传递 大量参数。例:主程用寄存器R1把参数传递给子程序,子程序计算R1的立方,子程序将结果放在R1带回主程序数据块的首地址Main ;主程序LDRR0,=0x8000 MOV R2,#100Loop:LDRR1,R0)BLSUB_X3STRR1,R0ADDR0,R0,#4SUBR2,

4、R2,#1BNEloopSUB_X3;通用计算子程序STMFDSP!,R0,R2,LR MULR2,R1,R1MULR1,R2,R1 LDMFD SP!,R0,R2,PC读一个参数主程序完成一个数据块(个数的立方计算(2) 存储单元传送参数主程序和子程序共享同一片存储空间(即全局数据堆)。这种方法简单,但结构化较低,可移植性较差,不建议使用。(3) 通过堆栈传送参数主程序与子程序传递参数时,可以把要传递的参数放在堆 栈中,这些参数既可以是数据,也可以是地址。具体方法是在调用子程序前将参数送入堆栈,在子程序中通过出栈方式取得参数,执行完毕后再将结果依次压入堆栈。 返回主程序后,通过出栈获得结果。

5、 清空栈内已用参数SUB_X3STMFDSP!,R1-R3,LR;又压了4个字到栈内,仔细计算偏移=16 LDR R3,SP,#+16LDRR1,R3MULR2,R1,R1MULR1,R2,R1STRR1,R3LDMFD SP!,R1-R3,PCMainLDRR0,=0x8000 MOV R2,#100Loop:STMFDSP!,R0 BLSUB_X3 LDMFDSP!,R0ADDR0,R0,#4SUBR2,R2,#1BNEloop0xFFFFC语言是基于栈的语言,函数参数、局部动态变量都在堆栈中分配void MyFun(int x,int y)栈基地址base.MOV R12,R13Int

6、xint a; int b;.Bp(R12)Int yInt aSp(R13)SUB.R13,#8;分配2个字栈顶上限limit.ADD R13,R12,#8;释放a,b,x,y空间0x0000传递参数x,y在堆栈分配局部动态变量a,b在堆栈中分配。.Int b栈基地址baseBp(R12)Sp(R13)栈顶上限limit.Int bLdr r1,r12;yLdr r2,r12,#4;xLdr r3,r12,#-4;aLdr r4,r12,#-8;b.Int xInt yInt a5.5汇编程序访问C全局变量AREA gal_sub,CODE,READONLYimportgal_var exportasm_subasm_sub. . .LDRR0,=gal_var LDRR1,R0ADDR1,R1,#4 STRR1,R

温馨提示

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

评论

0/150

提交评论