简图记录-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汇编必知必会 http://blog.csdn.net/a1875566250/article/details/8507168