ARM 汇编语言 学习
来源:互联网 发布:淘宝网性用品 编辑:程序博客网 时间:2024/05/18 19:19
ARM汇编编程概述
在 Bootloader进行初始化的启动代码 和 内核的相关部分,仍然需要使用汇编语言。在对效率要求较高的地方,仍然需要使用汇编语言。
目前常用的ARM汇编指令有两种:
1、ARM 标准汇编:适用于ARM公司的汇编器,适
合在Windows平台下使用,如ADS中使用。标准汇编的指令为大写字母。
2、GNU 汇编:适用于GNU交叉编译工具链中的汇
编器,适合于Linux开发平台。指令为小写字母。
汇编语言中采用@ at符号表示注释。
arm汇编程序框架
在上面的结构中, .section可以省略。如果没有数据段,可以简化写成:
.text.global _start_start: ...
ARM汇编指令分类学习
本部分可以参考《arm汇编手册(中文版)》,此处不过多赘述。相关的指令需要查阅手册。
手册中是ARM标准汇编,但是与GNU汇编相差不大,把大写看作小写字母。在ARM标准汇编中用%表示二进制,但是在GNU中不能用,需要用0b表示二进制,0x表示十六进制。
立即数前面需要加 #井号。
在进行计算时,注意操作数的性质,看是寄存器还是立即数。
采用@符号表示注释。
如果ARM处理器是32位的,则寄存器也是32位;如果pc机是64位的,则其寄存器为64位。
lr 寄存器就是 r14 寄存器,使用 bl 跳转指令可以把跳转前的地址存在lr寄存器中,在返回时就可以利用lr寄存器中存放的地址。
程序状态字寄存器的访问必须采用msr和mrs指令。
对于访问内存(外部寄存器)中的内容,必须使用 ldr 和 str 命令。l:load,s:store
mov指令操作立即数时,立即数不能超过二进制的8位,因为机器码的格式,但是操作寄存器无妨。
ARM伪指令
机器码:
机器码查看,举例:
arm-linux-objdump -D -S start.elf
在ARM Architecture Reference Manual手册中的ARM Instruction Set一章中有对机器码的详细介绍。
在机器码中源操作数只有12位,是有限的,因此当操作位数较多的操作数时,就需要采用伪指令来实现。
伪指令:
伪指令本身并没有所对应的机器码,它只是在编译的时候起作用,或者转化为其他的实际指令来运行。
定义类伪指令:
.global 定义为全局符号
.data 定义数据段
.ascii 定义字符串数据, .ascii “hello”
.byte 定义字节数据
.word 定义字数据
.equ 类似宏定义, .equ DA, 0x01
.align 控制对齐
举例说明:
.datahello: .ascii "hello"by: .byte 0x01bw:定义为 .word 0xff
可以采用:
arm-linux-readelf -a start.elf 来查看指令和段的地址位置。
操作类伪指令: ldr 和 nop
对于mov指令,操作的立即数不能超过二进制8位,因为机器码格式的限制,机器码的操作数的12位并不全部用来存放立即数,只有8位。因此需要使用操作类伪指令。
ldr指令:
与前面的存储器访问指令重名但是不是同一个指令。
向一个寄存器中填充大于二进制8位的数据。
注意:需要用=等号来表示立即数。
例如: ldr r0, =0x1ff
ldr伪指令在编译之后会变为真正的ldr存储器访问指令。通过反汇编就可以看出来。
nop指令:
空操作,进行延时
ARM协处理器访问指令
协处理器:coprocessor
什么是协处理器:
协处理器用于执行特定的处理任务,如: 数学协处理器可以控制数字处理,以减轻处理器的负担。ARM可支持多达16个协处理器,其中CP15是最重要的一个。
CP15是系统控制协处理器,提供额外的寄存器,来配置和控制cache、mmu、时钟模式等作用。通过对CP15中的寄存器进行访问,来访问CP15进而控制系统。
访问指令:
mcr 指令:从通用寄存器到协处理器
mrc 指令:从协处理器到通用寄存器
这两个指令控制的是CP15协处理器中的寄存器的内容,通过相应的指令格式可以控制寄存器的值。
MCR{cond} P15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>MRC{cond} P15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
CP15中每个寄存器如何控制需要查看相应的ARM内核数据手册。
- ARM汇编语言学习笔记
- ARM 汇编语言 学习
- arm汇编语言学习笔记一
- IAR ARM中的汇编语言学习笔记
- ARM汇编语言学习笔记之寻址方式
- ARM汇编语言
- 【ARM 汇编语言】
- ARM汇编语言
- ARM汇编语言
- ARM汇编语言学习笔记之一(ARM简介)
- ARM汇编指令学习(0) - ARM 汇编语言程序格式
- ARM汇编语言(4) 指令、伪操作、伪指令学习
- 记录自已学习之ARM汇编语言ldr和str
- 记录自已学习之ARM汇编语言之bic和orr
- ARM汇编语言面试题
- ARM汇编语言伪指令
- ARM汇编语言伪指令
- ARM汇编语言中的程序结构
- Docker镜像拉取加速
- 杭电ACM第1000题——A + B Problem
- Android ExpandableLayout伸缩隐藏显示布局
- Codeforces Round #368 (Div. 2) B. Bakery
- PHP实现指定时间内产生每日日期脚本
- ARM 汇编语言 学习
- Retrofit2.0的简单使用
- OpenGL中投影函数glOrtho()、glFrustum()以及gluPerspective()以及函数的用法
- Android Drawable浅谈
- 字符编码笔记:ASCII,Unicode和UTF-8(转)
- 【分享】总结润乾v4升级集算报表报表迁移相关问题
- PL/SQL 动态Sql拼接where条件
- HDU 4027
- java8 jdk8 遍历某段时间