好文档 - 专业文书写作范文服务资料分享网站

常用ARM及汇编指令

天下 分享 时间: 加入收藏 我要投稿 点赞

name CN expr,其中name是要定义的协处理器的寄存器名称,expr对应的协处理器的寄存器编号,数值范围 0 ~ 15

MemSet CN 1 ;将协处理器的寄存器1名称定义为 MemSet

CP指令的用法,举例如下:

DivRun CP 5 ;将协处理器5名称定义为DivRun

数据定义伪指令:

1、声明一个文字池:LTORG

2、定义一个结构化的内存表的首地址:MAP 或 ^ 3、定义结构化内存表中的一个数据域:FIELD 或 # 4、分配一块内存空间,并用0初始化: SPACE 或 %

5、分配一段字节内存单元,并用指定的数据初始化: DCB

6、分配一段字的内存单元,并用指令的数据初始化: DCD 和 DCDU

7、分配一段双字的内存单元,并用64位整数数据初始化: DCQ 和 DCQU 8、分配一段半字的内存单元,并用指定的数据初始化: DCW 和 DCWU

LTORG 用于声明一个文子池,在使用LDR伪指令时,要在适当的地址加入LTORG声明文子池,这样就会把要加载的数据保存在文子池内,再用ARM的加载指令读出数据(若没有使用LTORG声明文子池,则汇编器会在程序末尾自动声明) LTORG伪指令应用举例如下: ...

LDR R0,=0x12345678 ADD R1,R1,R0 MOV PC,LR

LTORG ;声明文子池 DCD 0x333 DCD 0x555

MAP 用于定义一个结构化的内存表的首地址,^与MAP同义 MAP 0x00, R9 ;定义内存表的首地址为R9

FIELD 用于定义一个结构化内存表的数据域,#与FIELD同义 ^ _ISR_STARTADDRESS ; ^ is synonym for MAP

HandleReset # 4 ; 定义数据域 HandleReset,长度为4字节

SPACE用于分配一块内存单元,并用0初始化,%与SPACE同义 伪指令应用举例如下:

AREA DataRAM,DATA,READWROTE ;声明一数据段,名为DataRAM DataBuf SPACE 1000 ;分配1000字节空间

DCB伪指令格式:

{label} DCB expr{,expr} ...

加{}的代表可有可无,DCD、DCW指令格式与DCB基本相同

ASSERT为断言错误伪指令,在汇编编译器对汇编程序的第二遍扫描中,若其中ASSERT条件不成立,ASSERT伪指令将报告该错误信息 ASSERT Top<>Temp ;断言Top 不等于 Temp ASSERT :DEF:ENDIAN_CHANGE

汇编控制伪指令

1、条件汇编控制:IF、ELSE 和 ENDIF IF、ELSE 和 ENDIF 伪指令能够根据条件把一段代码包括在汇编程序内或将其排除在程序之外

[ 与 IF同义 ,| 与 ELSE 同义, ] 与 ENDIF 同义 伪指令应用举例如下:

[ {CONFIG} = 16 ; [ 代表 IF BL __rt_udiv_1

| ; | 代表 ELSE BL __rt_div0

] ; ] 代表 ENDIF

2、MACRO 和 MEND

MACRO 和 MEND 伪指令用于宏定义,MACRO表示宏定义的开始,MEND表示宏定义的结束,用MACRO和MEND定义的一段代码,称为宏定义体,伪指令应用如下: MACRO

CSI_SETB ;宏名为CSI_SETB,无参数 LDR R0,=rPDATG ;读取GPG0 口的值 LDR R1,[R0]

ORR R1,R1,#0x01 ;CSI置位操作 STR R1,[R0] ;输出控制 MEND

3、WHILE 和 WEND

WHILE 和 WEND 伪指令用于根据条件重复 编相同的或几乎相同的一段源程序 伪指令应用举例 WHILE no< 5 no SETA no+1 ...

WEND

杂项伪指令:在汇编程序设计较为常用,如段定义伪指令,入口点设置伪指令,包含文件伪指令,标号导出或引入声明 1、边界对齐:ALIGN 2、段定义: AREA

3、指令集定义:CODE16 和 CODE32 4、汇编结束: END 5、程序入口: ENTRY 6、常量定义:EQU

7、声明一个符号可以被其它文件引用:EXPORT 和 GLOBAL 8、声明一个外部符号:IMPORT 和 EXTERN 9、包含文件: GET 和 INCLUDE 10、给特定的寄存器命名: RN

ARM汇编程序设计及一些格式要求说明

