ARM汇编伪操作(ARM7TDMI) 命令集
本文链接:http://blog.sina.com.cn/s/blog_574d08530100hzfp.html
1.符号定义伪操作(定义变量,变量赋值,寄存器取别名 相关)
操作符 英文对照(个人猜测) 功能 语法格式
LCLA local arithmetic 定义一个局部的算术变量并初始化为0 LCLA 变量名(定义的)
LCLL local logic 定义一个局部的逻辑变量并初始化为FALSE(false) LCLL 变量名(定义的)
LCLS local string 定义一个局部的字符串变量并初始化为空串 LCLS 变量名(定义的)
GBLA global arithmetic 定义一个全局的算术变量并初始化为0 GBLA 变量名(定义的)
GBLL global logic 定义一个全局的逻辑变量并初始化为FALSE(false) GBLL 变量名(定义的)
GBLS global string 定义一个全局的字符串变量并初始化为空串 GBLS 变量名(定义的)
SETA set arithmetic 给一个算术变量(全局或局部)赋值 变量名 SETA 变量值
SETL set logic 给一个逻辑变量(全局或局部)赋值 变量名 SETL 变量值
SETS set string 给一个字符串变量(全局或局部)赋值 变量名 SETS 变量值
RLIST registers list 给一个通用寄存器列表定义名称 (定义的)名称 RLIST {寄存器列表}
VFP:矢量浮点预算
SN single name 给一个单精度VFP寄存器定义名称 (定义的)名称 SN VFP寄存器编号
DN double name 给一个双精度VFP寄存器定义名称 (定义的)名称 DN VFP寄存器编号
FN FPA name 给一个FPA浮点寄存器定义名称 (定义的)名称 FN FPA浮点寄存器编号
CP coprocessor 给一个协处理器定义名称 (定义的)名称 CP 协处理器编号
CN coprocessor register name给一个协处理器的寄存器定义名称(定义的)名称 CN 协处理器寄存器编号
注意:
1.(与RLIST相关)在LDM/STM指令中,寄存器列表中的寄存器访问次序总是先访问编号低的寄存器再访问编号高的寄存器。
2.(与SN,DN相关)VFP寄存器编号:单精度寄存器编号范围0-31,双精度寄存器编号范围0-15。
(D0-D15),(S0-S15)不能再用,因为汇编器已经预先定义了。
3.(与FN相关)FPA否点寄存器编号范围0-7。(F0-F7)不能再用,因为汇编器已经预先定义了。
4.(与CP相关)协处理器编号范围0-15。(p0-p15)不能再用,因为汇编器已经预先定义了。
5.(与CN相关)写处理器寄存器编号范围0-15。(c0-c15)不能再用,因为汇编器已经预先定义了。
2.数据定义伪操作(特定数据分配存储单元 已分配存储单元初始化 相关)
操作符 英文对照(个人猜测) 功能 语法格式
DCB data collocate byte 分配一片连续的字节存储单元并 赋值 初始化
DCW data collocate half-word 分配一段半字内存单元区域(半字对齐)
DCWU data collocate half-word unaligned 分配一段半字内存单元
DCD data collocate half-word double 分配一段字内存单元(半字对齐)
DCDU data collocate half-word double unaligned 分配一段字内存单元区域
DCFS data collocate float single 分配一段单精度浮点数内存单元(半字对齐)
DCFSU data collocate float single unaligned 分配一段单精度浮点数内存单元
DCFD data collocate float double 分配一段双精度浮点数内存单元(半字对齐)
DCFDU data collocate float double unaligned 分配一段双精度浮点数内存单元
DCQ data collocate half-word quadruple 分配一个或多个 双子内存块(半字对齐)
DCQU data collocate half-word quadruple unaligned 分配一个或多个双子内存块
LTORG literal pool origin 声明一个数据缓冲池(literal pool)
SPACE space (%与SPACE同义) 分配一片连续的字节存储区域并 初始化 为0
MAP map (可用^代替MAP命令) 定义一个结构化的内存表首地址
FIELD field (可用#代替FIFLD命令) 定义一个结构化内存表的数据域
DCDO 将内存单元的内容初始化为相对地址
DCI data collocate instructions 分配一段存放代码的内存单元
3.汇编代码控制伪操作
操作符 英文对照 功能
IF if 条件判断语句
ELSE else 条件判断语句
ENDIF end if 条件结束语句
WHILE while 循环判断语句
WEND while end 循环结束语句
MACRO macro 标识宏定义的开始
MEND macro end 标识宏定义的结束
MEXIT macro exit 中途跳转出 宏
4.汇编信息报告控制伪操作(程序调试阶段使用)
操作符 英文对照(个人猜测) 功能
ASSERT assert
INFO或! information
OPT options
TTL title
SUBT subtitle
5.指令集类型标识伪操作
助记符 英文对照 功能
ARM arm 指示编译器将要处理的是32位的ARM指令
CODE32 code32 指示编译器将要处理的是32位的ARM指令
THUMB thumb 指示编译器32位Thumb-2指令或者16位Thumb指令(对于ARM7就是指16位Thumb)
CODE16 code16 指示编译器将要处理的是16位Thumb指令
6.文件包含伪操作
助记符英文对照(个人猜测) 功能
GET get 将一个源文件包含到当前源文件中,并将被包含的源文件在其当前位置进行汇编处理
INCLUDE include 和GET功能相同(INCLUDE=GET)
INCBIN include bin 将一个文件包含到当前源文件中,被包含的文件不进行汇编处理
7.其他伪操作
助记符 英文对照(个人猜测) 功能
ALIGN align 设置对齐方式(缺省时,认为对齐到下一个字的位置)
AREA area 定义一个代码段或数据段
END end 通知汇编程序它已达到源文件的末尾
ENTRY entry 声明程序的入口点
EQU equal(可用“*”代替)为数值常量,标号指定一个符号名称。*是EQU的同义词
EXPORT export 声明一个符号可以被其他文件引用,相当于声明一个全局变量
GLOBAL global 和EXPORT功能相同(GLOBAL=EXPORT)
EXPORTAS export as 将符号导出到目标文件中,该符号与对应的源文件的符号不同
IMPORT import 通知编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定
义的,在本源文件中可以引用该符号。不管该符号在当前汇编中是否被引
用,该符号将被加入到本源文件的符号表中
EXTERN extern 通知编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定
义的,在本源文件中可以引用该符号。如果本源文件没有实际引用该符号
该符号将不会被加入到本源文件的符号表中
KEEP keep 指示汇编器将局部符号保留在目标文件的符号表中
NOFP no flour point instructions 禁止源程序中包含浮点运算指令
REQUIRE require 指定段之间的相互依赖关系
REQUIRE8 require 8 当前代码中要求数据栈8字节(64)对齐
PRESERVE8 preserve 8 指定当前代码中数据栈是8字节对齐的
ROUT routine 标记局部变量的作用域范围
8.结构描述伪操作
FRAME ADDRESS frame address
FRAME POP frame pop
FRAME PUSH frame push
FRAME REGISTER frame register
FRAME RESTORE frame restore
FRAME RETURN ADDRESS frame return address
FRAME SAVE frame save
FRAME STATE REMEMBER frame state remember
FRAME STATE RESTORE frame state restore
FRAME UNWIND ON frame unwind on
FRAME UNWIND OFF frame unwind off
FUNCTION 或PROC function/proc 标记一个兼容AAPCS 的函数开始。PROC 和FUNCTION 作用相同
ENDFUNC 或ENDP endfunction/endp 标记一个遵循AAPCS 规则的函数体结束
使用说明
1.AREA
语法格式:AREA sectionname{,attr}{,attr}…
大括号内为可选项
sectionname:段名(注意:段名用数字开头的要用两竖杠括起来,例如:|1_Date|;有些名称是习惯名称,例如|.text|,表示用C编译器生成的代码段或以某种方式与C库关联的代码节)
attr:节属性
ALING (expr):默认4字节对齐;2的expr次方 字节 对齐
ASSOC (section):指定与本段相关的ELF段,任何时候链接section段必须包含该段(sectionname段)
CODE :代码段,只读为 默认属性
COMDEF:定义通用段,可包含代码或数据。在多个源文件中同名COMDEF段必须相同,否则链接报错
COMMON :定义一个通用数据段,不包含任何用户数据和代码。被连接时自动初始化为0.各个同名
COMMON段使用相同的内存空间,各个同名COMMON段大小不一定要相同,连接时以最大尺寸
的CONMON段所占用的空间为准给CONMON段分配内存
DATA :数据段,可读写 为默认属性
NOALLOC :指定该段为虚段,并不为其在目标系统上分配内存
NOINIT :指定本 数据段 不被初始化,或可初始化为0.该操作为SPACE/DCB/DCD/DCW/DCQ等伪操作保留
了内存单元
READONLY :指定该段为 只读
DEADWRITE :指定该段为 可读写
2.FUNCTION 或PROC
语法格式如下:label FUNCTION [{Reglist1} [, {Reglist2}]]
Reglist1: 是一个可选的由被调用函数保存的ARM 寄存器列表。如果reglist1 不出现并且调试程序检查寄存器使用情况,则将假定函数符合AAPCS 规则。
Reglist2: 是一个可选的由被调用函数保存的VFP 寄存器列表。
使用说明
使用FUNCTION 来标记函数的开始。在为ELF 生成DWARF 调用框架信息时汇编程序使用FUNCTION 来标识一个函数的开始。FUNCTION 将规范框架地址设置为sp 并将框架状 态栈清空。
每个FUNCTION 伪操作必须有一个相匹配的ENDFUNC 伪操作,也就是说FUNCTION和ENDFUNC 必须成对出现。不能嵌套FUNCTION/ENDFUNC 对,并且它们不能包含PROC或ENDP 命令。
如果正在使用自己的程序调用标准,可以使用可选的reglist 参数来将有关此备选程序调用标准的信息通知调试程序,并非所有调试程序都支持此功能。详细信息请参阅所用调试器的程序。
参考文章
1. http://www.pvontek.com/fqinfo,19.html
2. http://hi.baidu.com/%CF%EB%B7%C9%B5%C4%B4%FC%CA%F3/blog/item/b99b6f94bee91116d21b70bc.html
3. http://hi.baidu.com/%CF%EB%B7%C9%B5%C4%B4%FC%CA%F3/blog/item/22eec8a4c21865ff9052ee8d.html