您的位置 首页 主动

ARM指令集和常用寄存器

1)ARM指令集32位的ARM指令和16位的Thumb指令1,寄存器寻址MOVR1,R2//将寄存器R2的值传给寄存器R12,立即寻址MOVR0,#0XF…

1)ARM指令集 32位的 ARM指令和 16位 的Thumb指令

1,存放器寻址
MOV R1, R2 //将存放器R2的值传给存放器R1
2,当即寻址
MOV R0, #0XFF00 //数据包含在指令中
3,存放器偏移寻址
MOV R0, R2, LSL #3 //R2的值左移3位,成果放入 R0中 即 R0 = R2 * 8
LSL逻辑左移、 LSR逻辑右移、 ASL算术左移、 ASR算术右移、 ROR循环右移、RRX带扩展的循环右移
4,存放器直接寻址
LDR R1, [R2] //将R2中的数值作为地址,取出此地址的数据保存在R1中
SWP R1,R1,[R2] //将R2中的数值作为地址
5,基址寻址 将基址存放器的内容与指令中给出的偏移量相加,构成有用地址
LDR R2,[R3, #0x0F] //将R3中数值加0x0F作为地址,取出数据保存在R2中
LDR R0, [R1], #-4 //将R1地址单元内容存入R0中,且R1= R1 – 4
STR R1, [R0, #-2] //将R0中数值减2作为地址,
6,多存放器寻址
LDMIA R1!, {R2-R7, R12} //将R1单元的数据读出到R2-R7,R12中,R1主动加1
STMIA R0!,{R3-R6,R10} //将R3-R6中德数据保存到R0指向的地址,R0主动加1
7,仓库寻址
满递加 LDMFA STMFA
满递减 LDMFD STMFD
空递加 LDMEA STMEA
空递减 LDMED STMED
8,块复制寻址 多存放器传送指令用于一块数据从存储器的某一方位复制到另一方位
STMIA R0!,{R1-R7}
STMIB R0!, {R1-R7}
STMDA
STMDB
9,相对寻址
由程序计数器PC供给基准地址,指令中地址码字段作为偏移量,两者相加都得到的地址即为操作数的有用地址
带S的会影响CPSR存放器,标志位
R15 为程序计数器PC。
2)ARM存储器拜访指令
ARM处理器是加载/存储体系结构的典型RISC处理器,对存储器的拜访只能运用加载和存储指令完成。LDR/STR
批量加载和存储指令可完成一条指令加载/存储多个存放器的内容,大大提高了功率。SWP指令是一条存放器和存储器
内容交流的指令,可用于信号量操作等。ARM处理器是冯诺依曼存储结构,程序空间、RAM空间及IO映射空间一致编址,
除对RAM操作外,对外围IO、程序数据的拜访均要经过加载/存储指令进行。
LDR/STR T为可选后缀,有T表明处理器在特权形式下,运用后缀!表明成果回写。S表明带符号扩展。
B后缀表一个字节, H表明半字(2字节),
程序相对偏移 LDR Rd, label; //label为程序标号,有必要是当时指令的+-4KB规模内
1,LDM 和 STM 能够完成一组存放器和一块接连的内存单元之间传输数据。首要用于现场维护、数据、参数传递等。
IA 传送后地址加4 DA 传送后地址减4
IB 传送前地址加4 DB 传送前地址减4
STMFD R0!,{R0-R7,LR} //现场保存 将R0-R7,LR入栈
LDMFD R1!,{R0-R7,PC} //康复现场 反常处理回来
2,SWP
存放器和存储器交流指令,用于将一个内存单元(该单元地址放在存放器Rn中)的内容读取到一个存放器Rd中,一起将另
一个存放器Rm的内容写入到该内存单元中。
SWP R1, R2, [R0] //将R0指向存储单元内容读取一字节到R1中(高24位清零),并将R2内容写入该内存单元
3)ARM跳转指令
B label 跳转指令 Pc<-label 约束在当时指令的+-32KB的规模内
BL label 带链接的跳转指令 LR<- PC-4, PC<- label 用于子程序调用
BX Rm 带状况切换的跳转指令 PC<- label切换状况
4)ARM协处理器指令
1,CDP 告诉ARM协处理器履行特定的操作
2,LDC 从某一接连的内存单元将数据读取到协处理器的存放器中
LDC p5, c2, [R2, #4] //读取R2+4指向内存单元的数据传送到协处理器p5的c2存放器中
3,STC 将协处理器的存放器数据写入到某一接连的内存单元中
4,MCR 将ARM处理器的存放器中的数据传送到协处理器的存放器中。
5,MRC 将协处理器的存放器中的数据传送到ARM处理器的存放器中。
5)ARM杂项指令
SWI immediately——24 软中止指令 处理器进入管理形式
MRS Rd, psr 读状况存放器指令
MSR psr_fields, Rd/#immed_8r 写状况存放器指令
6)ARM伪指令
ADR伪指令 小规模的地址读取伪指令,用于将PC相对偏移的地址值读取到存放器中。
ADRL伪指令 中等规模的地址读取伪指令,用于将PC相对偏移的地址值或根据存放器相对偏移的地址值读取到存放器中。
LDR伪指令 大规模的地址读取伪指令,用于加载32位的当即数或一个地址到指定存放器中。
NOP伪指令 空操作伪指令
ARM汇编程序由机器指令, 伪指令和宏指令组成,伪指令不像机器指令那样在处理器运转期间由机器履行,而是由汇编程序
对源程序处理。
1)符号界说伪指令
GBLA大局的算术变量初始化为0 LCLA 部分的 SETA 赋值
GBLL大局的逻辑变量初始化为false LCLL 部分的 SETL 赋值
GBLS大局的字符串变量初始化空 LCLS 部分的 SETS 赋值
ARM处理器共有 37个存放器。其间包含:
**31个通用存放器,包含程序计数器(PC)在内。这些存放器都是32位存放器。
**6个状况存放器。这些存放器也是32位存放器。
ARM处理器共有7种不同的处理器形式,每一种形式中都有一组相应的存放器组。在任何时刻,可见的存放器包含15个通用存放器
(R0-R14),一个或两个状况存放器及程序计数器(PC)。在一切的存放器中,有些是各形式共用一个物理存放器,有一些存放
器各形式具有自己独立的物理存放器。
****************************************************
通用存放器 ARM
通用存放器分为以下三类:备份存放器、未备份存放器、程序计数器PC
备份存放器
关于R8-R12备份存放器来说,每个存放器对应两个不同的物理存放器。体系为将备份存放器用于任何的特殊用处,可是
当中止处理十分简略,只是运用R8-R14存放器时,FIQ处理程序能够不用履行保存和康复中止现场的指令,然后能够使中
断处理十分敏捷。 ARM
关于R13,R14备份存放器来说,每个存放器对应六个不同的物理存放器,其间的一个是体系形式和用户形式共用的;别的
的五个对应于其他的五种处理器形式。选用下面的记号来区别各个物理存放器:
R13_ 字串5
其间MODE能够是下面几种形式之一:usr,svc,abt,und,irq,fiq
字串5
未备份存放器
未备份存放器包含R0-R7。关于每一个未备份存放器来说,一切处理器形式下都是运用同一个物理存放器。未备份存放器
没有被体系用于特殊的用处,任何可选用通用存放器的场合都能够运用未备份存放器。
程序计数器PC
能够作为一般的通用存放器运用,但有一些指令在运用R15时有一些约束。因为ARM选用了流水线处理器机制,当正确读取
了PC的值时,该值为当时指令地址值加上8个字节。也就是说,关于ARM指令集来说,PC指向当时指令的下两条指令的地址。
因为ARM指令是字对齐的,PC值的第0位和第一位总为0。
需求留意的是,当运用str/stm保存R15时,保存的或许是当时指令地址值加8个字节,也或许保存的是当时指令地址值加12
个字节。究竟哪种方法取决于芯片的详细规划。关于用户来说,尽量防止运用STR/STM指令来保存R15的值。
当成功的向R15写入一个数值时,程序将跳转到该地址履行。因为ARM指令是字对齐的,写入R15的值应满意bits[1:0]为0b00
,详细要求arm个版别有所不同:
**关于arm3以及更低的版别,写入R15的地址值bits[1:0]被疏忽,即写入r15的地址值将与0xFFFF FFFC做与操作。
**关于ARM4以及更高的版别,程序有必要确保写入R15的地址值bits[1:0]为0b00,否则将发生不行预知的结果。
关于Thumb指令集来说,指令是班子对齐的,处理器将疏忽bit[0]。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/277129.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部