常用ARM汇编指令

空指令--nop

nop

传输指令--MOV

MOV R1,#3           @用c表示  r1=3;
​
MOV R1,#0X17            @r1=0x17;
​
MOV R0,R1                 @ r0 =r1;
​
MVN R0,R1   @将RO取反给R1 相当于r1 = ~r0;

建议赋值时候直接给16进制方便调试

算术指令集 --加法ADD 减法SUB 乘法MUL

ADD R0,R1,R2  @R0 = R1+R2
​
SUB R0,R1,#3   @R0 =R1 - 3
​
MUL R1,R2,R3  @R1 =R2*R3
​
ADD R0,#1       @R0 = R0+1
​
@ADD不会进位
@ADDS 带进位的加法,进位时反映但CPSR的C位
@ADDC 带进位的加法、加运算时,加上CPSR的C位

移位指令--左移LSL,右移LSR

MOV  R0,R1,LSL#2  @R0 = R1<<2
​
MOV R2,R1,LSR#1 @R2 = R1>>1
​
ADD R2,R0,LSR#1 @R2 = R2+R0>>1
@lsl逻辑移位
@asl算数移位
@关于算数移位和逻辑移位的知识:@https://blog.csdn.net/cg2258911936/article/details/103574604
​
MOV R0,R1,LSL#2   @R0=R1<<2;
MOV R2,R1,LSR#1   @R2=R1>>1
ADD R2,R0 LSL#1   @R2 = R2+R0<<1
​
​
         
@CPSR访问指令

跳转指令--B,BL

B label   @跳转到label标签
B main    @跳转到标号为main的代码处
BL func   @保存下一条要执行的指令的位置到LR寄存器,跳转函数func
          @当跳转代码结束后,用MOV,PC,LR返回

CPSR访问指令MRS ,MSR

MRS R0 ,CPSR    @R0 = CPSR;
​
MSR CPSR,R0     @CPSR = R0;

位运算AND ORR BIC TST

AND R0,R1,#0XFF  @R0 = R1&0XFF
​
ORR R3,R0,#0X0F  @R3 = R0|0X0F
​
BIC R0,R0,#0X03  @清除R0中的0号位和1号位
​
TST R0,#0X20     @测试第5位是否为0,为0则Z标志置1

比较指令--CMP

CMP R0,R1   
@比较RO与R1的值
@注意:比较结果反映在CPSR中的N Z C位
@R0>R1 Z = 1
@R0<R1 C = 1
@R0=R1 Z = C = 1

条件指令执行实例

一系列指令都使用条件指令
if (a == 0)  x = 1;
CMP R1,#0
MOVEQ R0,#1
​
置标志位,再使用不同的条件码
if (a == 0) x = 0;
if (a > 0)  x = 1;
CMP R0,#0
MOVEQ R0,#0  @EQ是等于
MOVGT R1,#1  @GT是大于
​
使用条件比较指令
if (a == 4 || a == 10) x = 0;
CMP R0,#4
CMPNE R0,#10
MOVEQ R1,#0

状态码

int r0=1;
int r1=5;
int r2=3;
int max;
max=(r0>=r1)?r0:r1;
max=(max>=r2)?max:r2;

练习

@测试当前工作状态是否为ARM,是的话 R5 = 0XFF

MRS R0,CPSR
​
TST R0,#0X20
​
MOVEQ R5,#0XFF
​
@修改当前工作模式,切换到User模式
MRS R0,CPSR
​
BIC R0,#0X1F
​
ORR R0,#0X10
​
MSR CPSR,R0

Load/Store指令

注意:LOAD/STORE架构规定,存储器之间不能直接拷贝,需通过寄存器做中转

LDR R0,[R1]     @R0 = *R1  R1里面存放的是地址,把该地址存放的内容读入到R0中
                @LDRB(BYTE)读1字节  LDRH(HALF WORD)读2字节  LDR 读4字节
                
STR R0,[R1]     @*R1 =R0 将寄存器R0中值写入存储器地址为R1的空间中

堆栈寻址LDMFD/STMFD

堆栈寻址是一种数据结构;按照先进后出的方式存储数据R13(SP)
​
寄存器指示当前栈顶位置,ARM处理器支持4中堆栈操作方式(FD,FA,ED,EA,)
​
ATPCS标准规定使用FD栈
​
LDMFD SP!,{R0-R12}@入栈,地址走向-》由高到低
STMFD SP!,{R0-R12}@出栈,地址走向-》由低到高
​
例如:
STMFD SP!,{R0-R12,LR}   将寄存器R0~R12 LR中的值存入栈中
                                @常用于中断保护现场
LDMFD SP!,{R0-R12,PC}^  将栈中值逐个弹出到寄存器R0~R12 PC中(LR恢复pc@常用于中断恢复现场,^表示会恢复SPSR到CPSR

基址变址寻址

基址变址寻址:就是将基地址寄存器的内容与指令中给出的偏移量相加,得到一个有效的操作数的地址,通常用于访问连续的地址空间
三种索引方式:
    前索引             LDR         R0,  {R1, #4}   
    自动索引            LDR         R0, {R1, #4}! R1 = R1+4
    后索引             LDR         R0,  {R1},#4

软中断指令SWI

SWI 0X02 产生软中断,软中断号为2

GNU伪指令

.text   @将定义符开始的代码编译到代码段
.data   @将定义夫开始的代码编译到数据段
.end    @文件结束
​
.global 符号  @将符号声明为全局符号;
.byte   @单字节定义  .byte   0x12,'a',23
.long/.word @定义4字节数据    .word 0x12345678
​
​
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ARM指令集是一种广泛使用的指令集架构,它主要用于移动设备、嵌入式系统和低功耗服务器等领域。这个指令集架构的发展可追溯到1980年代初,但只有1990年代后期开始得到广泛采用和推广。现在,ARM指令集已经成为了全球最流行的指令集之一。 常用ARM指令集包括ARMv6、ARMv7和ARMv8等。它们的主要区别在于处理器的架构和指令集的扩展。其中,ARMv6是一种比较老的架构,适用于早期的移动设备和嵌入式系统。而ARMv7则是一种更为先进的架构,支持更多的指令集扩展和一些新的特性。ARMv8则是未来的趋势,它支持更多的指令集扩展,包括虚拟寄存器、硬件虚拟化和安全性增强等功能。 除了ARM指令集,汇编语言也是ARM编程的重要组成部分。常用ARM汇编语言包括ARM汇编和Thumb汇编两种。ARM汇编是一种较为底层的汇编语言,它使用32位指令来完成数据处理和控制流操作。而Thumb汇编则是一种更加轻量级的汇编语言,它使用16位指令来完成相同的操作。 针对ARM指令集和汇编语言,有许多文档和教程可供参考。其中最常用的包括ARM体系结构参考手册、ARM汇编编程指南和ARM编程手册等。这些文档都提供了详细的指令集和汇编语言说明,以及实用的编程示例和技巧。同时,还有一些在线资源和社区,如ARM开发者中心和ARM社区等,提供丰富的资讯和交流平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翠花是少女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值