ARM汇编指令

常见的汇编指令:

1. 跳转指令:

在程序执行过程中,跳转到其他代码运行,类似于c中 的函数调用和goto语句.
- B: 跳转后不可返回
- BL: 跳转后可以返回

2. 传输数据指令

  • MOV
  • MVN

3. 加载/存储

  • LDR (load register)
    注意:这里默认的是
    LDR R0, #0x12DF ;将内存中0x12DF中的数据保存到寄存器R0
    LDR R0, =0x12DF ; 伪指令,将数字0x12DF直接保存到寄存器R0
  • STR(save to register)

4. 算术运算

  • ADD 不带进位的加法
  • ADDC 带进位进行加法
  • ADDS 较大数相加,如果有进位,需要更改cpsr的第一位的进位位状态时使用.
  • SUB/SUBC: 不带进位/带进位 进行减法

5. 位操作

  • LSL: 逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。
    • 左移n位–>原数*= 2^n
      LSL R0,R1,LSL#3 ;R0←R1*2^3
  • LSR: 逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。
    • 右移n位–>原数/=2^n
      LSL R0,R1,LSR#4 ;R0←R1/2^4

立即数

相当于c中的一个常量.
#1234e320
但是在指令中如果操作一个立即数,有可能立即数超过了最大范围:如32-bit的ARM中指令占20bit,留给用户的只有12bit,也就是说命令能操作的最大数范围是2^12=4096,这对于贪婪的程序猿来说是不够的.因此,ARM设计了一种解决方案.将这12bit分为了两部分:包含8bit的基数和4bit的偏移标志位.

函数实现

压栈

1.当在同一模式下调用函数时:

stmfd sp!, {lr} @加上!是为了压栈后,sp能够对应的变化

2.当切换到不同模式时,需要保存通用寄存器的状态,保护现场

stmfd sp!, {r0-r12, lr} @压栈
.......
ldmfd sp!, {r0-12, pc}^ @出栈

出栈

ldmfd sp!, {pc}

返回值

函数的返回值是放在r0中的.这样c代码就可默认地获取到返回值了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MichaelJay2015

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

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

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

打赏作者

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

抵扣说明:

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

余额充值