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体系结构与编程》        杜春雷

0 0