ARM指令集学习总结-转载

ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方。

一、ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指令都可以是有条件执行的。
   
    二、ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访问,而其他的指令都是基于处理器内部的寄存器操作完成的,这和INTEL汇编是不同的,初学者很不易理解。
  
    三、指令的后缀:
    "S"  可选后缀,若指定S,则根据指令执行的结果更新CPSR中的条件码。很多初学着不知道怎么更新,若这条指令执行完以后,对ARM程序状态寄存器的条件码标志(N,Z,C,V)的影响。
    "! " 表示在完成数据操作以后,将更新基址寄存器,并且不消耗额外的时间。
         如:LDR R0, [R1, #4] 他相当于 R0 <- mem32[R1+4]
                                      R1 = R1+4; 
    "^"  LDMFD R13!, (R0-R3, PC)^ //"^"表示一条特殊形式的指令。(在从存储器中装入PC的同时,CPSR也得到恢复)。

四、#号后面加0x或&表示十六进制:#0xFF, #&FF
        #号后面加0b表示二进制。
        #号后面加0d表示十进制。   
*******************************************************************************

五、立即数寻址
    每个立即数都是采用一个8位的常数循环右移偶数位间接得到。
    初学者不易理解:一个32位的指令不可能全部用来保存32位的立即数,所以从指令的编码格式上分析,在指令编码中只分配了12位来存储立即数,其中4位用来保存右循环值,8位用来保存一个常数,所以并不是每一个32位的立即数都是合法的。

六、寄存器寻址
    ADD R3,R2,R1,LSR #2 //寄存器R1的内容右移了两位,但是注意本指令执行完毕以后R1的内容并不改变。

七、前变址、自动变址和后变址
    1、前变址:LDR R0,[R1,#4]   //R1寄存器的内容先加4,然后执行操作,但操作完毕以后,R1的内容不变。
    2、自动变址:上面总结指令后缀时提到"!",表示自动变址(参考上面 三 )。
    3、后变址:LDR R0,[R1],#4   //先进行操作然后R1+4->R1,操作完毕后,R1 = R1+4。不需要"!"号。
 
    八、堆栈寻址
    一定要注意:堆栈操作总是要指定自动变址的,否则会覆盖以前保存的内容。
********************************************************************************

九、乘法指令
    1、乘法指令不支持第二操作数为立即数。
    2、结果寄存器不能同时作为第一源寄存器。
        32位:MUL Rd,Rm,Rs
              MUL Rd,Rm,Rs  //Rd和Rm不能为同一寄存器
        64位:MUL RdHi,RdLo,Rm,Rs //RdHi、RdLo和Rm不能为同一寄存器,RdHi和RdLo不能为同一寄存器。

十、跳转指令
    1、BL和BLX跳转是硬件自动将下一条指令地址保存到LR(R14)中,不需要自己写指令。
    2、当指令跳转到32MB地址空间以外时,将产生不可预料的结果。

ARM的指令集比较简单,肯定还有其他需要注意的地方,欢迎网友们积极参与补充。

ARM指令集学习总结-转载,布布扣,bubuko.com

时间: 2024-12-25 02:28:26

ARM指令集学习总结-转载的相关文章

Android上学习ARM指令集之开篇

工作中经常碰到crash的问题,如果是Debug版本,有源代码,那还好,调试信息多.万一Release给QA甚至客户之后,再发现crash之类的问题,如果不熟悉ARM指令.看不懂现场,那调试起来可就费劲了.往往只能到处去猜,相信大家都有过这种难过的经历. 这段时间比较闲,正好利用起来为入门ARM指令集写点初级文章,没什么远大理想,写到哪里算哪里,权当娱乐罢了. 环境准备:现在的学习环境可真是方便啊,几乎人手一台android手机,而绝大多数手机都是ARM家族的,所以只需要给手机或者平板电脑安装一

Android ARM指令学习

在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上的ARM-cpu基本都支持一种叫做THUMB的指令集模式.这个THUMB指令集可以看作是ARM指令集的子集,只不过ARM指令集为32bit,THUMB指令集为16bit.之所以要使用这个THUMB指令集,主要是为了提升代码密度.具体信息大家可以google. 下面介绍如何简单修改.so文件. 首先,

ARM指令集----杂项指令

ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种是直接向PC寄存器写入目标地址的值 通过直接向PC寄存器写入目标寄存器的数字可以实现在4GB 地址空间的任意跳转,这种跳转又称为长跳转,如果在残肢令前面使用MOV LR,PC等指令,可以保存返回来的地址值,这样就实现了在4GB空间中的子程序调用 ARM的跳转指令可以从当前指令向前或者是向后的32位的

对arm指令集的疑惑,静态库运行,编译报错等问题

转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=qq 对arm指令集的疑惑,静态库运行的问题,翻看了很多资料,整理如下: 1:blog.csdn.net/lizhongfu2013/article/details/42387311 下面内容转发自上述链接:iOS开发-制作同时支持armv7,armv7s,arm

[基于Android的ARM汇编语言系列]之五:ARM指令集与Thumb指令集

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 写在前面:本篇文章旨在大致介绍下ARM指令集的相关内容,这里也同时提供一个有详细解释和用例的待书签的PDF版本,方便大家查阅. ARM指令集详解 指令集是处理器的核心,ARM指令的基本格式如下所示: opcode {cond}{S}{.W\.N}Rd, Rn{.operand2} S:指定是否影响CPS

ARM指令集、Thumb指令集、Thumb-2指令集

MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集 ARM指令集: 编代码全部是 32bits 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在相同频率下运行速度也是最快的, 但也因为每条指令是32bits 的而占用了最多的程序空间. Thumb指令集: 编代码全部是 16bits 的,每条指令所能承载的信息少,因此它需要使用更多的指令才能完成功能, 因此运行速度慢, 但它也占用了最少的程序空间 Thumb-2指令集:在前面两者之间取了一个

Thumb指令集与ARM指令集的差别

Thumb指令集 Thumb指令能够看做是ARM指令压缩形式的子集.是针对代码密度[1]的问题而提出的.它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序仅仅运行Thumb指令而不支持ARM指令集. 因此.Thumb指令仅仅须要支持通用功能.必要时,可借助完好的ARM指令集,比如:全部异常自己主动进入ARM状态. 在编写Thumb指令时.先要使用伪指令CODE16声明,并且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态.编写ARM指令时,可使用伪指令C

ARM指令集——跳转指令

ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST或者TEQ指令中使用S后缀.这些比较指令总是会更新标志位. 在Thumb模式下,所有数据处理指令都更新CPSR中的标志位.有一个例外就是:当一个或更多个高寄存器被用在MOV和ADD指令时,此时MOV和ADD不能更新状态标志. 几乎所有的ARM指令都可以根据CPSR中的ALU状态标志位来条件执行.参见

IL指令集 收藏【转载】

一些 IL 语言解释:  跳转指令集合 Public field Static     Beq     如果两个值相等,则将控制转移到目标指令.Public field Static     Beq_S     如果两个值相等,则将控制转移到目标指令(短格式).Public field Static     Bge     如果第一个值大于或等于第二个值,则将控制转移到目标指令.Public field Static     Bge_S     如果第一个值大于或等于第二个值,则将控制转移到目标