嵌入式学习53-ARM2

知识零碎:

跳转指令b:                                                                                                                                                          b  指令类似c语言的goto语句,能够实现无条件跳转。跳转时需要一个lable,表示要跳转到什么地方去  如 b finish ,finish就是一个lable(标签)

                                                                                              

系统函数finish:                                                                                                                                                          退出仿真器,返回主操作系统         

export声明:                                                                                                                                                          在汇编中用export声明函数,同时需要在c语言中用extern声明函数,按照标准,调用者负责保护现场和恢复现场

              

                                                                                                                                                                                                                                                                                    

1、汇编程序于c程序函数相互调用是的传参和返回值规则是什么?                                                  

如果参数个数 小于等于4个,就直接用 r0~r3 传参,c函数返回值通过 r0 寄存器返回:            如果参数个数  大于4个,从第 个参数开始就需要通过   来传参   (GNU规定)

2、对于函数调用,保护现场和恢复现场是由哪一方负责?

主调函数负责保护现场和回复现场

3、读写cpsr寄存器的指令是什么?

cpsr寄存器的低5位(M位来设置的,那么就可以先把cpsr读出来,更改低5位之后再设置进去cpsr使用mrs指令                                                                                                                          cpsr寄存器用msr 指令                                                                                                                    需要注意的是在keil环境下写cpsr需要写成:   msr cpsr_c r0;将r0的值写入到cpsr寄存器

4、入栈和出栈操作使用的指令是什么?

      入栈保护指令  stmfd

STMFD<c> <Rn>{!}, <registers>

 Rn 表示 栈底 指针寄存器,< registers >表示需要 入栈保护 的寄存器                                        ! 表示 栈 之后sp自动自减。如:

stmfd sp!, {r0, r1, r2, r3-r12, lr}

      出栈恢复指令  ldmfd

LDMFD<c> <Rn>{!}, <registers>

Rn 表示栈底指针寄存器,< registers >表示需要入栈保护的寄存器                                            ! 表示 栈 之后sp自动自增

ldmfd sp!, {r0, r1, r2, r3-r12, lr}

5.栈的实现类型:

2440实现保护和恢复现场使用的栈是  数组栈,即用一段连续的内存空间为栈提供空间。从数组栈的具体实现来看入栈的方式有四种做法:

  1. 空增:先写入数据,再让栈指针自增;
  2. 空减:先写入数据,再让栈指针自减;
  3. 满增:先让栈指针自增,再写入数据;
  4. 满减:先让栈指针自减,再写入数据。

arm体系采用的方案是  满减                                                                                                                     1.我们必须先告诉2440栈底的位置,这里我们把栈底设置为0x40001000                                         2.从地址0x40000000开始的0x1000这段内存空间对应的是2440内部的一段ram,总共4k。             3.实际能够使用的内存空间为[0x40000000~0x40000FFF]                                                                 4.设置栈底指针寄存器: ldr sp =0x40001000

  

6.汇编指令的s后缀有什么用?

几乎所有的汇编指令都可以在指令后面加上s后缀                                                                              s后缀的含义:                                                                                                                                                        是在指令执行过程中会 更新cpsr寄存器的N,V,C,Z位

N:                                                                                                                                               在结果是有符号的二进制补码情况下,如果结果为负数,则N=1;如果结果为非负数,则N=0

Z:                                                                                                                                                  如果结果为0,则Z=1;如果结果为非零,则Z=0

C:                                                                                                                                                  是针对无符号数最高有效位向更高位进位时C=1;减法中运算结果的最高有效位从更高位借位时C=0

V:                                                                                                                                                  该位是针对有符号数的操作,会在下面两种情形变为1,两个最高有效位均为0的数相加,得到的结果最高有效位为1;两个最高有效位均为1的数相加,得到的结果最高有效位为0;除了这两种情况以外V位为0

例如:

mov r0, #0xFFFFFFFF

adds r1, r0, #1

上面的操作会导致Z,C置位,这是因为结果为0,并且从无符号数角度来看,已经从最高位向更高位进位了

mov r0. #0x7FFFFFFF

adds r1, r0, #1

会造成N位和C位置位,这是因为计算结果0x80000000最为位为1,代表负数,并且 从有符号角度来看,把一个整数加成了负数。

汇编指令的启动代码

---------------------------------------------------------------------------------------------------------------------------------

preserve8

area reset, code, readonly

code32

entry

b start

nop

nop

nop

nop

nop

b do_interrput

nop

start

ldr sp, =0x40001000

mrs r0, cpsr

bic r0, r0, #0x1F

orr r0, r0, #0x12

bic r0, r0, #(0x01 << 7)

msr cpsr_c, r0

ldr sp, =0x40001000

sub sp, sp, #1024

mrs r0, cpsr

bic r0, r0, #0x1F

orr r0, r0, #0x10

msr cpsr_c, r0

ldr sp, =0x40001000

sub sp, sp, #2048

import main

b main

do_interrput

sub lr, lr, #4

stmfd sp!, {r0-r12, lr}

import interrupt_handle

bl interrupt_handle

ldmfd sp!, {r0-r12, pc}^       (^:切换user模式和supervisor模式)

end

---------------------------------------------------------------------------------------------------------------------------

常用指令后缀和条件判断

EQ : 等于
NE : 不等
CS : 无符号>=
CC : 无符号<
MI : 负数
PL : 非负[>=0]
VS : 溢出
VC : 无溢出
HI : 无符号>
LS : 无符号<=
GE : 有符号>=
LT : 有符号<
GT : 有符号>
LE : 有符号<=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535082.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法训练营第二十三天(二叉树完结)

算法训练营第二十三天&#xff08;二叉树完结&#xff09; 669. 修剪二叉搜索树 力扣题目链接(opens new window) 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改…

百度Create AI开发者大会剧透丨用好三大AI神器 ,人人都是开发者

程序员会消失&#xff0c;真的吗&#xff1f;大模型的下一站是什么&#xff1f;开发者的机会在哪里&#xff1f;什么才是最好用的AI应用开发工具&#xff1f;在4月16日举办的2024百度Create AI开发者大会上&#xff0c;百度创始人、董事长兼首席执行官李彦宏将就这些备受瞩目的…

php-redis windows ,pecl 已经不维护了,解决方案:php 8.2 | 8.3+ redis extension windows

从论坛上pecl 已经不维护了&#xff0c;直接让大家到ci 去下载 https://stackoverflow.com/questions/76496488/redis-dll-not-found-for-php8-2/76496489#76496489 让我们找最新的一次commit &#xff0c;然后又action 构建&#xff0c;再下载&#xff0c;这样的话也好&#…

Terraform 状态不同步处理

背景 在使用 Terraform 创建 TencentCloud TKE 的时候&#xff0c;手贱把 node pool 删掉了。导致执行 destroy, plan 都会报错。 │ Error: [TencentCloudSDKError] CodeInternalError.UnexpectedInternal, Messagerelated node pool query err(get node pool failed: [E501…

Leetcode算法训练日记 | day20

一、合并二叉树 1.题目 Leetcode&#xff1a;第 617 题 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新…

【ARM Coresight SOC-600 -- ETF Flushin无法接收到 CTI 发出 triggerout 信号问题分析】

请阅读【嵌入式开发必备专栏 】 文章目录 问题背景波形分析问题背景 在做验证的时候,准备通过 CTI2 给 SOC 上的 ETF 触发一个 flushin 动作,然后stop住 formatter,结果一致发现没有成功,接下来就是分析的过程了。 首先检查了代码,没有发现代码有什么问题(一般自己写的代…

2000-2022年县域常住人口和户籍人口数据

2000-2022年县域常住人口和户籍人口数据/县常住人口及县户籍人口数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;县域统计年鉴、各省年鉴 3、指标&#xff1a;户籍人口数、常住人口数 4、范围&#xff1a;县区级&#xff0c;具体县名单参看数据预览 5、缺失情况…

C语言—每日选择题—Day69

第一题 1、以下程序的输出结果是&#xff08; &#xff09; int main() {char arr[2][4];strcpy (arr[0],"you");strcpy (arr[1],"me");arr[0][3]&;printf("%s \n",arr);return 0; } A: you&me B: you C: me D: err 答案及解析 A 这里重…

2024年4月12日 十二生肖 今日运势

小运播报&#xff1a;2024年4月12日&#xff0c;星期五&#xff0c;农历三月初四 &#xff08;甲辰年戊辰月丙午日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;羊、狗、虎 需要注意&#xff1a;牛、马、鼠 喜神方位&#xff1a;西南方 财神方位&#xff1a;…

2024 年最新前端工程师使用 Webpack 模块打包工具详细教程(更新中)

概述 Webpack 模块打包工具 Webpack 是一个现代的静态模块打包工具&#xff0c;用于将前端应用程序的各种资源&#xff08;例如如&#xff1a;JavaScript、CSS、图片等&#xff09;视为模块&#xff0c;并将它们打包成可以在浏览器中运行的静态文件。它的主要功能包括模块打包…

蓝桥杯-【二分】分巧克力,跳石头

代码及解析: #include<bits/stdc.h> using namespace std; int n,k; const int N100010; int h[N],w[N]; bool check(int d){int num0;for(int i0;i<n;i) num (h[i]/d)*(w[i]/d);if(num>k) return true; //够分else return false; //不够分 } in…

Java代码基础算法练习-统计学生成绩-2024.04.11

任务描述&#xff1a; 编写程序&#xff0c;输入n个(0<n<50)学生的成绩(输入-1结束)&#xff0c;要求统计并输出优秀(大任务描述:于85)、及格(60~84)和不及格(小于60)的学生人数。(成绩取值范围0~100) 任务要求&#xff1a; 代码示例&#xff1a; /*** 这个程序用于统计…

《看漫画学C++》第12章 可大可小的“容器”——向量

在C编程的世界里&#xff0c;数组是一种基础且广泛使用的数据结构。然而&#xff0c;传统的静态数组在大小固定、管理不便等方面的局限性&#xff0c;常常让开发者感到束手束脚。幸运的是&#xff0c;C标准库中的vector类为我们提供了一种更加灵活、高效的动态数组解决方案。 …

Qt for MCUs 2.7正式发布

本文翻译自&#xff1a;Qt for MCUs 2.7 released 原文作者&#xff1a;Qt Group高级产品经理Yoann Lopes 翻译&#xff1a;Macsen Wang Qt for MCUs的新版本已发布&#xff0c;为Qt Quick Ultralite引擎带来了新功能&#xff0c;增加了更多MCU平台的支持&#xff0c;并且我们…

容错组合导航

在初始值正确的情况下&#xff0c;惯性导航短期精度较高&#xff0c;但是其误差随着时间是累计的。如果要提高惯性导航的长期精度&#xff0c;就必须提高惯性器件的精度和初始读准精度&#xff0c;这必将大大提高成本。 如果将惯性导航与其他导航系统适当地组合起来&#xff0c…

为什么在深度神经网络中,网络权重的初始化很重要?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在深度神经网络中&#xff0c;网络权重的初始化非常关键&#xff0c;因为它对网络的训练速度、收敛能力以及最终的性能都有重大影响。具体来说&#xff0c;权重初始化的重要性主要体现在以下几个方面&a…

【从浅学到熟知Linux】冯诺依曼体系结构及进程概念详谈!

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 冯诺依曼体系结构操作系统如何理解管理操作系统概念设计操作系统目的系统调用和库函数概念 进程基本概念描…

探索设计模式的魅力:MVVM模式在AI大模型领域的创新应用-打破传统,迎接智能未来

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 MVVM模式在AI大模型领域的创新应用-打破传统迎接智能未来 &#x1f680; “在人工智能的领域里&a…

炒股自动化:交易接口API才是重点,券商官方散户可用的接口

上一篇我们用get_full_tick取到了数据&#xff0c;也讲了变量和字典的基本概念&#xff0c;这次我们向交易所发送订单试试。前面文章的链接放在文末了&#xff0c;需要的可以看一下 这些内容是给新手看的&#xff0c;找接口的大佬们直接拉到文末即可 取市场数据的方法很多&am…

Python中Python-docx 包的run介绍

先对run做一个简单地介绍。每个paragraph对象都包含一个run对象的列表。举例&#xff1a; 这是一个简短的段落。 from docx import Document doc Document("1.docx") #上面这段话保存在1.docx中 print("这一段的run个数是&#xff1a;",len(doc.paragr…