ARM:几条常用的汇编指令

ldr
 读内存,ldr r0,[r1] 读取地址r1上的数据(4字节),保存到r0中。

str
 写内存指令,str r0,[r1] 把r0的值写到地址r1(4字节)。

b
 跳转指令,b指令无法实现子程序的返回,只能实现单纯的跳转。

bl(branch and link)
 bl xxx 就是跳到xxx去执行,并且把返回地址(下一条指令的地址)保存到lr寄存器中。通常用于调用子程序,可在子程序的尾部添加mov pc,lr 返回。而在跳转到C函数中则不需要把lr赋给pc(是不是可以认为跳转执行C函数完成之后lr的值就自动赋给pc了)。

mov
 mov r0,r1 把r1的值赋给r0,r0=r1
 mov r0,#0x01 即r0=0x01
 mov r0,#0x123456789是一条错误指令,因为对于32位指令,某些位代表mov这条指令,某些位代表r0,剩下不足32位去表示数值,所以需要使用其他指令ldr r0,=0x123456789,它是一条伪指令,会被拆分为几条真正的指令。

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

ldm
 m是many的简写,意为读内存,写入多个寄存器

stm
 把多个寄存器的值写入内存

stmdb
 stmdb sp! {fp,ip,lr,pc} 指令含义:db(Decrement Before)表示先减后存。存放位置遵循高编号寄存器存放到高地址,fp、ip等都是寄存器的别名。原本设置了pc值为4096,那么先减4等于4092,4092~ 4095存pc的值,再减4等于4088(这里是以十进制),4088~4091存的是lr,以此类推。sp!的意思是使用最终的sp值,经过上面先减后存之后sp存的值为4080。

ldmia
 ldmia sp,{fp,sp,pc} 指令含义:ia(Increment After)表示先存后增,上面stmdb指令执行之后sp的值为4080,把4080~4083的值存到fp,以此类推恢复原本的值。所以,sp的值必须与原来的值一样才能正确恢复原来的值。

mrs
 mrs r0 cpsr 含义:r表示寄存器register,s表示状态state,把cpsr读到r0里面。

msr
 与mrs作用类比,只不过是对象相反过来。

orr
 orr r0,r0,#(1<<12) 表示r0 = r0 | (1<<12)

结合以上几条指令简单看下S3C2440点亮led灯的例子:

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

R-QWERT

你的鼓励是我最大的动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值