4第四章 ARM汇编语言程序设计-文档资料

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MACRO、MEND伪指令可以将一段代码定义为一个 整体,称为宏指令,然后就可以在程序中通过宏指 令多次调用该段代码。其中,$标号在宏指令被展 开时,标号会被替换为用户定义的符号;
|
;|=else
THUMBCODE SETL {FALSE}
]
;]=endif
2、 WHILE、WEND
语法格式:
WHILE 逻辑表达式
指令序列
WEND
WHILE、WEND伪指令可以嵌套使用。
WHILE、WEND伪指令能根据条件的成立与 否决定是否循环执行某个指令序列。当WHILE 后面的逻辑表达式为真,则执行指令序列, 该指令序列执行完毕后,再判断逻辑表达式 的值,若为真则继续执行,一直到逻辑表达 式的值为假。
ARM 指令系统 使用示例:
LCLA Test3
;声明一个局部的
数字变量,变量名为Test3
Test3 SETA 0xaa;将该变量赋值为
0xaa
LCLL Test4
;声明一个局部的
逻辑变量,变量名为Test4
Test4 SETL {TRUE} ; 将 该 变
量赋值为真
4、 RLIST
名称 RLIST {寄存器列表}
语法格式:
IF 逻辑表达式
指令序列1
ELSE
指令序列2
ENDIF
IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是 否执行某个指令序列。当IF后面的逻辑表达式为真,则执行 指令序列1,否则执行指令序列2。其中,ELSE及指令序列2 可以没有,此时,当IF后面的逻辑表达式为真,则执行指令 序列1,否则继续执行后面的指令。
FIELD伪指令常与MAP伪指令配合使用来定义结
构 化 的 内 存 表 。 MAP 伪 指 令 定 义 内 存 表 的 首 地 址 , FIELD伪指令定义内存表中的各个数据域,并可以为 每个数据域指定一个标号供其他的指令引用。
注意 MAP和FIELD伪指令仅用于定义数据结
构,并不实际分配存储单元。
伪指令仅在汇编过程中起作用,一 旦汇编结束,伪指令的使命就完成。
指令 : 由ARM处理器执行
ARM 指令系统
在ARM的汇编程序中,有如下几种伪指令:
符号定义伪指令、 数据定义伪指令、 汇编控制伪指令、 宏指令以及其他伪指令。
ARM 指令系统
4.1.1 符号定义伪指令
符号定义伪指令用于定义ARM汇 编程序中的变量、对变量赋值以及定 义寄存器的别名等操作。
分配存储单元,同时可完成已分配存储单元
的初始化。常见的数据定义伪指令有如下几 种:
— DCB
用于分配一片连续的字节存储单元并用
ห้องสมุดไป่ตู้
指定的数据初始化。
—DCW(DCWU) 用于分配一片连续的半字存储 单元并用指定的数据初始化。
— DCFD(DCFDU)用于为双精度的浮点数分配一片 连续的字存储单元并用指定的数据初始化。
HandleIRQ
#4
HandleFIQ
#4
ARM 指令系统
4.1.3 汇编控制伪指令
汇编控制伪指令用于控制汇编 程序的执行流程
常用的汇编控制伪指令包括 : — IF、ELSE、ENDIF — WHILE、WEND — MACRO、MEND
— MEXIT
1 IF、ELSE、ENDIF (等价于[ | ] )
IF、ELSE、ENDIF伪指令可以嵌套使用。
使用示例:
GBLL Test ;声明一个全局的逻辑变量,变量名为Test
……
IF Test = TRUE 指令序列1
ELSE 指令序列2 ENDIF
s3c44b0x ARM芯片的初始化源程序:
GBLL THUMBCODE
;global logical variable, init. to {false}
LCLA伪指令用于定义一个局部的数字变量, 并初始化为0;
LCLL伪指令用于定义一个局部的逻辑变量, 并初始化为F(假);
LCLS伪指令用于定义一个局部的字符串变量, 并初始化为空;
以上三条伪指令用于声明局部变量
使用示例:
LCLA Test4 ;声明一个局部的数字变量, 变量名为Test4
Test3 SETA 0xaa ; 将 该 变 量 赋 值 为
使用示例:
DataTest DCD 4,5,6 ; 分 配 一 片连续的字存储单元并初始化。
3、 SPACE(SPACE也可用“%”代替)
语法格式:
标号
SPACE 表达式
SPACE伪指令用于分配一片连续 的存储区域并初始化为0。其中,表 达式为要分配的字节数。
使用示例:
DataSpace SPACE 100 ; 分 配 连 续 100字节的存储单元并初始化为0。
RLIST 伪 指 令 可 用 于 对 一个通用寄存器列表定义名称,使 用该伪指令定义的名称可在ARM指 令LDM/STM中使用。
在LDM/STM指令中,列 表中的寄存器访问次序为根据寄存 器的编号由低到高,而与列表中的 寄存器排列次序无关。
RLIST使用示例:
RegList RLIST {R0-R5,R8,R10}
— DCFS(DCFSU) 用 于 为 单 精 度 的 浮 点 数分配一片连续的字存储单元并用指定的数据 初始化。
— DCQ(DCQU) 用于分配一片以8字节 为单位的连续的存储单元并用指定的数据初始 化。
DCD(DCDU)用于分配一片连续的字存储单 元并用指定的数据初始化。
SPACE 用于分配一片连续的存储单元
0xaa
LCLL Test5 ;声明一个局部的逻辑变量,变 量名为Test5
Test4 SETL

