ARM学习--ARM程序设计
来源:互联网 发布:英雄连2英军单位数据 编辑:程序博客网 时间:2024/05/29 05:00
汇编基本元素:
ARM指令集:
这是自己分的类,觉得比较好记忆,具体功能参见书籍《ARM体系结构与编程》
逻辑运算指令
AND/ORR/EOR
ADD/ADC
SUB/SBC/RSB/RSC
MUL/SMULL/UMULL/MLA/SMLAL/UMLAL
CMP/CMN/TST/TEQ
BIC/CLZ
传送指令
MOV/MVN
MRS/MSR/MCR/MRC
LDR/LDR(S)B/LDR(S)H/LDRT/LDRBT
STR/STRB/STRH/STRT/STRBT
LDM/STM
CDR/LDC/STC
调试指令
B/BL/BX/BLX
SWL/BKPT
附加:ARM指令条件码:
操作码
条件助记符
标志
含义
0000
EQ
Z=1
相等
0001
NE
Z=0
不相等
0010
CS/HS
C=1
无符号数大于或等于
0011
CC/LO
C=0
无符号数小于
0100
MI
N=1
负数
0101
PL
N=0
正数或零
0110
VS
V=1
溢出
0111
VC
V=0
没有溢出
1000
HI
C=1,Z=0
无符号数大于
1001
LS
C=0,Z=1
无符号数小于或等于
1010
GE
N=V
有符号数大于或等于
1011
LT
N!=V
有符号数小于
1100
GT
Z=0,N=V
有符号数大于
1101
LE
Z=1,N!=V
有符号数小于或等于
1110
AL
任何
无条件执行 (指令默认条件)
1111
NV
任何
从不执行(不要使用)
ARM伪指令:
伪指令
说明
语法
adr
小范围的地址读取伪指令,将基于寄存器的地址值读取到寄存器中
ADR {cond} redister expr;
如地址不是字对齐,expr值为-255~255,否为-1020~102,
如果为16字节对齐,范围更大
adrl
中范围的地址读取伪指令,将基于寄存器的地址值读取到寄存器中,
汇编编译器将把该指令替换成两条合适指令,
哪怕一条指令就可完成它功能也转换。
不能进行转换时报错
ADRL {cond} redister expr;
如地址不是字对齐,expr值为-64KB~64KB,否为-256KB~256KB,
如果为16字节对齐,范围更大
ldr
大范围的地址读取伪指令,将一个地址值或32位常数读取到寄存器中
LDR {cond} redister,=[expr | label-expr];
nop
空操作伪指令,将在编译时被替换成ARM中空操作
NOP
ARM伪操作:
1、符号伪操作:
符号伪操作
说明
语法
gbla/gbll/gbls
用于声明一个全局变量,
如果已声明过变量,则变量的值被初始化为后一次声明语句中的值
operate 变量名
lbla/lbll/lbls
用于声明一个局部变量,
如果已声明过变量,则变量的值被初始化为后一次声明语句中的值
operate 变量名
seta/setl/sets
给变量赋值
operate 变量名 表达式
rlist
为一个通用寄存器定义名称
名称 operate {可操作的通用寄存器列表}
rn/
dn/sn/fn/cn/
cp
为一个特定的寄存器定义名称/
双精度的VFP(0~15)/单精度的VFP(0~31)/FPA浮点/协处理器(0~15)寄存器定义名称
为一个协处理器定义名称
名称 operate 表达式
2、数据伪操作:
数据伪操作
说明
语法
ltorg
声明一个数据缓冲池的开始
operate
map(^)
/field(#)/
space(%)/
dcd(=)
定义一个结构化的内存表的首地址/
内存表中的数据域/
分配一块内存单元/
分配一段字节内存单元
operate 数字表达式或程序中标号[寄存器]
[当前内存表中的位置计数器] operate 本数据域在内存表中所占字节数
[lable] operate 要分配的内存字节数
[lable] operate -128~255的数值或为字符串
dcd/dcdu/dcdo
分配一段字对齐的字/不严格字对齐的字/字对齐的字的内存单元
[lable] operate数字表达式或程序中的标号
dcfd/dcfdu/
dcfs/dcfsu
分配一段严格(不严格)字对齐的浮点数为双精度/
严格(不严格)字对齐的浮点数为单精度的内存单元
[lable] operat 双(单)精度的浮点数
dcq/dcqu/
dcw/dcwu
分配一段地址(不严格)对齐且以8字节为单位/
地址(不严格)半字对齐的半字内存单元
[lable] operate数字表达式64位
[lable] operate数字表达式范围是-32768~65535
dci
分配一段地址字对齐的字内存单元
[lable] operate数字表达式
3、报告伪操作:
信息报告伪操作
说明
语法
assert
在汇编编译器对汇编程序的第二遍扫描中,如逻辑表达式为假,则报告错误信息
operate 逻辑表达式
info
支持在汇编处理过程中的第一遍和第二遍扫描时报告诊断信息
operate 数字表达式,串表达式;
(如果数字表达式为0则打印字符串表达式)
opt
通过opt可以在源程序中设置列表选项,选项编码见下图
operate 选项编码
ttl/subt
在列表文件每一页的开头插入一个标题/子标题
operate 标题
4、控制伪操作:
控制伪操作
说明
macro,mend,mexit
宏定义
if,else,endif
条件语句
while,wend
循环语句
5、结构伪操作:
结构(其他)伪操作
说明
语法
equ(*)
作为数字常量、基于寄存器的值定义一个字符名称,类似于C语言中的#define
名称 operate 值
include(get)/incbin
将filename文件包含到当前源文件中并在当前位置进行(不进行)汇编处理
operate 文件名
export(global)/
import/
extern
声明全局变量符号,其他同名符号优于本符号本引用/
声明一个符号可以被其他文件引用/
告诉编译器符号(当前符号)不在本源文件中定义但可以使用
operate 符号[WEAK]
keep
告诉编译器将局部符号包含目标文件符号表中,
没有指定符号时,除给予寄存器外的全部符号全部包含
operate 符号
require
指定段之间的依赖关系
operate lable
require8/preserve8
指示当前代码中要求数据栈是8字节/数据栈是8字节对齐的
operate
nofp
禁止源程序中包含浮点运算指令
operate
area
用于定义一个代码段或数据段
operate 段名称(数字开头两端要加|) 属性
align
通过添加补丁字节使当前位置满足一定的对齐方式,
后面无参数时默认对齐方式是4字节对齐
operate 数字表达式(2的次幂),数字表达式
data
在代码中使用数据,现在已不再使用,只用于保持向前兼容
省略
entry
程序的入口点,一个程序至少要有1个entry,一个源文件至多有1个entry
operate
end
源程序的结尾
operate
code16/code32
使用混合指令时,告诉汇编器后面程序指令是16位Thumb/32位ARM指令,
但此操作并不进行程序状态切换
operate
rout
将局部变量名的作用范围限制在当前位置与同一段(area)中的下一个rout中
所定义的范围名称 operate
6、栈中数据帧描述伪操作:
主要用于调试,不在介绍,详情百度。
语句格式:
编译器使用:
程序举例:
参考文档:
《ARM体系结构与编程》 杜春雷
- ARM学习--ARM程序设计
- ARM程序设计基础
- arm程序设计优化
- ARM程序设计优化
- ARM程序设计基础
- ARM程序设计基础
- ARM ADC程序设计
- arm程序设计优化
- ARM 汇编语言程序设计
- 学习ARM
- ARM学习!
- ARM学习
- Arm学习
- ARM基础 八、ARM汇编语言程序设计
- ARM学习之图解ARM
- arm
- ARM
- ARM
- subVersion 版本控制系统搭建与使用
- 黑马程序员---Java Collection Framework
- 关于 优先队列 得有关库函数( priority_queue)
- 关于框架的一些胡思乱想
- NPAPI 插件研究经验总结
- ARM学习--ARM程序设计
- 1个 网站 完成了
- jap集成
- 华为7.9三道面试题
- windows 优雅的结束应用程序
- mini2440 rtc支持
- 足球与oracle系列(4):从巴西惨败于德国,想到,差异的RAC拓扑对比!
- NPAPI插件开发学习:NPAPI的介绍
- The Kernel Newbie Corner: Kernel Symbols: What's Available to Your Module, What Isn't