ARM Instructions

ldr{条件}目的寄存器,<源:存储器地址>

(1)源操作数没有“=”时:将从存储器中的一个32位的字数据传送到目的寄存器中。

ldr  R0,[R1] 

ldr  R0, 0x11000000

ldr  R0, lable  从地址为lable处的内存里读出数据

(2)源操作数带“=”时:ldr  r0, =name

        name为立即数时将name写入r0寄存器

          ldr  r0,=0x53000000  之后r0=0x53000000

        name是个标识符:取标识符处的地址给目的寄存器

          ldr  pc, =main  将mian函数的起始地址赋给pc指针

总之:有“=”就是取该立即数或者是标号的地址(特别的就是源操作数比较复杂时会将这个数值保存在某个地方,再使用读内存的方式获得),没有“=”就是读该地址指向的内存的内容

ldr指令笔记补充:在使用该指令时会进行重定位,这就跟编译时设置的连接地址有关。在ARM9开发板,如果程序在4k的steppingstone上运行,程序的连接地址又设置为0x30000000,那么在初始化好SDRAM和将代码复制到SDRAM前不能使用LDR指令。
ldr PC,=main 实现这种跳转的都是将实际的跳转地址保存在地址为pc值加一个小的偏移量后所指向的内存区。这是由于4字节的指令长度不能同时装下机器控制码和32位的立即数地址,这就需要将这个32位的立即数标号地址放在不远处的内存中,如此下来就可以通过pc+小的偏移量来读出内存中存放的实际跳转地址。
像ldr sp,=4096 这种语句实际上汇编时是用mov指令去替换的。

 

adr{条件} register,label

标号label的地址与该指令的距离差+该指令的地址,也就是该指令当前执行时所处的位置的地址。同样的代码在flash和sdram中执行时结果不一样,因此可以用该指令来判断当前程序运行的位置。

当地址值是字节对齐时,它的取值范围:-255~255B;字对齐:-1020~1020B



str{条件}源  目的储存地址

str  r1, [r2]

str  r1, [r2],#8  将r1中的值存入r2指向的储存器,再r2=r2+8

str  r1, [r2,#8]  将r1中的值存入r2+8的地址处的存储单元中

 

mov{条件} {S}目的,源

mov  lr,  pc     将pc地址写入lr

mov  r1,  #0x0   r1地址为0x0

这条指令要注意mov指令传递的“源操作数”本身,区别于adr指令。对mov的操作数的要求:只要操作数可以由0x00-0xff中的某个数经过循环右移偶数位即可,否则是非法的mov操作数。

mvn:与mov类似,在存入目的之前取反


 特殊状态寄存器(CPSR、SPSR)和通用寄存器之间的赋值就不能使用MOV指令了!使用的是:MSRMRS

 MSR    CPSR,    R0          @复制R0的地址(操作数)到程序状态寄存器

 MSR    CPSR_c,   #1<<28        @复制(立即值)标志位到 CPSR标志位 中

 MRS    R0,       CPSR                @复制CPSR 到 R0 中

 

STMLDM指令:

STM和LDM的主要用途是现场保护、数据复制、参数传递等,其模式有8种。

(1)IA  每次传送后地址加4 (在ARM用于出栈)
(2)IB  每次传送前地址加4 

(3)DA  每次传送后地址减4

(4)DB  每次传送前地址减4  (加减4由ARM架构决定)用于入栈
(5)FD  满递减堆栈  (注意:下面这几条针对的是堆栈的增减)
(6)FA  满递增堆栈 
(7)ED  空递减堆栈 
(8)EA  空递增堆栈

堆栈有4种模式(FA、EA、FD、ED。满递增FA:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的最高地址。指令如LDMFA,STMFA等。)

ARM编译器默认高寄存器优先存入堆栈:比如:STMFD    SP!,   {R1-R3}  执行完之后SP是指向SP‘的

SP··········>

················|R3|  对应存储单元的最高地址(此处最先入栈)

················|R2|

SP'··········>|R1|

对于上面这条指令伪代码的解释,个人百度了一些觉得比较完美的解释如下:
 sp = address;

 sp = sp - 4; 
 Memory[address] = LR;
 for( i=7;i>0;i--) 
{
sp = sp-4;
Memory[address] = Ri;
}
  由于ARM堆栈结构是从高向低压栈的,此时SP即是栈顶。

再如:ldmia     sp!,    { r0-r12,pc }^ 要保存的寄存器中包含PC时,若要恢复SPSR到CPSR中就要在后面加^。

"! "的意思:将最后的地址写入SP中,就上面这条指令的话最后的SP=old_address+4*14

 

add{条件}{S}   加运算

add   r0,r1,r2     r0=r1+r2

add   r0,r1,#255    r0=r1+255


sub   减运算

mul   乘运算

 

and   与运算:包括逻辑和按位

and    r0,r1,r2   r0=r1&r2

and    r0,r1,#3

r1必须为寄存器

orr    位或

跳转指令b和bl :这两条跳转指令只能前后跳转32M的范围,所以有时候跳转指令用ldr

b:无条件跳转

bl:跳转前会保存下一条指令的地址带lr寄存器

bl   main

汇编中调用C函数main

 

EQU:是equal等于的意思,有宏定义的作用。他不是汇编指令集,而是伪指令。

Mode_USR        EQU     0x10
Mode_FIQ        EQU    0x11
Mode_IRQ        EQU    0x12

如果不能确定表达式中的内容会不会被错误分析为其他信息(这是由于优先级或其他语法问题),加上(),这样就可以有正确地结果。

DW8    EQU  (0x0)


BQU:等于跳转指令


MCRMRC:访问系统控制协处理器cp15,cp15有寄存器0-15共16个寄存器,有的只读,有的只写

MCR:将ARM处理器寄存器的值——>协处理器寄存器

MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2

 mcr p15, 0, r0, c7, c8, 0   就是把r0的值写入cp15的c7和c8寄存器

MRC:同理可知


bic:位清零指令









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值