{TRUE};将该变量赋值为
LCLS Test6 ;定义一个局部的字符串变量, 变量名为Test6
Test6 SETS
为“Testing”
“Testing” ;将该变量赋值
3、 SETA、SETL和SETS
4、 MAP,MAP也可用“^”代替。
语法格式:
MAP 表达式{,基址寄存器}
MAP伪指令用于定义一个结构化的内 存表的首地址。
表达式可以为程序中的标号或数学 表达式,基址寄存器为可选项,当基址 寄存器选项不存在时,表达式的值即为 内存表的首地址,当该选项存在时,内 存表的首地址为表达式的值与基址寄存 器的和。
1、 GBLA、GBLL和GBLS 语法格式:
GBLA(GBLL或GBLS) 全局变量名
GBLA、GBLL和GBLS伪指令用于定义一个ARM程 序中的全局变量,并将其初始化。
GBLA伪指令用于定义一个全局的数字变量,并初始 化为0;
GBLL伪指令用于定义一个全局的逻辑变量,并初始 化为F(假);
GBLS伪指令用于定义一个全局的字符串变量,并初 始化为空;
ARM 指令系统
4.1.1 符号定义伪指令
常见的符号定义伪指令有如下几种:
— 用 于 定 义 全 局 变 量 的 GBLA 、 GBLL 和 GBLS。
— 用 于 定 义 局 部 变 量 的 LCLA 、 LCLL 和 LCLS。
— 用于对变量赋值的SETA、SETL、SETS。 — 为通用寄存器列表定义名称的RLIST。
AREA RamData, DATA, READWRITE
^ (_IRQ_BASEADDRESS) ; ^ 即 MAP
HandleReset # 4
; # 即 DCD
HandleUndef # 4
HandleSWI
#4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
将 寄 存 器 列 表 名 称 定 义 为 RegList , 可在ARM指令LDM/STM中通过该名称 访问寄存器列表。
例:
RegList RLIST {r1-r13};必须顶格开始写
LDMIA r0,RegList
ARM 指令系统
4.1.2 数据定义(Data Definition)伪指令 数据定义伪指令一般用于为特定的数据
;分配一片连续的字节存储单元并初始化。
2、 DCD(或DCDU,DCD也可用“&”代替)
语法格式:
标号
DCD(或DCDU) 表达式
DCD(或DCDU)伪指令用于分配一片连续 的字存储单元并用伪指令中指定的表达式初 始化。其中,表达式可以为程序标号或数字 表达式。
用DCD分配的字存储单元是字对齐的,而 用DCDU分配的字存储单元并不严格字对齐。
语法格式:
变量名 SETA(SETL或SETS)表达式
伪 指 令 SETA 、 SETL 、 SETS 给 一 个 已 经 定 义 的全局变量或局部变量赋值。
SETA伪指令用于给一个数学变量赋值; SETL伪指令用于给一个逻辑变量赋值; SETS伪指令用于给一个字符串变量赋值;
其中,变量名为已经定义过的全局变量 或局部变量,表达式为将要赋给变量的值。
由于以上三条伪指令用于定义全局变量,因此在整个 程序范围内变量名必须唯一。
GBLA Test1
;定义一个全局的数字变量,变量名为Test1
Test1 SETA 0xaa
;将该变量赋值为0xaa
GBLL Test2
;定义一个全局的逻辑变量,变量名为Test2
Test2 SETL {TRUE}
;将该变量赋值为真
GBLS Test3
;定义一个全局的字符串变量,变量名为Test3
Test3 SETS "Testing"
;将该变量赋值为"Testing"
ARM 指令系统
2、 LCLA、LCLL和LCLS
语法格式:
LCLA(LCLL或LCLS) 局部变量名
LCLA、LCLL和LCLS伪指令用于定义一个ARM程
序中的局部变量,并将其初始化。其中:
MAP 用于定义一个结构化的内存表首地址
FIELD 用于定义一个结构化的内存表的数据域
1、 DCB(DCB也可用“=”代替)
语法格式:
标号
DCB 表达式
DCB伪指令用于分配一片连续的字节 存储单元并用伪指令中指定的表达式初 始化。其中,表达式可以为0~255的数 字或字符串。
使用示例:
Str DCB "This is a test!"
第四章 ARM汇编语言程序设计
ADS1.2环境下的汇编语句格式
1. ARM 汇编中,所有标号必须在一行的顶格书写, 其后面不要添加“:”,而所有指令均不能顶格书写。
2. ARM 汇编器对标识符大小写敏感,书写标号及 指令时字母大小写要一致,在ARM 汇编程序中,一个 ARM 指令、伪指令、寄存器名可以全部为大写字母, 也可以全部为小写字母,但不要大小写混合使用(如 果混合使用也能编译通过,如mov SP, r6能编译 通过,但是moV SP, r6则出现错误)。
使用示例:
GBLA Counter
;声明一个全局的数学变量,变量名为Counter
Counter SETA
3
;由变量Counter控制循环次数
……
WHILE Counter < 10 指令序列
WEND
3、 MACRO、MEND
语法格式:
MACRO
$标号宏名 $参数1,$参数2,……
指令序列
MEND
3. 注释可以在一行的顶格书写。
ARM 指令系统
4.1伪操作
在ARM汇编语言程序里,有一些特殊 指令助记符,这些助记符与指令系统的
助记符不同,没有相对应的操作码,通 常称这些特殊指令助记符为伪指令
他们所完成的操作称为伪操作。
ARM 指令系统
伪指令 : 由汇编器处理
伪指令是由汇编器对源程序汇编期 间进行处理的.
MAP伪指令通常与FIELD伪指令 配合使用来定义结构化的内存表。
使用示例:
MAP 0x100,R0
;定义结构
化内存表首地址的值为0x100+R0。
5、 FILED
语法格式:
标号
FILED也可用“#”代替。
FIELD 表达式
FIELD伪指令用于定义一个结构化内 存表中的数据域。
表达式的值为当前数据域在内存表 中所占的字节数。
使用示例:
MAP 0x100 ;定义结构化内存 表首地址的值为0x100。
A FIELD 16
;定义A的长度为16
字节,位置为0x100
B FIELD 32
;定义B的长度为32
字节,位置为0x110
S FIELD 256 ; 定 义 S 的 长 度 为 256字节,位置为0x130
s3c44b0x ARM芯片的初始化源程序:
[ {CONFIG} = 16
;[=if,{CONFIG}:build-in variable defined by ARM
;assembler,16=assembing Thumbcode.
THUMBCODE SETL {TRUE} ;SETL:set the logic variable
CODE32 ;changing from Thumb state to Arm state
相关文档
最新文档