登堂入室soc之arm汇编基础


总体来说,对于这种soc芯片的项目还是没有能力快速完成的,但自己本身就是学计算机的呀,还有自己也具有其他OS及stm32项目的开发经验,无论是跑不跑操作系统,自己都已经实际完成好多个项目了,应该是有思路和能力的。
自己的操作系统,体系结构啥的都懂,并且自己还是做硬件出身,对单片机也很熟悉,从这些入手就已经够了,为什么要从什么ubuntu入手,南辕北辙,问题多多,一头雾水的,就从自己熟悉的入手,管他人怎么做的做什么!
汇编这块看来是学linux嵌入式开发绕不过去的,为什么呢?因为芯片启动后,并不能直接运行c代码,需要先配置好c运行环境,而配置的过程中,只能是用汇编来实现的。
详细的笔记详见《嵌入式Linux系统开发入门宝典》吧!

基本知识

本打算最后用到这块知识再补上的,但发现后面的裸机开发,还是要用这块,这块内容也不是很多,还是补下吧!

GUN汇编语法

由于在linux下使用的是gcc的交叉编译,所以汇编也遵循GUN的标准。
基本的语法格式为:
label:instruction @comment//@后跟着是注释;指令部分不能使用大小写混用,只能用大写或小写。

程序段的定义

用.section伪操作来定义。如.section .testsection@定义一个testsection段。常用的预定义的段名:

.text 表示代码段。

.data 初始化的数据段。
.bss 未初始化的数据段。
.rodata 只读数据段。

函数定义

格式为:

函数名:

函数体

[返回语句]@不是必须的

常用汇编指令

数据传输指令

指令目的描述
MOVR0R1将 R1 里面的数据复制到 R0 中。
MRSR0CPSR将特殊寄存器 CPSR 里面的数据复制到 R0 中。
MSRCPSRR1将 R1 里面的数据复制到特殊寄存器 CPSR 里中

存储器访问指令

ARM不能直接访问存储器,比如RAM中的数据。中间都要隔着寄存器。

指令描述
LDR Rd, [Rn , #offset]从存储器 Rn+offset 的位置读取数据存放到 Rd 寄存器中
STR Rd, [Rn, #offset]将 Rd 中的数据写入到存储器中的 Rn+offset 位置

#:还是表示立即数

LDR:load,加载,是从存储器读数据。

STR:store,发送,向存储器写数据。

压栈出栈指令

在写中断现场时会用到。

指令描述
PUSH 将寄存器列表存入栈中。
POP 从栈中恢复寄存器列表

另一种写法是:STMFD和LDMFD,可以针对向量进行操作。这就是与STR与LDM的区别。

跳转指令

指令描述
B 跳转到 label,如果跳转范围超过了+/-2KB,可以指定 B.W
BL 跳转到标号地址,并将返回地址保存在 LR 中。

LR:就是链接寄存器。

算术运算

指令计算公式备注
ADD Rd, Rn, RmRd = Rn + Rm加法运算,指令为 ADD
SUB Rd, Rn, RmRd = Rn – Rm减法
ADC Rd, Rn, RmRd = Rn + Rm + 进位带进位的加法运算
SBC Rd, Rn ,RmRd = Rn – Rm – 借位带借位的减法

逻辑运算指令

AND 按位与

ORR 按位或

BIC 按位清 如:BIC Rd, Rn @Rd = Rd & (~Rn)

ORN 按位或非 如:ORN Rd, Rn, Rm @Rd = Rn | (Rm)

EOR 按位异或

总结

常用的ARM汇编命令,就这些,以后遇到再慢慢补充吧。

扩展知识

几种有用的工具

qemu

实际上就是一个虚拟机,可以通过软件方式模拟电脑或arm运行,调bootload会用到。在linux上用得比较多的。相对比硬件的模拟方式就是jlink。

basybox

做linux根文件系统的。

scaratchbox

交叉编译平台

uboot

大名鼎鼎的开源bootload

UEFI and Tranocore

统一可扩展部件接口。
操作系统和硬件适配的标准,这样通过软件方式模拟这个标准,这样可以绕过去,可以装到对应的win或linux上。

工具链

前面已经安装好自带的工具链了,这里只不过是从ARM官网上要求,再走一遍流程,没什么别的意思。用的话,还是使用之前安装好的工具链。

两个工具链:GNU包含gcc和ARM(armcc),GNU是开源的。
对于工具链,可以看arm官方文档推荐的工具链,没必要按soc厂家给的弄。

ubuntu中安装标准工具链

sudo apt-get install gcc g++ gcc-doc

ubuntu安装交叉工具链

sudo apt-get install gcc-arm-linux-gnueabi
e:Embedded嵌入式
a:app应用
b:bina二进制
i:interface 接口

理论的知识,可以慢慢来补充,这些都是些参考,可以先不看,自己相信自己还是有基础的,所以直接跳到硬件编程。以后有时间慢慢补充。
— 2022年7月4日

已完成补充 —2022年7月22日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guangod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值