ARM裸机开发笔记5(ARM指令集)

跳转指令:最简单的这届修改PC的值

以下指令中可以完成从当前指令向前或向后的32M的地址空间的跳转

B{条件}     目标地址                  ;花括号表示条件,可以省略

        最简单的跳转指令,一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行

       CMP R!,#0

       BEQ    Label                   ;EQ相等

  当CPSR寄存器中的Z条件码位置时,程序跳转到标号Label处执行


BL

BL{条件}   目标地址

跳转之前,会在寄存器R14中保存PC当前值。因此可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。

BLX

X表示跳转到指定地址的同时,将工作状态从ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到R14中

因此当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态,同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。

BX   跳转并切换状态


数据处理指令

MOV指令

MOV{条件}{S}   目标寄存器,源操作数       ----------》S加上可能会影响CPSR中的标志位。不加指令不更新CPSR。一般都不加。源操作数不可以是内存

MVN{条件}{S}  在传送之前把源操作数按位取反

CMP指令

TST指令   测试某一个位是否被设置了

TST      R1,#%1       结果  ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数)对操作数1与操作数2进行按位的与运算,结果为0 ,EQ位将被设置

 LDR R5,=0xffffffff
            TST R5,#(1<<23) ;当bit23位为1时,CPSR EQ位被设置

            MOVEQ   R5,#0x00             ---->不执行词语据,不满足EQ
            MOVNE   R5,#0x01

ADD指令   加

SUB指令   减

AND         逻辑与

ORR      逻辑或

BIC Rd,Rn,operand2   用于将Rn中的某些位清零。并把结果存放在Rd中,操作数operand2为32位的掩码,如果掩码设置了某一位为1,则清除这一位。

BIC R0,R0,#%1011        ;将R0的0,1,3位清零,其余位保持不变。

MUL乘法指令



程序状态字的访问指令

MRS{条件} 通用寄存器,程序状态寄存器(CPSR/SPSR)

将程序状态寄存器的内容传送到通用寄存器中

1.当需要改变程序状态寄存器内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。

2.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。

MRS R0,SPSR   ;传送CPSR的内容到R0


MSR指令

MSR 程序状态寄存器(CPSR/SPSR)_<域> ,操作数

将操作数的内容传送到程序状态寄存器或其特定域中。其中操作数可以是通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可以分为4个域

位【31:24】为条件标志位,用f表示。位【23:16】为状态域位,用s表示。为【15:8】为扩展位域,用x表示。为【7:0】为控制位域,用c表示

该指令通常用于回复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。

MSR CPSR,R0

MSR SPSR,R0                 ;传送R0内容带SPSR

MSR CPSR_c,R0              ;传送R0到CPSR,但仅仅修改CPSR中的控制位域




访问内存

寄存器和存储器之间传送数据

加载和存储指令

LDR 目地寄存器,<存储器地址>

从存储器中将一个32位数据传送到目地寄存器中


LDRB   目的寄存器,<存储器地址>

LDRB用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。

LDRH

和LDRB操作类似,是取一个16位的数据


STR 源寄存器,<存储器地址>

STR从源寄存器中将一个32为的字数据传到存储器中


批量加载存储指令

LDM

STM



数据交换指令

SWP

SWPB


移位指令(逻辑移位不考虑正负号,算数移位考虑正负号)

LSL  逻辑左移

ASL 算数左移

LSR 逻辑右移

ASR   算数右移

ROR   循环右移


异常产生指令

ARM支持的异常产生指令有如下两条

SWI:软件中断指令

BKPT:断点中断指令


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值