浅析arm汇编中^、、cxsf符号和movs等指令使用学习

发布者:CuriousTraveler最新更新时间:2016-05-09 来源: eefocus关键字:arm汇编  符号  指令  使用学习 手机看文章 扫描二维码
随时随地手机看文章
  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
  strip,[sp],#4 将ip存入sp地址处,之后sp=sp+4;
  strip,[sp,#4] 将ip存入sp+4这个新地址,之后sp值保持不变
  strip,[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模式下专有.
浅析arm汇编中^、、cxsf符号和movs等指令使用学习

-----------------------------
7.spsr_cxsf,cpsr_cxsf的理解
c - control field maskbyte(PSR[7:0])
x - extension field maskbyte(PSR[15:8])
s - status field maskbyte(PSR[23:16)
f - flags field maskbyte(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寄存器)
浅析arm汇编中^、、cxsf符号和movs等指令使用学习

(上图)
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
-----------------------------
9.指令后缀和条件判断
浅析arm汇编中^、、cxsf符号和movs等指令使用学习

(上图)
EQ: 等于
NE: 不等
CS: 无符号>=
CC : 无符号<
MI : 负数
PL : 非负[>=0]
VS : 溢出
VC : 无溢出
HI : 无符号>
LS : 无符号<=
GE: 有符号>=
LT: 有符号<
GT: 有符号>
LE: 有符号<=
AL: 总是[默认]

 

浅析linux中r0~r15寄存器对应的别名

r0
r1
r2
r3
r4
r5
r6
r7
r8
r9
r10->s1
r11->fp
r12->ip
r13->sp
r14->lr
r15->pc
 

对于arm汇编指令,可以参考linux内核的arch/arm目录,那里的汇编指令很丰富[gliethttp_20080603]

__CopyFromStart  
;    ldr     r3, [r9], #4      
;    str     r3, [r7], #4   
;    sub        r8, r8, #4 
    ldrb    r3, [r9], #1 
    strb    r3, [r7], #1
    sub     r8, r8, #1
    cmp        r8, #0
    bgt        __CopyFromStart 
    b        __JumpToBootImage
__JumpToBootImage
    MOV      pc, r0 


关键字:arm汇编  符号  指令  使用学习 引用地址:浅析arm汇编中^、、cxsf符号和movs等指令使用学习

上一篇:arm汇编中的跳转指令
下一篇:ARM汇编中的标号使用

推荐阅读最新更新时间:2024-03-16 14:53

51单片机C和汇编指令对比
一、单一指令比较: 字节操作 加法指令 减法指令 乘法指令 除法指令 取模指令 位测试指令 _testbit_ (bit); 左移指令 Variable = Variable 1; 右移指令 Variable = Variable 1; 位取反指令 与运算指令 或运算指令 异或运算指令 子程序调用 RESULT=BYTESUB(ARG1, ARG2); CALL BYTESUB 判断指令 CJNE R1,#0F0H,LABEL1 DJNZ R1,LABEL1 查表指令 RESULT = NUM ; MOVC A,@A+DPTR 指针操作指令 POINT = & NUM;
[单片机]
常用单片机指令正误分析
分析下面指令是否正确,并说明理由。 MOV R3,R7 错,两个操作数不能同时为工作寄存器 MOV B,@R2 对 DEC DPTR 错,不存在 MOV 20H.8,F0 错,位传送指令必须用C PUSH DPTR CPL 36H 错,不存在 MOV PC,#0800H 错,PC不能访问
[单片机]
基于Android的ARM汇编语言系列之五:ARM指令集与Thumb指令
章节列表 之一:ARM汇编语言开篇 之二:C/C++程序生成ARM汇编程序的过程分析 之三:ARM汇编语言程序结构 之四:ARM处理器的寻址方式 之五:ARM指令集与Thumb指令集 之六:NEON指令集与VFP指令集 写在前面:本篇文章旨在大致介绍下ARM指令集的相关内容,这里也同时提供一个有详细解释和用例的待书签的PDF版本,方便大家查阅。 ARM指令集详解 指令集是处理器的核心,ARM指令的基本格式如下所示: opcode {cond}{S}{.W\.N}Rd, Rn{.operand2} S:指定是否影响CPSR寄存器的值,如ADDS,SUBS等。 .W.N:指令宽度说明符。 Rd:目的寄存器。
[单片机]
基于Android的<font color='red'>ARM汇编</font>语言系列之五:ARM<font color='red'>指令</font>集与Thumb<font color='red'>指令</font>集
PIC单片机实现双字节无符号数的除法
编写子程序Div_16,实现双字节无符号数除法。自行定义变量,其中: ACCALO ;存放被除数低 8 位 ACCAHI ;存放被除数高 8 位 ACCBLO ;存放除数 8 位 ACCCLO ;存放余数 8 位 ACCCHI ;存放商 8 位 采用移位法,设被除数为ACCA、除数为ACCBLO、商为ACCCHI(初值为0)、余数为ACCCLO(初值为0)。ACCA由高位至低位依次左移进入ACCCLO单元,每次移位进入后比较ACCCLO单元和ACCBLO的值,如果ACCCLO≥ACCBLO,则将这一位的商单元的值置1,然后从ACCCLO中减去ACCBLO,否则不做操作。直到ACCA全部进入ACCCLO单元为止。此时AC
[单片机]
嵌入式工程师到底要不要学习ARM汇编指令
嵌入式工程师到底要不要学习ARM汇编指令? 网上搜索这个问题,答案很多,大部分的建议是不要学汇编,只要学C语言。 而一口君作为一个十几年经验的驱动工程师,个人认为,汇编语言还是需要掌握的,想要搞精、搞深,汇编和计算机系统知识是必须的。 我们来列举一些问题 系统是如何启动的? 链接C语言的函数是如何调用的,参数是如何传递的? 如何使能关闭中断? 多核处理器是如何分配进程到某个核上运行的? MMU是如何实现的? 中断产生之后,cpu是如何处理的? 系统调用是如何实现的? 这些问题要想搞懂清楚就必须要搞懂汇编代码,搞懂arm架构。 系统启动、上电代码都是汇编,汇编不掌握,你如何知道系统是如何启动的? 想了解指针的
[单片机]
STM8单片机STVD环境查看指令运行时间
在调试的情况下,View- Core Registers可查看
[单片机]
STM8单片机STVD环境查看<font color='red'>指令</font>运行时间
PIC的35条指令扭曲理解法
以下理解纯属恶搞,例子使用搜狗输入法输入,全角还是半角的懒得理了! 第一条当然是NOP, NOP 垃圾指令 操作数:垃圾当然不用说最好是没有的就好! 指令编码:00 0000 0xx0 0000 这个全是0啦,还要xx 执行时间:清理垃圾也要一个指令的 执行过程:扫垃圾,除了清理外其他什么都没变 状态标志:垃圾当然无视 说明:这个垃圾除了用来浪费时间外什么也实现不了,一般用来延时 指令例子: BSF PORTB,0 ; PORTB 端口0输出高电平 NOP ;丢个垃圾浪费下时间让IO输出稳定 第二条应该是MOVWF MOVWF 拆开 解释一下先, MOV就是寄存器缩写的意思, W就是一个叫
[单片机]
AVR单片机中左移位和右移位指令
计算机的指令系统是一套控制计算机操作的代码,称之为机器语言。计算机只能识别和执行机器语言的指令。为了便于人们理解、记忆和使用,通常用汇编语言指令来描述计算机的指令系统。汇编语言指令可通过汇编器翻译成计算机能识别的机器语言。 AVR单片机指令系统是RISC结构的精简指令集,是一种简明易掌握﹑效率高的指令系统。 SL-DIY02-3开发实验器使用AT90S8535单片机,有118条指令, 而我们所做的11个实验程序仅用了34条指令, 我们重点讲这34条指令, 其余指令就可自学了。 AVR器件(指令速查表) 118条指令器件 AT90S2313/2323/2343/2333 ,AT90S4414/4433/4434/85
[单片机]
AVR单片机中左移位和右移位<font color='red'>指令</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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