简图记录-ARM汇编基础(基本指令、伪指令、协处理器指令)

简图记录学习~

参考:arm汇编手册、s3c2440用户手册、国嵌arm汇编教学视频

一、概念

汇编语言:用符号代替二进制机器码的符号语言(如 助记符代替操作码、地址符号或标号代替地址码)

汇编使用场景:1、无C语言运行堆栈环境(bootloader\内核 上电阶段初始化代码) 2、对效率有特殊要求的代码 3、特定功能汇编指令(无其他语言支持)

ARM汇编分类:1、ARM标准汇编(ARM公司汇编器 windows平台ADS) 2、GNU汇编(GNU交叉编译器 如linux平台gcc 注:本篇内容是GNU汇编)

汇编基本结构:

.section.data @初始化数据段,可不指定

.......

.section.bss @未初始化数据段,可不指定

.......

.section.text @代码段

.global _start @指定程序入口全局符号

_start:

.......

汇编编译指令(不带连接脚本):

1、编译不连接arm-linux-gcc -c -o start.o start.S 

2、链接elf文件(指定运行地址信息)arm-linux-ld -Ttext 0x2000000 start.o -o start.elf 

3、 生成bin文件 arm-linux-gcc -O binary start.elf start.bin

(带连接脚本arm-linux-ld -Tmyboot.lds start.o -o start.elf ,脚本内容如下:)

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS{

. = 0x30008000;

. = ALIGN(4);

.text :

{

start.o(.text)

*(.text)

}

. = ALIGN(4);

.data :

{

*(.data)

}

. = ALIGN(4);

bss_start = .;

.bss :

{

*(.bss)

}

bss_end = .;

}

二、汇编基本指令

1、算术逻辑指令 

传送mov r1,r2(将寄存器r1=r2)反向传送mvn r1,r2(r1=-r2)

减sub r1,r2,#2(r1=r2-2) 加add r1,r2 #2(r1=r2+2)

位于and r1,r2,#2(r1=r2|0x2) 位清除bic r1,r2.#2(r1=r1&~0x2)

2、比较指令(结果保存在CPSR程序状态指令寄存器)

比较cmp r1,#1(CPSR中Z零位=(r1==1)1:0 N小于位=(r1<1)1:0)

3、条件指令(主要以CPSR中状态为条件:eq等于 ne不等 lt小于 le小于等于 gt大于 ge大于等于)

如若上一个比较相等跳转到NEXT标签beq  NEXT

4、位移指令

逻辑左移 mov r1,r2,lsl#2(r1=r2<<2)逻辑右移 mov r1,r2,lsr#2(r1=r2>>2)

循环右移动 mov r1,r2,ror#$2 (r1=r2>>2|(r2 << 33))

5、程序状态寄存器访问

取出msr cpsr,r0 写入mrs r0,cpsr

6、储存器访问

取出ldr r1,[r0](将r0值为地址的数取出放到r1)  写入str r0,[r1]

三、伪指令(无对应机器码的汇编指令、用于编译过程控制或者转化为多条指令完成)

1、定义类伪指令

定义全局符号(可在lds或C文件使用).global _start

定义数据段.data 代码段,text bss段.bss

定义指定类型数据(在数据段,常通过标签定位使用).byte 0x1 .ascii "hello world" .word 0xff

定义宏 .equ GOOD, 0x12345678

定义对齐方式 .algn 4

2、操作类伪指令

空指令nop(延时用 实际为mov r0,r0)

长子传送 ldr r0,=0xffff(将0xffff放入r0、实际为定义一个字 再通过ldr内存读入r0)

四、协处理器指令

协处理器:用于执行特殊任务如数字协处理器可以控制数字处理,以减轻处理器负担

CP15:ARM中负责系统控制的协处理器(如MMU CACHE TLB等),提供16组寄存器完成。

协处理器读写

读mrc{条件} 协处理器 操作码1 通用寄存器 协处理器寄存器Rn 协处理器寄存器Rm (操作码2) 

写mcr{条件} 协处理器 操作码1 通用寄存器 协处理器寄存器Rn 协处理器寄存器Rm (操作码2) 

如(CP15为例子、当Hclk和Fclk不相同 s3c2440需要设置总线异步模式)

mrc p15,0,r0,c1,c0,0

orr r0,r0,#0xc0000000(对cp15第一组寄存器30和31bit置1操作 表示异步模式)

mcr p15,0,r0,c1,c0,0

简图记录-ARM汇编基础(基本指令、伪指令、协处理器指令)_第1张图片


推荐一篇转载的博客,学习路径讲的不错 arm汇编必知必会 http://blog.csdn.net/a1875566250/article/details/8507168

你可能感兴趣的:(ARM嵌入式类)