裸机开发(1)-汇编基础

文章目录

函数发生调用时,需要进行线程保护,简单来说,就是先进行压栈操作,将调用函数参数、返回值等存到R0-15寄存器中,在执行完毕后,需要将数据内容从寄存器读出,进行出栈操作,而这一系列操作需要SP指针。芯片上电后SP指针(堆栈指针寄存器)还未初始化完毕,无法执行C代码,所以必须要用汇编设置好C语言环境。

GNU汇编语法

c 复制代码
label:instruction @ comment
# label:标号,表示地址位置
# instruction:指令,代表汇编指令或伪指令
# comment:注释

/*例子:
add:
	MOVS R0, #0X12 @设置 R0=0X12
/*

.global _start     @设置start函数为全局,供加载器找到该函数,之后再实现该函数即可

指令不可大小写混用

常用汇编指令

处理器内部数据传输指令

**1)MOV指令 **

将数据从一个寄存器拷贝到另外的寄存器,或者将立即数传递到寄存器中

MOV R0, R1 @寄存器R0 = R1

MOV R0, #0X12 @R0=0X12
2)MRS指令

读取特殊寄存器(CPSR、SPSR)中数据传递给通用寄存器

MRS R0, CPSP @R0=CPSR
3)MSR指令

写特殊寄存器

MSR CPSR, R0 @CPSR=R0

存储器访问指令

访问IMX6UL存储器,需要借助存储器访问指令,先写入到R0-R12寄存器,再写入到指定存储器(RAM)中的寄存器中。
1)LDR、STR指令

LDR Rd, [Rn,#offset] 从寄存器Rn+offset位置读数据到寄存器Rd中

STR Rd,[Rn,#offset] 将Rd中的数据写入到存储器的Rn+offset位置

LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004

LDR R1, =0X20000002 @R1 保存要写入到寄存器的值,即 R1=0X20000002

STR R1, [R0] @将 R1 中的值写入到 R0 中所保存的地址中,即地址0X0209C004的值为0X20000002

LDR、STR 按32位数据操作

LDRB、STRB 按字节操作、

LDRH、STRH 按半字操作

压栈和出栈指令

在函数执行到一半时,如果需要执行另外一个函数,则需要保留当前处理器状态到寄存器,在执行完毕后,从寄存器中读取数据恢复现场,其中涉及到压栈和出栈。

PUSH 将寄存器列表入栈

POP 从栈中恢复寄存器

等价于

STMFD SP!

LDMFD SP!!

处理器堆栈向下增长,栈由高地址向低地址增长,起始地址为0x80000000,向0x70000000增长

PUSH {R0~R3,R12} @将 R0~R3 和 R12 压栈

PUSH {LR} @将LR进行压栈

POP {LR} @先恢复 LR

POP {R0~R3,R12} @在恢复 R0~R3,R12

跳转指令

1)B指令

B ,跳转到 label,如果跳转范围超过了+/-2KB,可以指定 B.W 使用 32 位版本的跳转指令, 这样可以得到较大范围的跳转.

2)BL指令

BL ,在跳转到子程序前,将PC寄存器值保存到LR(R14)寄存器,执行完后,重新将LR寄存器中的值取出,继续从跳转之前的代码处运行。

算术指令

ADD 加法

ADC 带进位的加法

SUB 减法

SBC 带借位的减法

MUL 乘法

UDIV 无符号除法

SDIV 有符号除法

逻辑运算指令

AND 按位与

ORR 按位或

BIC 位清除

ORN 按位与非

EOR 按位异或

实战

github路径:linux_bsp/board_driver/1.ledc

相关推荐
cominglately2 小时前
centos单机部署seata
linux·运维·centos
魏 无羡2 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse2 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux2 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8243 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维3 小时前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs
watermelonoops3 小时前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
滴水之功4 小时前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
ldinvicible4 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr5 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu