浅析arm汇编中指令使用学习

发布者:疯狂小马最新更新时间:2016-07-13 来源: eefocus关键字:arm  汇编  指令使用 手机看文章 扫描二维码
随时随地手机看文章
macro restore_user_regs

  ldr r1,[sp, #S_PSR]
  ldr lr,[sp, #S_PC]!  @ !用来控制基址变址寻址的最终新地址是否进行回写操作,
                      @ 执行ldr之后sp被回写成sp+#S_PC基址变址寻址的新地址
  msr spsr,r1          @ 把cpsr的值保存到spsr中
  ldmdb sp,{r0 - lr}^  @ lr=[sp-1*4],r13=[sp-2*4],r12=[sp-3*4],......,r0=[sp-15*4]
                      @ 因为没对pc赋值,所以^的表示将数据恢复到User模式的[r0-lr]寄存器组中[gliethttp]
  mov r0,r0 
  add sp,sp,#S_FRAME_SIZE - S_PC
  movs pc,lr
.endm

其他指令正在学习中[随时补充gliethttp]
-----------------------------
1.ldr ip,[sp],#4 将sp中内容存入ip,之后sp=sp+4;
  ldr ip,[sp,#4] 将sp+4这个新地址下内容存入ip,之后sp值保持不变
  ldr ip,[sp,#4]!将sp+4这个新地址下内容存入ip,之后sp=sp+4将新地址值赋给sp
  str ip,[sp],#4 将ip存入sp地址处,之后sp=sp+4;
  str ip,[sp,#4] 将ip存入sp+4这个新地址,之后sp值保持不变
  str ip,[sp,#4]!将ip存入sp+4这个新地址,之后sp=sp+4将新地址值赋给sp
-----------------------------
2.movs r1,#3 ;movs将导致ALU被更改,因为r1赋值非0,即操作结果r0非0,所以ALU的Z标志清0
  bne 1f    ;因为Z=0,说明不等,所以向前跳到标号1:所在处继续执行其他语句
-----------------------------
3.LDM表示装载,STM表示存储.
  LDMED LDMIB 预先增加装载
  LDMFD LDMIA 过后增加装载
  LDMEA LDMDB 预先减少装载
  LDMFA LDMDA 过后减少装载

  STMFA STMIB 预先增加存储
  STMEA STMIA 过后增加存储
  STMFD STMDB 预先减少存储
  STMED STMDA 过后减少存储

注意ED不同于IB;只对于预先减少装是相同的.在存储的时候,ED是过后减少的.
FD、ED、FA、和 EA 指定是满栈还是空栈,是升序栈还是降序栈.
对于存储STM而言
先加后存 FA 姑且这么来记,先加(first add),存数据
后加先存 EA 姑且这么来记,存数据,后加end add
先减后存 FD 姑且这么来记,先减first dec,存数据
后减先存 ED 姑且这么来记,存数据,后减end dec
然后记忆LDM,LDM是STM的反相弹出动作,所以
因为是先加后存,所以后减先取 FA 就成了与STM对应的取数据,后减
因为是后加先存,所以先减后取 EA 就成了与STM对应的先减,取数据
因为是先减后存,所以后加先取 FD 就成了与STM对应的取数据,后加
因为是后减先存,所以先加后取 ED 就成了与STM对应的先加,取数据
我想通过上面的变态方式可以比较容易的记住这套指令[gliethttp]
一个满栈的栈指针指向上次写的最后一个数据单元,而空栈的栈指针指向第一个空闲单元.
一个降序栈是在内存中反向增长(就是说,从应用程序空间结束处开始反向增长)而升序栈在内存中正向增长. 
其他形式简单的描述指令的行为,意思分别是
IA过后增加(Increment After)、
IB预先增加(Increment Before)、
DA过后减少(Decrement After)、
DB预先减少(Decrement Before).

RISC OS使用传统的满降序栈.在使用符合APCS规定的编译器的时候,它通常把你的栈指针设置在应用程序空间的结束处并接着使用一个FD(满降序-Full Descending)栈.如果你与一个高级语言(BASIC或C)一起工作,你将别无选择.
栈指针(传统上是R13)指向一个满降序栈.你必须继续这个格式,或则建立并管理你自己的栈.

4.teq r1,#0    //r1-0,将结果送入状态标志,如果r1和0相减的结果为0,那么ALU的Z置位,否则Z清0
bne reschedule//ne表示Z非0,即:不等,那么执行reschedule函数
-----------------------------
5.使用tst来检查是否设置了特定的位
tst r1,#0x80 //按位and操作,检测r1的0x1<<7,即第7位是否置1,按位与之后结果为0,那么ALU的Z置位
beq reset    //如果Z置位,即:以上按位与操作结果是0,那么跳转到reset标号执行
-----------------------------
6.'^'的理解
'^'是一个后缀标志,不能在User模式和Sys系统模式下使用该标志.该标志有两个存在目的:
6.1.对于LDM操作,同时恢复的寄存器中含有pc(r15)寄存器,那么指令执行的同时cpu自动将spsr拷贝到cpsr中
如:在IRQ中断返回代码中[如下为ads环境下的代码gliethttp]
ldmfd {r4}          //读取sp中保存的的spsr值到r4中
msr spsr_cxsf,r4    //对spsr的所有控制为进行写操作,将r4的值全部注入spsr
ldmfd {r0-r12,lr,pc}^//当指令执行完毕,pc跳转之前,将spsr的值自动拷贝到cpsr中[gliethttp]
6.2.数据的送入、送出发生在User用户模式下的寄存器,而非当前模式寄存器
如:ldmdb sp,{r0 - lr}^;表示sp栈中的数据到User分组寄存器r0-lr中,而不是恢复到当前模式寄存器r0-lr  当然对于User,System,IRQ,SVC,Abort,Undefined这6种模式来说[gliethttp]r0-r12是共用的,只是r13和r14
  为分别独有,对于FIQ模式,仅仅r0-r7是和前6中模式的r0-r7共用,r8-r14都是FIQ模式下专有.
7.spsr_cxsf,cpsr_cxsf的理解
c - control field mask byte(PSR[7:0])
x - extension field mask byte(PSR[15:8])
s - status field mask byte(PSR[23:16)
f - flags field mask byte(PSR[31:24]).
老式声明方式:cpsr_flg,cpsr_all在ADS中已经不在支持
cpsr_flg对应cpsr_f
cpsr_all对应cpsr_cxsf

需要使用专用指令对cpsr和spsr操作:mrs,msr
mrs tmp,cpsr      //读取CPSR的值
bic tmp,tmp,#0x80 //如果第7位为1,将其清0
msr cpsr_c,tmp    //对控制位区psr[7:0]进行写操作
-----------------------------
8.cpsr的理解
CPSR = Current Program Status Register
SPSR = Saved Program Status Registers
CPSR寄存器(和保存它的SPSR寄存器)
N,Z,C,V称为ALU状态标志
N:如果结果是负数则置位
Z:如果结果是零则置位
C:如果发生进位则置位
V:如果发生溢出则置位
I:置位表示禁用IRQ中断,清0表示使能IRQ
F:置位表示禁用FIQ中断,清0表示使能FIQ
T:置位表示系统运行在Thumb态,清0表示运行在ARM态
M[4:0]:
10000 User模式,和System系统模式一样
10001 FIQ模式
10010 IRQ模式
10011 SVC超级管理模式
10111 Abort数据异常模式
11011 Undefined未定义指令模式
11111 System系统模式,和User模式一样

举例:
ands r2,r2,#7 使用运算结果改变标志位,如果运算结果r2=0,那么Z置位,EQ相等判断成立
subs r2,r2,#1 使用运算结果改变标志位,如果运算结果r2=0,那么Z置位,EQ相等判断成立
beq wordcopy
EQ : 等于
NE : 不等
CS : 无符号>=
CC : 无符号<
MI : 负数
PL : 非负[>=0]
VS : 溢出
VC : 无溢出
HI : 无符号>
LS : 无符号<=
GE : 有符号>=
LT : 有符号<
GT : 有符号>
LE : 有符号<=
AL : 总是[默认]

 

关键字:arm  汇编  指令使用 引用地址:浅析arm汇编中指令使用学习

上一篇:ARM伪指令之地址读取:ADR/ADRL/LDR
下一篇:arm汇编—str指令

推荐阅读最新更新时间:2024-03-16 15:00

基于ARM的旋转编码器采集模块设计
随着工业生产自动化水平的提高,各种传感器的应用也越来越多。旋转编码器作为速度和位移反馈的传感器,主要应用于数控机床、高精度的闭环调速系统、伺服电动机、异步电动机、步进电动机、电梯曳引机、电梯门机乃至机械轴等需要对运动速度和位移信息反馈的自动化控制场合,以保证机械的高精度稳定运转,进而提高生产效率和保障安全运营。 本文针对旋转编码器在工业现场中的应用,基于LPCI768硬件平台,设计出一种旋转编码器采集模块,该模块内部具有高精度分析、整形、解码电路,可同时对2路编码器输入信号进行分析、解码。经过处理的旋转信号通过高性能处理器进行采集及数字滤波。旋转编码器同时还对2路编码器信号进行角速度计算,最终模块通过CAN总线将采集到的旋转位置
[电源管理]
基于<font color='red'>ARM</font>的旋转编码器采集模块设计
软银考虑出售或者让Arm重新上市
根据《华尔街日报》的最新报道指出,软银集团正为旗下英国芯片设计公司Arm探索几个可能的出路,包括全部或部分出售以及公开上市。 知情人士表示,软银已经聘请高盛担任本次资本运作的顾问,但行动仍处于早期探索阶段,目前还不清楚这些计划将如何实现,软银也有可能选择什么都不做。 软银在2016年以320亿美元的价格收购了Arm。据报道,当初软银收购Arm的一部分原因是为了将业务扩展到物联网领域。 软银创始人孙正义去年曾表示,他希望在五年内让Arm重新上市。而稍早前,Arm表示计划将两个软件业务转让给日本母公司软银集团,将经营战略转向专注于发展核心芯片业务,并且希望在9月之前将该业务完成转让。 此消息传出后,国内有媒体写到,“外媒称苹果
[手机便携]
软银考虑出售或者让<font color='red'>Arm</font>重新上市
基于ARM920T微处理器的IDE硬盘接口设计与实现
   1 引言   20世纪90年代后期,嵌入式系统在工业控制、远程监控和数据采集等领域的应用日趋广泛,人们对嵌入式系统的存储容量也提出了较高的要求。因此研制适用于嵌入式系统的大容量、高速率、高可靠性的数据存储系统变得日益重要。本文针对一款基于ARM920T芯片的开发板,根据ATA硬盘接口规范,设计了IDE硬盘接口电路,实现了对IDE硬盘的读写,可以在Linux系统中对其上的文件系统自由访问,达到了高速率和高可靠性的要求。    2 ARM920T与S3C2410介绍   ARM 包括一系列微处理芯片技术。ARM920T是ARM系列微处理器的一种,它采用5阶段管道化ARM9TDMI内核,同时配备了Thumb扩展、Emb
[嵌入式]
ARM_Core的处理器模式与寄存器
ARM处理器的工作状态:ARM处理器有两种工作状态。在程序的执行过程中,处理器可以在两种工作状态之间切换,并且不影响 相应寄存器中的内容。 ARM状态,此时处理器执行32位对齐的ARM指令;BX指令,当操作数寄存器最低位为0时,进入ARM状态。 Thumb,此时处理器执行16位对齐的Thumb指令。BX指令,当操作数寄存器最低位为1时,进入Thumb状态。 BX(Branch Exchange):BX Rn; ##其中Rn可以是R0-R15中的任意一个。指令通过将寄存器Rn的内容拷贝到程序计数器PC 来完成4Gbyte的地址空间的跳转。 在进入异常中断后,
[单片机]
编译基于ARM LINUX的驱动模块的Makefile
KERNELDIR = /home/wenhao/platform/linux-2.6.34 PWD := $(shell pwd) CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-linux- CC = $(CROSS_COMPILE)gcc obj-m := key.o modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions .PHONY: modules clean
[单片机]
基于ARM单片机的自动测高测距小车的研究与设计
摘要:生活中许多目标的高度和水平距离需要进行测量。目前主要的测量方法,仍以传统的皮尺丈量为主,测量效率不高,有时还很不方便,没有技术成熟的数字式测高测距产品。以基本的数学方法为理论依据,利用遥控小车做为载体,采用角度传感器测量角度、霍尔传感器测量水平距离等,通过单片机LM3S615进行数据计算,实现了对待测目标物体的高度、水平距离等数据的快速、精确和数字式的测量,高度测量精度可达99.06%,水平测量精度则可迭98.06%。 关键词:测高;测距;LM3S615;角度传感器;霍尔传感器;LCD液晶显示 目前,国内外对于测高、测距的研究主要集中在基于对卫星、雷达等信号进行的处理,其应用范围主要集中在军事、海洋或地质等数据的测量及勘
[单片机]
基于<font color='red'>ARM</font>单片机的自动测高测距小车的研究与设计
ARM与台积电携手完成16nm FinFET工艺测试 年内客户或超20家
    对于英特尔来说,要想在移动芯片市场多分得一杯羹,就需要借助其更加先进的制造能力的优势。而今日宣布的新款Atom SoCs——举例来说——即基于22nm的3D或“三栅极晶体管”工艺。与传统的(基于平面晶体管结构的)芯片相比,新架构使得芯片可以在较低的电压水平上,更有效率地运作——在降低能耗的同时,更能延长系统的续航时间。 至于半导体行业中的其它公司,已经在向3D晶体管工艺(更常用的称呼为“FinFETs”)迁移的过程中,落后于英特尔。 如果没有这种新的结构,那么向28nm以下制程迁移的过程就会变缓。其中一部分原因为,随着平面型晶体管(planar transistor)变得更小,其能源效率和成本就变得不那么有吸引力。 幸运的
[手机便携]
ARM Cortex-M3 学习笔记(2)
最近在学ARM Cortex-M3,找了本号称很经典的书 An Definitive Guide to The ARM Cortex-M3 在看。这个系列学习笔记其实就是在学习这本书的过程中做的读书笔记。 第二章 Cortex-M3 概述 Cortex M3 内核的组成可以用一张简图来表示: 图 3 Cortex-M3内核简图 内核寄存器组包括R0-R15,R0-R12是通用寄存器,部分Thumb指令只能访问R0-R7。 R13是堆栈指针,实际上有两个,一个是主堆栈指针(MSP)另一个是进程堆栈指针(PSP),堆栈要求4字节对齐。 R14存放程序的返回地址。 R15是PC,记录程序当前的执行地址。 特殊功能寄存器包
[单片机]
<font color='red'>ARM</font> Cortex-M3 学习笔记(2)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved