ARM汇编语言
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b、数据定义(内存分配)伪操作
伪操作 LTORG MAP FIELD SPACE DCB DCD/DCDU DCDO
DCFD/DCFDU DCFS/DCFSU
DCI
DCQ/DCQU DCW/DCWU
作用 声明一个数据缓冲池的开始 定义一个结构化的内存表的首地址 定义一个结构化内存表中的一个数据域 分配一块内存单元,并用 0 初始化 分配一段字节的内存单元,并用指定数据初始化
③SETA、SETL、SETS 用于给一个 ARM 程序中的变量赋值 SETA 给一个算术变量赋值; SETL 给一个逻辑变量赋值; SETS 给一个字符串变量赋值。
句法:variable <SETX> expr variable 是已定义变量的名称,在其作用范围内唯一。<SETX>是三种伪操
作之一,expr 是要赋的值。在向变量赋值前必须先声明该变量。
句法:ቤተ መጻሕፍቲ ባይዱGBLX> variable GBLX 是三种伪操作之一,variable 是所说明的全局变量的名称,在其
作用范围唯一。
用法: 如果用这些伪操作重新声明已经声明过的变量,则变量的值将被初始
化成后一次声明语句中的值。全局变量的作用范围为包含该变量的源程序。
例子: GLBA arithmetic; 声明全局算术变量 arithmetic arithmetic SETA 0xff; 向该变量赋值
Q83831295 3
FN 用于给一个浮点寄存器定义名称,方便程序员记忆该寄存器的功 能。
例子: height FN 6; 将浮点寄存器 6 的名称定义为 height
程序中的变量代换 ①程序中的变量可通过代换操作取得一个常量。代换操作符为“$”。 ②如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为 十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。 ③如果在逻辑变量前面有一个代换操作符“$”,编译器会将该逻辑变量代换为它的 取值(真或假)。 ④如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代 换“$”后的字符串变量。
Higashi
Q83831295 1
SPACE arithmetic; 引用该变量
GBLL logical; 声明全局逻辑变量 logical logical SETL {TRUE}; 向该变量赋值
②LCLA、LCLL、LCLS 用于声明 一个 ARM 程序中的局部变量,并将其初始化。 LCLA 声明一个局部的算术变量,并将其初始化为 0; LCLL 声明一个局部的逻辑变量,并将其初始化为{FALSE}; LCLS 声明一个局部的字符串变量,并将其初始化为空字符串””。
者单精度寄存器编号(0~15)。
用法:便于程序员记忆该寄存器的功能。
例子: height DN 6 width SN 15
⑧FN 为一个 FPA 浮点寄存器定义名称。 句法:name FN expr name 为该浮点寄存器的名称。expr 为该浮点寄存器的编号,数值为 0~7。
用法:
Higashi
CN
为协处理器的寄存器定义名称
CP
为协处理器定义名称
DN/SN
为双精度/单精度 VFP 的寄存器定义名称
FN
为 FPA 浮点寄存器定义名称
①GBLA、GBLL、GBLS 用于声明一个 ARM 程序中的全局变量,并将其初始化。
GBLA 声明一个全局的算术变量,并将其初始化为 0;
GBLL 声明一个全局的逻辑变量,并将其初始化为{FALSE}; GBLS 声明一个全局的字符串变量,并将其初始化为空字符串””。
用法: MAP 和 FIELD 伪操作配合使用来定义结构化的内存表。
例子: MAP 0x80, R9; 内存表的首地址为 0x80+R9
③FIELD 用于定义一个结构化的内存表的数据域。 句法:{label} FIELD expr 其中{label}是可选的,当包括这一项时,label 的值为当前内存表的位置计 数器{VAR}的值。处理了这条 FIELD 伪操作后,VAR 的值将加上 expr。expr 表示本数据域在内存表中所占的字节数。
LDR R6, consta
④SPACE 用于分配一块内存单元,并用 0 初始化。 句法:{label} SPACE expr 其中{label}是可选的。expr 表示本伪操作分配的内存字节数。
例子: Datastruct SPACE 280; 分配 280 字节的内存,并将单元内容初始化为 0
Higashi
⑥DCD 和 DCDU。DCD 用于分配一段字内存单元(分配的内存都是字对齐),并用 伪操作中的 expr 初始化它。DCDU 的不同之处在于分配的内存并不严格对齐。
句法:{label} DCD{U} expr{,expr}… 其中{label}是可选的。expr 可以为数字表达式或程序中的编号。
用法: DCD 可能在分配的第一个内存单元前插入填补字节来保证分配的内存是 字对齐的。
句法:{label} DCDO expr{,expr}… 其中{label}是可选的。expr 可以为数字表达式或程序中的编号。
用法: 为基于静态基址寄存器 R9 的偏移量分配内存单元。
例子: IMPORT externsym DCDO externsym; 分配一个字单元,其值为标号;externsym 基于 R9 的偏 移量。
例子: data1 DCD 1,5,20; 其值分别为 1、5、20 data2 DCD memaddr+4; 分配一个字单元,其值为程序中的标号 memaddr 加上 4
⑦DCDO 用于分配一段字内存单元(分配的内存都是字对齐),并将这个字单元的 内容初始化成 expr 标号基于基址寄存器 R9 的偏移量。
a、符号定义伪操作
伪操作
作用
GBLA
声明全局算术变量
GBLL
声明全局逻辑变量
GBLS
声明全局字符串变量
LCLA
声明局部算术变量
LCLL
声明局部逻辑变量
LCLS
声明局部字符串变量
SETA
给全局或局部算术变量赋值
SETL
给全局或局部逻辑变量赋值
SETS
给全局或局部字符串变量赋值
RLIST
为通用寄存器列表定义名称
用法: MAP 和 FIELD 伪操作配合使用来定义结构化的内存表结构,MAP 定义了 首地址,FIELD 定义了各数据域的字节长度,并为每个数据域定义了一个 标号。MAP 和 FIELD 仅仅是定义数据结构,它们并不实际分配内存单元。
例子: 定义一个内存表,其首地址为固定地址 4096(0x1000),该内存表中包含 5 个数据域:consta 和 constb 长度分别为 4 个字节;x 和 y 长度分别为 8 个 字节;string 长度为 256 字节。这种内存表称为基于绝对地址的内存表。 MAP 4096 consta FIELD 4 constb FIELD 4 x FIELD 8 y FIELD 8 string FIELD 256 在指令中,可以这样引用内存表的数据域:
分配一段字的内存单元 分配一段字的内存单元,并将单元的内容初始化成该单元相对
于静态基值寄存器的偏移量 分配一段双字的内存单元,并用双精度的浮点数据初始化
分配一段字的内存单元,并用单精度的浮点数据初始化 分配一段字节的内存单元,用指定的数据初始化,指定内存单
元中存放的是代码,而不是数据 分配一段双字的内存单元,并用 64 位的整数数据初始化
器的功能。
例子: Power CN 6; 将协处理器的寄存器 6 的名称定义为 Power
⑥CP 为一个协处理器定义名称 句法:name CP expr name 为该协处理器的名称,expr 为协处理器的编号,数值为 0~15。
用法: CP 用于给一个协处理器定义名称,方便程序员记忆该协处理器的功
能。
例子: Dmu CN 6; 将协处理器 6 的名称定义为 Dmu
⑦DN/SN DN 为一个双精度的 VFP 寄存器定义名称 SN 为一个单精度的 VFP 寄存器定义名称
句法:name DN expr / name SN expr name 为该 VFP 寄存器的名称。expr 为 VFP 双精度寄存器编号(0~15)或
⑧DCFD 和 DCFDU。DCFD 用于双精度的浮点数分配字对齐的内存单元,并用伪操 作中的 fpliteral 初始化它。每个双精度数占据两个字单元。DCFDU 的分配的内存并 不严格对齐。
句法:{label} DCFD{U} fpliteral{,fpliteral}… 其中{label}是可选的。fpliteral 为双精度浮点数。
句法:<LCLX> variable …
用法: 如果用这些伪操作重新声明已经声明过的变量,则变量的值将被初始
化成后一次声明语句中的值。局部变量的作用范围为包含该局部变量的宏 代码的一个实例。
例子:
MACRO; 声明一个宏 $label message $a; 宏的原型 LCLS err; 声明一个局部字符串变量 err err SETS “error no:”; 向该变量赋值 $label INFO 0, “err”:CC::STR:$a; 使用该字符串变量 MEND; 宏定义结束
ARM 汇编语言
伪操作:
伪操作又称为伪指令,它不像机器指令那样是在程序运行期间由计算机来执行的,它是 在汇编程序对源程序汇编期间由汇编程序处理的操作,它们可以完成如数据定义、分配存储 区、指示程序结束等功能。
宏指令是一段独立的程序代码,它通过伪操作来定义。宏通过宏名来调用,并可以设置 相应的参数。宏定义本身不会产生代码,只是在调用它时把宏体插入到源程序中。
分配一段半字的内存单元,并用指定的数据初始化
①LTORG 用于声明一个数据缓冲池的开始 句法:LTORG
用法: 通常 ARM 汇编编译器把数据缓冲池放在代码段的最下面,即下一个代码
段开始之前,或在 END 之前。 该指令通常放在无条件分支指令之后,或者子程序返回指令之后,这样处
理器就不会错误地将数据缓冲池中的数据当作指令来执行了。 当程序中使用 LDFD 之类的指令时,数据缓冲池的使用可能越界。这时可
Higashi
Q83831295 2
例子: Context RLIST {R0-R6, R8, R10, R15};
⑤CN 为一个协处理器的寄存器定义名称 句法:name CN expr name 为该寄存器的名称,expr 为协处理器编号,数值为 0~15。
用法: CN 用于给一个协处理器的寄存器定义名称,方便程序员记忆该寄存
以使用 LTORG 定义数据缓冲池。通常大的代码段可以使用多个数据缓冲池。
Higashi
Q83831295 4
②MAP 用于定义一个结构化的内存表的首地址。此时,内存表的位置计数器设置 成该地址。
句法:MAP expr {, base-register} 其中:expr 为数字表达式或者程序中的标号。当指令中没用 base-register 时,expr 即为结构化内存表的首地址。base-register 为一寄存器。当指令 包括这一项时,结构化内存表的首地址为 expr 和 base-register 寄存器值 的和。
用法: DCFD 可能在分配的第一个内存单元前插入填补字节来保证分配的内存是 字对齐的。
Higashi
Q83831295 6
例子: DCFD 1E208, -4E-100 DCFDU 10000, -.1, 3.1E26
Q83831295 5
⑤DCB 用于分配一段字节内存单元,并用伪操作中的 expr 初始化它。 句法:{label} DCB expr{, expr}… 其中{label}是可选的。expr 可以为-128~255 的数值或字符串。
例子: Nullstring DCB “Null string”, 0; 构造一个以 NULL 结尾的字符串。
④RLIST 为一个通用寄存器列表定义名称。 句法:name RLIST {list-of-register} name 为寄存器列表名称,list-of-register 为通用寄存器列表。
用法: 定义的名称可以在 LDM/STM 指令中使用。在 LDM/STM 指令中,寄
存器列表中的寄存器访问次序总是先访问编号较低的寄存器,再访问编号 较高的寄存器,不管寄存器列表中各寄存器的排列顺序。