ARM汇编语言程序标准和范例.ppt
《ARM汇编语言程序标准和范例.ppt》由会员分享,可在线阅读,更多相关《ARM汇编语言程序标准和范例.ppt(83页珍藏版)》请在冰豆网上搜索。
嵌入式系统原理与开发嵌入式系统原理与开发第第1111讲讲南京大学计算机系俞建新主讲2008年春季第第5章章ARM指令集指令集和汇编语言程序和汇编语言程序l本章主要介绍以下内容:
lARM指令集的基本特点l与Thumb指令集的区别l与x86处理器的区别lARM指令格式lARM寻址方式lARM指令集分类详解lARM汇编语句格式和程序格式lARM汇编语言的指示符lARM汇编程序标准与规范l典型ARM汇编语言程序举例2008年10月23日2南京大学计算机系本讲主要参考文献本讲主要参考文献lARM公司公司英文资料:
英文资料:
lADS_AssemblerGuide_B.pdflDDI0100E_ARM_ARM.pdfl中文图书中文图书lARM体系结构与编程,清华大学出版社l嵌入式系统基础教程,机械工业出版社2008年10月23日3南京大学计算机系讲授内容讲授内容lATPCS和AAPCS规范要点lARM编译器保有的特定关键字l典型ARM汇编语言程序举例lARM汇编程序基本结构lC程序和CPP程序调用ARM汇编子程序lARM汇编程序调用ARM汇编子程序l整数除法子程序lS3C44B0X处理器的启动代码l44BInit.s、option.s、memcfg.s2008年10月23日4南京大学计算机系5.7ARM汇编程序规范汇编程序规范l寄存器的使用规则l堆栈使用规则l参数传递规则2008年10月23日5南京大学计算机系ATPCSlATPCS(ARM-ThumbProcedureCallStandard)规定了一些子程序间调用的基本规则,这些规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。
有了这些规则之后,单独编译的C语言程序就可以和汇编程序相互调用。
l使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS类型。
而对于汇编语言来说,则需要用户来保证各个子程序满足ATPCS的要求。
2008年10月23日6南京大学计算机系AAPCSl2007年ARM公司正式推出了AAPCS标准lARMArchtectureProcedureCallStandardlAAPCS是ATPCS的改进版l目前,AAPCS和ATPCS都是可用的标准2008年10月23日7南京大学计算机系寄存器的使用规则寄存器的使用规则l子程序间通过寄存器R0R3来传递参数。
这时,寄存器R0R3可记作a0a3。
被调用的子程序在返回前无需恢复寄存器R0R3的内容。
l在子程序中,使用寄存器R4R11来保存局部变量。
这时,寄存器R4R11可以记作v1v8。
如果在子程序中使用了寄存器v1v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。
在Thumb程序中,通常只能使用寄存器R4R7来保存局部变量。
l寄存器R12用作过程调用中间临时寄存器,记作IP。
在子程序之间的连接代码段中常常有这种使用规则。
2008年10月23日8南京大学计算机系寄存器的使用规则(续)寄存器的使用规则(续)l寄存器R13用作堆栈指针,记作SP。
在子程序中寄存器R13不能用作其他用途。
寄存器SP在进入子程序时的值和退出子程序时的值必须相等。
l寄存器R14称为连接寄存器,记作LR。
它用于保存子程序的返回地址。
如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
l寄存器R15是程序计数器,记作PC。
它不能用作其它用途。
2008年10月23日9南京大学计算机系堆栈使用规则堆栈使用规则lATPCS规定堆栈为FD类型,即满递减堆栈,并且对堆栈的操作是8字节对齐。
l对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足下列条件:
(1)外部接口的堆栈必须是8字节对齐的。
(2)在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的。
2008年10月23日10南京大学计算机系参数传递规则参数传递规则l根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变化的子程序。
l这两种子程序的参数传递规则是不一样的。
2008年10月23日11南京大学计算机系参数个数可变子程序参数传递规则参数个数可变子程序参数传递规则l对于参数个数可变的子程序,当参数个数不超过4个时,可以使用寄存器R0R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数。
l在传递参数时,将所有参数看作是存放在连续的内存字单元的字数据。
然后,依次将各字数据传递到寄存器R0,R1,R2和R3中。
如果参数多于如果参数多于4个,则将剩余的字数据传递到堆栈中。
个,则将剩余的字数据传递到堆栈中。
入栈的顺序与参数传递顺序相反,即最后一个字数据先入栈。
2008年10月23日12南京大学计算机系参数个数固定子程序参数传递规则参数个数固定子程序参数传递规则l如果系统不包含浮点运算的硬件部件,浮点参数会通过相应的规则转换成整数参数(若没有浮点参数,此步省略),然后依次将各字数据传送到寄存器R0R3中。
如果参数多于4个,将剩余的字数据传送堆栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。
在参数传递时,将所有参数看作是存放在连续的内存字单元的字数据。
2008年10月23日13南京大学计算机系子程序结果返回规则子程序结果返回规则l子程序中结果返回的规则如下:
l结果为一个32位整数时,可以通过寄存器R0返回;l结果为一个64位整数时,可以通过寄存器R0和Rl返回;l结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或s0来返回;l结果为复合型浮点数(如复数)时,可以通过寄存器f0fn或d0dn来返回;l对于位数更多的结果,需要通过内存来传递。
2008年10月23日14南京大学计算机系5.7.2ARM编译器保有的特定关键字编译器保有的特定关键字lARM编译器支持一些对ANSIC进行扩展的关键词。
这些关键词用于声明变量、声明函数、对特定的数据类型进行一定的限制。
2008年10月23日15南京大学计算机系用于声明函数的关键词用于声明函数的关键词(双下划线起头)(双下划线起头)l_asm,内嵌汇编l_inline,内联展开l_irq,声明IRQ或FIQ的ISRl_pure,函数不修改该函数之外的数据l_softfp,使用软件的浮点连接件l_swi,软中断函数l_swi_indirect,软中断函数2008年10月23日16南京大学计算机系用于声明变量的关键词用于声明变量的关键词lregisterl声明一个变量,告诉编译器尽量保存到寄存器中。
l_int64l该关键词是longlong的同义词。
l_global_regl将一个已经声明的变量分配到一个全局的整数寄存器中。
2008年10月23日17南京大学计算机系5.8典型典型ARM汇编语言程序举例汇编语言程序举例l请参看本课程教材嵌入式系统基础教程中第151页开始的第5.2节。
2008年10月23日18南京大学计算机系5.8.1条件执行举例条件执行举例l求a和b两整数最大公约数的C程序Whilea!
=b)If(ab)a-=b;elseb-=a;2008年10月23日19南京大学计算机系条件执行举例(续)条件执行举例(续)l如果用ARM汇编子程序来实现,就是求r1和r2两个寄存器中的两个整数的最大公约数。
使用条件执行指令表示只有以下4句代码:
gcdcmpr1,r2;cmp与subs功能类似但不存结果subgtr1,r1,r2;如果r1r2执行此指令subltr2,r2,r1;如果r1r2执行此指令bnegcd;如果r1r2则转gcd标号注:
函数结束时r1=r2,都可以用作返回值。
2008年10月23日20南京大学计算机系5.8.232位地址送入一个寄存器中位地址送入一个寄存器中l下面指令段中的load指令根据输入参数决定调用那个函数。
具体做法是将函数的绝对地址通过LDR指令存入在r4寄存器中,由于是32的绝对地址,LDR会被解释成以下操作:
将函数的绝对地址放入一个文字池(Literalpool,嵌入在代码中的用以存放常数的区域)。
产生一条形如:
LDRrnpc,#offsettoliteralpool的指令来将这个绝对地址读入到指定的寄存器中。
l类似地LDR指令也通过上述方法读入一个32位的绝对数。
在下例中,LDR指令将32位绝对数0x11552634读入到r0寄存器中,用作调用routine1或者routine2的参数。
2008年10月23日21南京大学计算机系32位地址送入一个寄存器中(续)位地址送入一个寄存器中(续);voidload(inti);voidroutine1(int1);voidroutine2(int2);AREALOAD,CODE,READONLYIMPORTroutine1IMPORTroutine2EXPORTloadloadstmfdr13!
r4,r14ldrr4,=routine1;首先将32位地址存放在附近的区域cmpsr0,#1ldrner4,=routine2ldrr0=0x11552634;函数的第1个int参数bxr4ldmfdr13!
r4,r14bxr142008年10月23日22南京大学计算机系5.8.3从从IRQ和和FIQ异常处理程序返回异常处理程序返回l从IRQ和FIQ异常处理程序返回时,返回地址应该是LR-4。
l有三种不同的编程方法,分别列出如下:
l返回方式1INT_HANDLERSUBSPC,LR,#4;PC=R14-42008年10月23日23南京大学计算机系从从IRQ和和FIQ异常处理程序返回(异常处理程序返回
(2)l返回方式2INT_HANDLERSUBR14,R14,#4;R14-=4MOVSPC,LR2008年10月23日24南京大学计算机系从从IRQ和和FIQ异常处理程序返回(异常处理程序返回(3)l返回方式3INT_HANDLERSUBR14,R14,#4;R14=R144STMFDR13!
R0-R3,R14LDMFDR13!
R0-R3,R152008年10月23日25南京大学计算机系5.8.4调用调用ARM汇编语言子程序汇编语言子程序l在ARM汇编语言中,子程序调用是通过BL指令完成的。
BL指令的语法格式如下:
lBLsubnamel其中,subname是调用的子程序的名称。
lBL指令完成两个操作:
将子程序的返回地址放在LR寄存器中,同时将PC寄存器值设置成目标子程序的第一条指令地址。
l在子程序返回时可以通过将LR寄存器的值传送到PC寄存器中来实现。
l子程序调用时通常使用寄存器R0R3来传递参数和返回结果。
2008年10月23日26南京大学计算机系调用汇编子程序举例调用汇编子程序举例l子程序DOADD完成加法运算,操作数放在R0和R1寄存器中,结果放在R0中。
AREAEXAMPLE2,CODE,READONLYENTRYstartMOVr0,#10;R0设置输入参数MOVr1,#3;R1设置输入参数BLdoadd;调用子程序doadddoaddADDr0,r0,r1;子程序实体MOVpc,lr;从子程序中返回END2008年10月23日27南京大学计算机系5.8.5循环结构循环结构l在ARM汇编中,没有专门的指令用来实现循环,一般通过跳转指令加条件码的形式来实现。
可以采用比较指令CMP或者减法指令SUB等实现。
参看下面的指令段:
LOOPADDR4,R4,R0ADDR0,R0,#1CMPR0,R1BLELOOP;R0小于等于R1场合跳转l在做完了两次加法操作后,比较R0,R1的值,影响条件标志。
最后的条件跳转语句根据CMP指令执行的结果来决定是否进行循环。
2008年10月23日28南京大学计算机系5.8.6数据块复制示范程序数据块复制示范程序l本程序将数据从源数据区复制到目标数据区l复制时,以8个字为单位进行。
l对于最后所剩不足8个字的数据,以字为单位进行复制,这时程序跳转到copywords处执行。
l在进行以8个字为单位的数据复制时