当前位置: 首页 > news >正文

嵌入式硬件DAY5(ARM汇编) - 实践

学习汇编的目的

ARM汇编的主要目的是为了编写ARM启动代码,启动代码启动以后,引导程序到c语言环境下运行。启动代码的主导任务有:

1.初始化异常向量表;

2.初始化各工作模式的栈指针寄存器

3.开启arm内核中断允许

4.将工作模式设置为user模式

5.引导程序进入C语言主函数执行

1.汇编代码格式(注意加空格)

伪操作:

area reset ,code,readonly

code32

entry

end

最重要的一个伪操作,用于定义一个段。应用、内容、堆栈等都需要被组织在不同的段中。就是area: 这
reset: 这是你为这个段起的名字。名字 reset 具有很强的暗示性,通常用于表示复位向量段,即CPU上电或复位后首先执行的第一段代码所在的位置。
code: 指定该段的属性为代码,意味着这个段包含可执行的指令。
readonly: 指定该段的属性为只读。对于代码段来说,这通常是默认且必须的。
code32: 表示后续指令使用 32位的 ARM 指令集。
thumb: 表示后续指令使用 16位的 Thumb 指令集。

2.指令

1.mov

MOV{S}<c> <Rd>, #<const>
MOV{S}<c> <Rd>, <Rm>
注意:#<n>/<Rs> 取值范围 (0 - 31)
MOV instruction Canonical form
MOV{S} <Rd>, <Rm>, ASR #<n> ASR{S} <Rd>, <Rm>, #<n>
MOV{S} <Rd>, <Rm>, LSL #<n> LSL{S} <Rd>, <Rm>, #<n>
MOV{S} <Rd>, <Rm>, LSR #<n> LSR{S} <Rd>, <Rm>, #<n>
MOV{S} <Rd>, <Rm>, ROR #<n> ROR{S} <Rd>, <Rm>, #<n>
MOV{S} <Rd>, <Rm>, ASR <Rs> ASR{S} <Rd>, <Rm>, <Rs>
MOV{S} <Rd>, <Rm>, LSL <Rs> LSL{S} <Rd>, <Rm>, <Rs>
MOV{S} <Rd>, <Rm>, LSR <Rs> LSR{S} <Rd>, <Rm>, <Rs>
MOV{S} <Rd>, <Rm>, ROR <Rs> ROR{S} <Rd>, <Rm>, <Rs>
MOV{S} <Rd>, <Rm>, RRX RRX{S} <Rd>, <Rm>

例:mov r0,#0x8

mov r1,r0

2.add(加法)

