微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM体系结构学习4

ARM体系结构学习4

时间:11-21 来源:互联网 点击:

低位是否为1,%表示二进制

nBIC清位操作

BICR0,R0,#0xF等同于R0&=~(0xF)

BICR0,R0,#%1011该指令清除R0中的位0 13,其余的位保持;%表示是二进制,0x表示十六进制

6.比较指令CMP

nCMP比较两个操作数,并把结果存入CPSR供下一句语句使用

CMP R0,R1;比较R0,R1

7.多寄存器语句传输指令,LDM,STM

类似于一次传一个BUFFER到寄存器当中,或反过来.后面一般要接一个地址改变方法

nLDM从BUFFER传数据多个寄存器传输数据到

LDMIA R0! ,{R3-R9};加R0指向的地址上连续空间的数据,保存到R3-R9当中,!表示R0值更新,IA后缀表示按WORD递增

LDMFD SP!,{R0-R7,PC}^;恢复现场,异常处理返回,^表示不允许在用户模式下使用。

nSTM从寄存器列表向存储空间传值。

STMIA R1!,{R3-R9};将R3-R9的数据存储到R1指向的地址上,R1值更新。

STMFD SP!,{R0-R7,LR};现场保存,将R0~R7,LR入栈

stmfdsp!,{r8-r9},把SP寄存器对庆的地址的值存到R8,R9当中.!表示最后的值写入SP中。Fd表示

8.ARM指令的变形

大部分指令后位可以接与S两个特殊位来表示,对CPSR特殊的一些判断

S,表示当前指令执行后把结果改写CPSR

subs,Adds

取决于具体条件,只有CPSR满足指定条件时才指这一指令

BEQ实际上B+ EQ的条件执行.

addne表示ADD +NE才开始加.

9.ARM指令的寻址方式

寻址方式是根据指令中给出的地址码来定位真实的地址,ARM中有9种寻址方法

l寄存器寻址

直接用寄存器编号来寻址,最为常用

MOV R1,R2;R2->R1

l立即数寻址

即指令中的地址码是操作数本身,可以立即取出使用,立即数前带一个#表示,否则表示一个地址

SUBS R0,R0,#1;R0 -1 ->R0

注意与SUBS R0,R0,1区别

l寄存器偏移寻址

这是ARM特有的寻址模式,当第2操作数是寄存器,在执行操作之前,可以做一次移位操作

MOV R0,R2,LSL #3;R2的逻辑左移3位,结果放入R0,即R0=R2*8

ANDS R1,R1,R2,LSL R3;RS的值左移R3位,然后和R1相与操作,结果放入R1

移位操作有LSL (逻辑左移),LSR(逻辑右移) ,ASR(算术右移),ROR(循环右移)RRX带扩展的循环右移

l寄存器间接寻址

即寄存器中值是一个地址,用[]来取出定位到地址当中

LDR R2,[R0];把R0的值当成地址,取出相应值,赋给R2

l基址寻址

把寄存器的地址值加上一个偏移量

LDR R2,[R3,#0x0F]; R3中的值加上0x0F,从这个地址取出值赋给R@

l相对寻址

基址寻址的变形,由PC寄存器提供基准地址,指令中地址段作为偏移量.两者相加即是有效地址,以下是BL采用相对寻址

BL NEXT

NEXT

MOV PC,LR;从子程序返回

10.ADS ARM的伪指令

类似于C语言的宏,由汇编程序预处理.

l符号定义指令

全局变量定义GBLA ,GBLL,GBLS

局域变量定义LCLA,LCLL,LCLS

变量赋值SETA,SETL,SETS

其中上述伪指令中,最后面的A表示给一个算术变量赋值,L表示用于给一个逻辑变量赋值,s表示给一个字符串赋值

GBLL codedbg;声明一个全局的逻辑变量

Codebg SETL{TRUE};设置变量为{TRUE}

LCLA bitno;声明一个算术变量

Bitno SETA 8;设变量值为8

l数据定义伪指令

nSPACE定义一个内存空间,并用0初始化

{label }SPACE expr

DataBuf SPACE 100;定义100字节长空间, unsigned char DataBuf[100];

nDCB定义一个连续字节内存空间,用伪指令的表达式expr来初始化.一般可以用定义数据表格,或文字字符串.(这时等同于SETS),用于初始二进制BUFFER

{label} DCB expr{,expr …}

Dest DCB -120,20,36,55;等同于unsigned char Dest[]={-120,20,36,55};

nDCU定义的一段字的内存空间(DCB是字节),并用后面表达式初始化

_RESET DCU Reset;等同于DWORD _RESET[]={Reset};

nMAP定一个结构化内存,相当于定义一个C结构

nFILED定义一个结构化内存的成员

MAP 0x00,R9;定义内存表,地址为R9

TimerFIELD 4;定义数据域Timer,长为4字

AttribFIELD 4;定义数据域Attrib,长为4字

StringFILED 100;定义数据域String ,长为100字

相当于C语言的定义:

struct {

DWORD Timer ;

DWORD Attrib ;

Char String[100];

} R9;

11.杂项的伪指令

n字节对齐ALIGN

ALIGN;声明4字节对齐

n定义一个数字常量定义EQU

NAME EQU expr {type}

PLLCON EQU 0xE01FC080;定义PLLCON,类似于C的宏或C++的常量

n包含文件GET和INCLUDE

INCLUDE lpc2106.inc

nNOP空指令

在汇编时会被ARM的空操作代替,比如MOV R0,R0,一般用于延时与占位。

n声明一个外部符符号IMPORT,EXTERN

IMPORT,EXTERN向外部导入一个符号,一般是外部程序全局变量

n条件编译:[]。类似于C的#ifdef之类定义。

格式:[条件表达式

满足条件分支

|

不满足条件分支

]

示例1:

[ ENTRY_BUS_WIDTH=32;类似#if ENTRY_BUS_WIDTH=32

bChangeBigEndian;DCD 0xea000007

] ;类似#endif

示例2:[ CLKdiv_VAL>1;类似#if CLKdiv_VAL>1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top