ARM指令学习笔记

ARM指令:

1.几种简单的和重要的伪指令

         1.AREA:定义一个段,代码段 code、数据段data、自己定义的段

         2.CODE32/CODE16:指令类型32位arm,16位thumb。(不指定,默认为32位arm)

         3.ENTRY:程序入口

         4.EXPORT/IMPORT:export声明一个符号可以被其他文件引用,import在当前文件引用一个其他文件声明的符号(类似于C语言中的exstern)。

         5.EQU:常量定义,相当于C语言中的#define

         6.label:所有顶格写的为标号(只有label可以顶格写),标号就是地址,相当于C语言中的函数名

         7.DCD:连续分配一个字的内存单元(从一个label分配)

         8.DCB:分配一个字节的内存单元

         9.END:源程序结尾(一个源文件必须有一个END,END之后不能再出现汇编文件)

        

2.程序执行过程

         1.预处理-----生成 (.i)文件

         2.编译---检查语法---生成 (.s)汇编源文件

         3.汇编---由汇编指令助记符翻译成 (.o)二进制文件

         4.链接---将代码中的0x。。。地址填入

3.MDK的启动代码:最主要的目的为CPU分配各种模式下的堆栈SP

4.调试  F10 和F11

5.条件执行及标志位

         1.CMP   更新NZCV的C位。。。。

         2.数据处理指令(mov、sub等)默认不影响条件标志位,但可以选择通过添加“s”来影响标志位。

        

         3.所有可能的条件代码

         4.mov  r2,r1,lsl  #2  执行这段代码,必须考虑一下7步。。。

                   0.作什么操作  (操作码)

                   1.目的寄存器

                   2.源操作数是什么(立即数,寄存器移位获得的数)

                   3.源操作数寄存器

                   4.移位数

                   5.移位的形式(方向)

                   6.是否影响标志 (带S)

5.分支指令

                   1.B {<cond>} label 跳转到指令B限制在当前指令的正负32Mb的范围内

6.数据处理指令

7.逻辑运算的真值表

                   1.异或(EOR)  相异为1,相同为0

                   2.或

8.位清除   BIC  R0,R0,#9  干掉R0中 与#9,0000  1001 中 1 对应的位。

9.桶型移位器

                   1.算数右移(ASR),相当于带符号位的除法

10.立即数  以#号开头的数

                   1.判断一个合法的立即数的方法

              正好占用一个连续的合法字节 例如:0x100000f

②正好连续的3个半字节,如果超过3个半字节,不是立即数

                   0x1fe0000------1fe  0001  1111  1110 前后2个有效字间的个数为<=8 ,但(最低2位半字节)最后两位不是00,所以不是立即数

                  

         11.装载非法立即数

                   1.LDR  rd, = 0xfffffe0e   ldr r0,[PC]    offset  4095

        ldr不受合法立即数的限制,缺点[PC,$offset]offset有范围 正负4095

6.乘法

7.单寄存器传送指令

什么是寻址方式:??

         根据指令中给出地址码字段来实现寻找真实的操作数地址的方式

8.ARM处理器寻址方式(8种寻址方式)

                   1.立即数寻址  mov  r0,#1  速度最快的操作方式

                   2.寄存器寻址  mov  r0,r1

                   3.寄存器移位寻址 mov  r1,r2,lsl #2

                   4.寄存器间接寻址 ldr  r0,[r1]  数据从 存储器到寄存器

                                                        str  r0,[r1]  数据从 寄存器到存储器

                   5.基址变址寻址(提供3种方式)

                            ①前索引   LDR   R0,[R1,#4] 其中R1为基址寄存器

                                                  STR   R0,[R1, #4]  将R0的值存到新的地址中

                            ②自动索引 LDR   R0,[R1,#4]! “!”表示要回写,更新基址寄存器的值

                                                  STR   R0,[R1, #4] !  回写,新的地址回写到基址寄存器中

                            ③后索引   LDR   R0,[R1],#4取R1地址中的值,存到R0中,然后回写R1

                                                  STR   R0,[R1], #4

                   6.多寄存器寻址      LDMIA  R1!{R2-R7,R12}将R1单元中的数据读出到R2-R7,R12中,R1 自动加1,回写

                                                       LDMIB 

                                                        LDMDA

                                                        LDMDB   PC先减

                                                        使用时:STDIBLDMIA(STDdaLDMib)是配对使用的

                   7.相对寻址

                   8.堆栈寻址

                            1.满增栈FA  满是栈顶指针

                            2.满减栈FD  满是栈顶指针

                            3.空增栈EA

                            4.空减栈ED

                   例如:stmfd  sp!,{r1-r5}

                              ldmfd  sp!,{r1-r5} 堆栈,入栈退栈的尾缀方式相同

9.存储器块拷贝

10.堆栈

11.SWP指令(存储器的一次读和写的原子操作,通常用于信号量)

         在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。

         SWP  R0,R1,[R2]  读出R2地址中的值放到R0中,同时R1写入R2;

12.SWI(软件中断)

         通过软件中断号区分一些系统调用的函数(从而决定采用何种操作)。。。。。。

13.PSR传送指令

         MRS/MSR允许传送CPSR/SPSR中的内容

         MRS {<>}  rd,<psr> 读<psr>中的内容

         MSR{<cond>}  rd,<psr>  写<psr>中的内容 (主要作用可以分位域访问)

14.协处理器指令

ATPCS标准。。。ARM公司推出的的一个标准,当函数传参时,func(r1,r2,r3, r4)多余的参数要放到堆中。。。

原文地址:https://www.cnblogs.com/zhou2011/p/2347713.html