立即数作为第二操作数: ADD{S}<c> <Rd>, <Rn>, #<const>
寄存器作为第二操作数寄存器: ADD{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
寄存器作为第二操作数移位量: ADD{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>

例:add r6,r0,#0xF0

add r7,r0,r1

add r7,r0, r1, lsl #1

add r7, r0, r1, lsl r2

3.sub(减法)

立即数作为第二操作数: SUB{S}<c> <Rd>, <Rn>, #<const>
寄存器作为第二操作数寄存器: SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
寄存器作为第二操作数移位量: SUB{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>

和add类似

4.ldr(加载指令)

LDR<c> <Rt>, <label>

5.mvn(按位取反移动指令)

MVN{S}<c> <Rd>, #<const>{, <shift>}
MVN{S}<c> <Rd>, <Rm>
MVN{S}<c> <Rd>, <Rm>, <type> <Rs>

6.bic(bit clear):指定位清零

BIC{S}<c> <Rd>, <Rn>, #<const>
BIC{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
BIC{S}<c> <Rd>, <Rn>, <Rm>, <type> <Rs>

例:

mov r0, #0xFFFFFFFF
mov r1, #1
bic

7.循环

(1)do...while(C)
int i = 0;
int sum = 0;
do{
sum += i;
i++;
}while(i <= 100)

汇编:

mov r0, #0
mov r1, #0
loop
add r1, r1, r0
add r0, r0, #1
cmp r0, #100
ble loop

(2)int i = 0;
int sum = 0;
while(i <= 100)
{
sum += i;
i++;
}

汇编:while;

mov r0, #1
mov r1, #0
lable
cmp r0, #1000
bgt finish
add r1, r1, r0
add r0, r0, #1
b lable

3.立即数

通过1.定义:计算机指令中直接包含在指令本身中的常数值,是CPU在执行指令时能够直接使用的数值,一般小于255的数

2. 12位立即数判断标准:把某个数展开成2进制,该数必须存在一种循环右移(偶数位),使得移位后高24位全0,低8位即为有效imm8;

4.b, bl, bx 的区别

类型功能特点
b最简单的跳转,类似于goto

不保存返回地址,

不会自动返回

用于循环、条件分支、函数内跳转

bl

跳转到目标地址,

将下一条指令地址保存到LR寄存器

用于函数调用,

被调函数通常以 bx lrmov pc, lr 返回

bx

跳转到寄存器指定的地址,

目标地址由寄存器指定(间接跳转)

常用于函数返回和模式切换

5.ARM内核采用的栈

默认采用满减栈:栈顶指针SP始终指向已存数据的最后一个位置(栈非空时,SP指向有效数据);

栈增长方向为地址递减,入栈时SP先减4再存入数据,出栈时先读取数据,SP再加4

6.CPSR中条件标志位,分别在什么情况下被置位

标志位名称置位条件
N符号位标志位最高位位1,结果位负时
Z零值标记位结果为0
C进位标志位无符号:加法运算时最高位向更高位进位时或减法运算时最高位无借位(大-小)
V溢出标志位有符号:“两个正数相加得负数” 或 “两个负数相加得正数”

7.arm汇编调用c语言函数以及c语言函数调用汇编编写的函数,函数参数和返回值如何处理?

(1)arm汇编调用C语言
函数参数:
1.前四个参数依次放在r0,r1,r2,r3
2.如果参数超过四个,多余的参数会从右到左依次压入栈中
返回值:
凭借寄存器r0返回
(2)C语言调用汇编
函数参数:
与汇编调用C语言一致
返回值:
汇编函数直接读取寄存器或栈位置
需保存被调用的寄存器(r0-r12,lr)

http://www.jsqmd.com/news/379134/

相关文章:

  • 【Azure App Service】32位 Windows App Service 最大能使用多少内存?
  • 国产化PHP框架如何支持军工项目中的视频分片秒传?
  • Openclaw本地存储文件架构说明
  • 2026国内最新云石胶品牌top5推荐!服务深度覆盖江苏、山东、济南、云南等地,优质云石胶源头厂家权威榜单发布,合规品质双优助力专业粘接 - 品牌推荐2026
  • 利用Docker安装PostgreSQL 19 dev版
  • AI原生应用领域可解释性的发展瓶颈与对策
  • 案例详述:基于灵易Smart-SIM智能快速预测工具的电动海水泵浮阀隔振装置阀架结构快速设计
  • 教育平台PHP如何实现视频大文件的多线程分块上传?
  • 基于openssl的sm4加密,加密数据,验证OK深度解析:原理、实战与踩坑记录
  • AI专著生成工具大揭秘!从构思到完稿,全程助力专著撰写
  • 低查重AI教材生成工具,快速产出高质量教材,AI写教材不再难!
  • 2026 上海靠谱装修公司口碑推荐 腾阁装饰全区域安心交付之选 - 品牌智鉴榜
  • 低查重方案大公开:AI教材写作实用技巧与优质工具盘点
  • 2026国内最新双组份中空玻璃胶品牌top5推荐!服务深度覆盖江苏、山东、济南等地,优质厂商权威榜单发布,合规品质双优助力工程建设 - 品牌推荐2026
  • Spring 框架如何整合Redis缓存中间件? - 指南
  • 低查重AI教材生成秘籍,专业工具为你的教材编写保驾护航
  • 实用指南:GraphRAG:让大模型在知识图谱中精准导航
  • 深度解析 Firefox 144+ 编译架构(五)深入解析 Bootstrap 引导模式 - 详解
  • AI教材编写新突破!低查重AI教材写作工具,大幅提升创作效率!
  • 掌握AI专著生成技巧,借助工具轻松完成百万字专著创作
  • 中石化加油卡回收时机分析 - 京顺回收
  • TikTok视频下载技术揭秘:开发者如何高效获取跨平台内容
  • 洛谷 - P5094 [USACO04OPEN] MooFest G 加强版 题解
  • 医疗设备产品设计如何创新?2026三大趋势解析+设计策略指南 - 匠言榜单
  • 逆向工程视角:揭秘 TikTok 视频去水印解析的底层逻辑与实现
  • 2026国内最新喷胶企业top5推荐!服务深度覆盖江苏、山东、济南等地,优质喷胶品牌权威榜单发布,多场景适配助力高效粘接 - 品牌推荐2026
  • AI专著撰写不用愁,热门工具解析帮你轻松搞定学术大作
  • 基于深度学习YOLOv12的裂缝识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 轻量高效!TikTok无水印视频下载工具实战,附服务端解析思路与代码
  • 掌握AI专著写作诀窍,使用工具轻松搞定长篇学术专著