ARM汇编指令详解

1.1编程概述
为什么学习汇编:①boot loader ②内核 ③对效率有特殊要求
而直接运行C语言需要堆栈的支持。
主要用途:①启动代码中的编写②对效率又特殊要求
1.2 ARM汇编分类
两种指令:
1. ARM 标准汇编:适用于ARM公司的汇编器,适合在Windows平台下使用,如ADS中使用。
2. GNU 汇编:适用于GNU交叉编译工具链中的汇编器,适合于Linux开发平台。
1.3 汇编程序框架
.section .data
< 初始化的数据>
.section .bss
< 未初始化的数据>
.section .text
.global _start
_start:
<汇编代码>
2.1 算数逻辑指令
MOV{条件}{S}   [dest],[op_1]
                dest = op_1
@MOV instruction example
mov r1, #8
mov r2, r1
mov r3,#10

 MVN{条件}{S}   [dest],[op_1]
                dest = !op_1
@MVN instruction example
mvn r1, #0b10
mvn r2, #5
mvn r3, r1

  SUB{条件}{S}    
 
[dest],[op_1],[op_2]
                dest = op_1 - op_2
@su b instruction example
mov r2, #4
sub r1, r2, #2

mov r0, #1
sub r3, r1, r0
AND{条件}{S}    [dest],[op_1],[op_2]
                dest = op_1 AND op_2
真值表:
op_1 op_2 结果
0 0 0
0 1 0
1 0 0
1 1 1

@and instruction example
mov r1, #5
and r2, r1, #0;

mov r1, #5
and r2, r1, #1;

  BIC{条件}{S} 
 
[dest],[op_1],[op_2]
                dest = op_1 AND (!op_2)
真值表:
op_1 op_2 结果
0 0 0
0 1 0
1 0 1
1 1 0

@bic instruction example
mov r1, #0b101011
bic r2, r1, #0b101

2.2 比较指令
 CMP{条件}{P}  
[op_1],[op_2]
                status = op_1 - op_2
改变的是CPSR中的N位和Z位
@cmp instruction example
mov r1, #2
cmp r1, #1
bl func1 @b func1

mov r1, #2
cmp r1, #3

func1:
mov r1, #2
mov r2, #3
mov pc, lr

mov r1, #2
cmp r1, #2

  TST{条件}{P}  
[op_1],[op_2]
                Status = op_1 AND op_2
CPSR的Z位
@tst instruction example
mov r1, #0b101
tst r1, #0b001

mov r1, #0b101
tst r1, #0b10

2.3 跳转指令
b和bl的区别在于 bl会把地址保存到PC。使 子函数可以用mov pc,lr返回跳转之前
@b instruction example
mov r1, #5
mov r2, #6
cmp r1, r2
bgt branch1
add r3, r1, r2
b end
branch1:
sub r3, r1, r2
end:
nop

2.4 移位指令
LSL逻辑或算术左移 (Logical or Arithmetic Shift Left)
ror逻辑右移 (Logical Shift Right)
@ror instruction example
mov r1, #0b11
mov r2, r1, ror#1

@lsl instruction example
mov r1, #0b1
mov r2, r1, lsl#2
2.5 程序状态字访问指令
msr:寄存器赋值到CPSR
mrs: CPSR赋值到寄存器
@program stauts
mrs r0, cpsr
orr r0, #0b100
msr cpsr, r0

2.6 存储器访问指令
  LDR{条件}    Rd, <地址>
  STR{条件}    Rd, <地址>
  LDR{条件}B   Rd, <地址>
  STR{条件}B   Rd, <地址>

@str ldr instruction example
mov r0, #0xff
mov r1, #0x30001000
str r0, [r1]
ldr r2, [r1]

3. 定义类伪指令
/指令本身 并没有所对应的机器码,它只是在编译的时候起作用,或者转化为其他的实际指令来运行。
3.1 nop
3.2 ldr
            mov r0,#0xff
            ldr r0,=0x1ff
此处ldr是一个伪指令,因为这个0x1ff是超过了一个字节。如果使用ldr来读取内存的话,会报错。然而加上一个‘=‘号,ldr变成了另外一条指令(伪指令)。这条指令就可以读取不受字节数影响。








<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(41) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

习惯就好zz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值