Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493927
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: 嵌入式

2016-09-21 21:16:12

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
@sub 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变成了另外一条指令(伪指令)。这条指令就可以读取不受字节数影响。








阅读(638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~