一般地,ARM源程序文件名的后缀名如下: 汇编文件: *.S 引入文件: *.INC C程序 : *.c 头文件 : *.h

汇编语句格式:

[ 标号 ] <指令 | 条件 | S > <操作数> [ ;注释] 1、所有标号必须在一行的顶格书写,其后面不要加: 2、所有指令均不能顶格书写

3、ARM汇编器对标识符大小写敏感,书写标号及指令时字母大小要一致,在ARM汇编程序中,一个ARM指令,伪指令,寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用

4、注释使用 ;或者 @,@表示开始到此行结束,注释可以在一行顶格书写(对ADS汇编格式,只支持 ; ) 5、源程序中允许空行

6、如果单行太长,可以使用字符 / 将其分行, / 后不能有任何字符,包括空格

7、对于变量的设置,常量的定义,其标识符必须在一行的顶格书写

标号:在ARM汇编中,标号代表一个地址,根据标号生成方式,可以分为以下3种

1、基于PC的标号,例如: BL LEDTEST 2、基于寄存器的标号,例如: MAP 0x00,R9

3、绝对地址,例如: LDR R0,=WTCON

局部标号:主要用于局部范围代码中,对宏定义也非常有用,格式如下: N { routname }

N是局部标号,为 0 ~ 99

routname是局部标号作用范围的名称

局部标号引用格式: % {F | B } {A | T} N {routname } 其中:

% 表示局部标号引用操作 F 指示编译器只向前搜索 B 指示编译器只向后搜索

A 指示编译器搜索宏的所有嵌套层次 T 指示编译器搜索宏的当前层 应用举例如下:

mov r1, #16 0 subs r1,r1, #1 bne °

宏定义及其作用

:使用宏定义可以提高程序的可读性,简化程序代码和同步修改,宏首先要定义,然后再使用,当源程序被汇编时,汇编器将展开每一个宏调用,用宏定义体代表程序中的宏调用,并使用实际的参数值代替宏定义时的形式参数 宏定义应用举例如下: .....

MACRO ;宏定义

CALL $FUNCTION , $DAT1 , $DAT2 ;宏名称为CALL,带有3个参数 IMPORT $FUNCTION ; 声明外部子程序

MOV R0, $DAT1 ; 设置子程序参数,R0 = $DAT1 MOV R1, $DAT2 ;

BL FUNCTION ; 调用子程序

MEND ; 宏定义结束 ......

汇编预处理后,宏调用将被展开,程序清单如下: ......

IMPORT FADD1 MOV R0, #3 MOV R1, #3 BL FADD1

子程序的调用

:使用BL指令进行调用,该指令会把返回的PC值保存在LR示例如下: ...... BL DELAY ...... DELAY ....

MOV PC,LR

当子程序指令完毕后,使用 MOV, B/BX , STMFD 等指令返回,STMFD 要与 LDMFD配套使用

STMFD SP! , {R0-R7, LR} ......

LDMFD SP! , {R0-R7,PC }

ARM7TDMI (-S) 是没有BLX指令的,但可以通过以下几条程序实现其功能 ADR R1 , DELAY+1

MOV LR , PC ; 保存返回地址到LR

BX R1 ; 跳转并切换指令集 ......

该程序要注意的是 3级流水线,PC执行到哪里是关键

特殊寄存器定义及应用:基于ARM核的芯片一般有片内外设,它们通过其特殊寄存器访问 示例如下:

WDTC EQU 0xE000000 ;寄存器定义 ....

LDR R0, =WDTC ; 加载立即数要加 = MOV R1, #0x12

STR R1, [R0] ; WDTC = 0x12

散转功能是汇编程序常用的一种算法,其示例如下:

CMP R0, #MAXINDEX ; 判断索引号是否超过最大索引值

ADDLO PC , PC , R0 , LSL #2 ; 若没有超出,则跳转到相应位置 B ERROR ; 若已经超出,则进行出错处理

; 散转表,对应索引号为 0 ~ N B FUN1 B FUN2

常用ARM及汇编指令

nameCNexpr,其中name是要定义的协处理器的寄存器名称,expr对应的协处理器的寄存器编号,数值范围0~15MemSetCN1;将协处理器的寄存器1名称定义为MemSetCP指令的用法,举例如下:DivRunCP5;将协处理器5名称定义为DivRun数据定义伪指令:1、
推荐度:
点击下载文档文档为doc格式
7wn5x7lbt15nd0f7mk24
领取福利

微信扫码领取福利

微信扫码分享