ARM 汇编指令

 

本文将我遇到的ARM汇编指令用法及其用例记录,边用边学,也能当做自己的手册使用。可能稍显粗糙,待后续更新调整。


一条ARM指令长度为32bits

LDR(load) :读内存   

LDR R0,[R1]          //将R1地址的数据读取存储到R0

LDR R0,=0x12345678   //伪指令,为被拆分为几条真正的ARM指令(因为每一条指令都是固定长度)

 

LDM(load many):读内存,写入多个寄存器

//与IA、IB、DB、DA后缀使用
//IA:increase after    DB:decrease before
//IB:increase before    DA:decrease after
//一般多与DB连用居多,用来做寄存器入栈保存
STMDB	sp!, {fp, ip, lr, pc}  //此处SP做decrease操作实际上是对sp的tmp操作
                               //对SP寄存器没有做写操作,加上!表示最后的tmp赋值到sp

 

STR(store):写内存

STR R0,[R1]    //将R0值存储到R1地址内存(4Bytes)

 

STM(store many):把多个寄存器的值写入内存中

//后缀详见STRM指令处
//一般多与IA连用居多,用来做寄存器出栈恢复
LDMIA	sp, {fp, sp, pc}       //此处sp后未加!,则sp的值为栈中值赋值给{}中的sp完成赋值

 

STREQ:相等则写内存(用法和STR一样)

//一般与CMP等比较指令连用,判断程序状态寄存器(R15/PC)中的Z bit,为1即相等则执行
STREQ R0,=1234

 

B:跳转

B main

 

BL:跳转,并把返回地址保存到LR寄存器中

BL main

 

MOV :赋值 

MOV R0,R1        //把R1的值赋值给R0

MOV R0,#0x10     //把立即数0x10赋值给R0

 

MOVEQ:相等则赋值

//一般与CMP等比较指令连用,判断程序状态寄存器(R15/PC)中的Z bit,为1即相等则执行
MOVEQ R0,#10

 

BIC:位清零

//最后一个操作数的某位上为1,则第二个操作数对应位清0,最终结果赋值给第一个操作数
bic	r3, r3, #16128  //0x3f00 

 

CMP:比较指令

//将两个寄存器值做差(R1-R2),同时影响程序状态寄存器(R15/PC)中的状态位
CMP R1,R2

 

ADD:加法指令

add r0,r1,#4	//r0 =r1 + 4
add r0,r1,r2	//r0 =r1 + r2

 

SUB:减法指令

sub r0,r1,#4	//r0 =r1 - 4
sub r0,r1,r2	//r0 =r1 - r2

 

MVN:按位取反后赋值

MVN R0,R1
MVN R0, #4     //R0 = -5
MVN R0, #0     //R0 = -1

 

 


ARM汇编程序格式:

.text 

.global _start

_start:



halt:

    b halt
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值