资源描述:
《常用arm指令及汇编【二】》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、ARM汇编程序设计及一些格式要求说明一般地,ARM源程序文件名的后缀名如下:汇编文件:*.S引入文件:*.INCC程序: *.c头文件: *.h汇编语句格式:[标号] <指令
2、条件
3、S> <操作数> [;注释]1、所有标号必须在一行的顶格书写,其后面不要加:2、所有指令均不能顶格书写3、ARM汇编器对标识符大小写敏感,书写标号及指令时字母大小要一致,在ARM汇编程序中,一个ARM指令,伪指令,寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用4、注释使用;或者@,@表示开始到此行结束,注释可以在一行顶格书写(对A
4、DS汇编格式,只支持;)5、源程序中允许空行6、如果单行太长,可以使用字符/将其分行,/后不能有任何字符,包括空格7、对于变量的设置,常量的定义,其标识符必须在一行的顶格书写标号:在ARM汇编中,标号代表一个地址,根据标号生成方式,可以分为以下3种1、基于PC的标号,例如:BL LEDTEST2、基于寄存器的标号,例如:MAP 0x00,R93、绝对地址,例如:LDRR0,=WTCON局部标号:主要用于局部范围代码中,对宏定义也非常有用,格式如下:N{routname}N是局部标号,为0~99routname是局部标号作用范围的名称局部标号引用格
5、式:%{F
6、B} {A
7、T} N{routname}其中:%表示局部标号引用操作F指示编译器只向前搜索B指示编译器只向后搜索A指示编译器搜索宏的所有嵌套层次T指示编译器搜索宏的当前层应用举例如下: mov r1,#160 subs r1,r1,#1 bne %B0宏定义及其作用:使用宏定义可以提高程序的可读性,简化程序代码和同步修改,宏首先要定义,然后再使用,当源程序被汇编时,汇编器将展开每一个宏调用,用宏定义体代表程序中的宏调用,并使用实际的参数值代替宏定义时的形式参数宏定义应用举例如下:.....MACRO
8、 ;宏定义CALL $FUNCTION,$DAT1,$DAT2 ;宏名称为CALL,带有3个参数IMPORT $FUNCTION ;声明外部子程序MOV R0,$DAT1 ;设置子程序参数,R0=$DAT1MOV R1,$DAT2 ;BL FUNCTION ; 调用子程序MEND ;宏定义结束......汇编预处理后,宏调用将被展开,程序清单如下:......IMPORT FADD1MOV R0,#3MOV R1,#3BL FADD1子程序的
9、调用:使用BL指令进行调用,该指令会把返回的PC值保存在LR示例如下: ...... BL DELAY ......DELAY .... MOVPC,LR当子程序指令完毕后,使用MOV,B/BX,STMFD等指令返回,STMFD要与LDMFD配套使用STMFD SP!,{R0-R7,LR}......LDMFD SP!,{R0-R7,PC}ARM7TDMI(-S)是没有BLX指令的,但可以通过以下几条程序实现其功能ADR R1, DELAY+1MOV LR , PC ;保存返回地址到LRBX
10、 R1 ; 跳转并切换指令集......该程序要注意的是3级流水线,PC执行到哪里是关键特殊寄存器定义及应用:基于ARM核的芯片一般有片内外设,它们通过其特殊寄存器访问示例如下:WDTC EQU 0xE000000 ;寄存器定义 .... LDR R0,=WDTC ;加载立即数要加= MOV R1, #0x12 STR R1, [R0] ;WDTC=0x12散转功能是汇编程序常用的一种算
11、法,其示例如下: CMP R0,#MAXINDEX ;判断索引号是否超过最大索引值 ADDLO PC,PC,R0,LSL#2 ;若没有超出,则跳转到相应位置 B ERROR ;若已经超出,则进行出错处理 ;散转表,对应索引号为0~N B FUN1 B FUN2 B FUN3查表操作是汇编程序常用的一种操作,其示例如下: LDR R3,
12、=DISP_TAB ;取得表头 LDR R2,[R3,R5,LSL#2] ;根据R5的值查表,取出相应