嵌入式学习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        storage(存储)

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

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

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

      出栈恢复指令  ldmfd                 load(加载)

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 : 有符号<=

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

铸铁试验平台和铸铁实验平台的主要区别在哪——北重制造厂家

铸铁试验平台和铸铁实验平台的主要区别在于其使用目的、实验内容和功能。 首先&#xff0c;铸铁试验平台主要用于铸铁工艺试验和工艺参数优化。通过模拟铸铁工艺过程&#xff0c;对不同工艺参数进行试验&#xff0c;从而得到最佳的铸铁工艺参数。铸铁试验平台一般具有温度控制、…

【开源语音项目OpenVoice](一)——实操演示

目录 一、前菜 1、Python选择 2、pip源切换 3、ffmpeg配置问题 4、VSCode添加Jupyter扩展 二、配置虚拟环境 1、下载源码 方法一 直接下载源码压缩包 方法二 使用git 1&#xff09;git加入鼠标右键 2&#xff09;git clone源码 2、VSCode出场 1&#xff09;创建pyth…

【复现】浙大恩特客户资源管理系统 SQL注入漏洞_71

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升…

【C++】手搓 list 容器

送给大家一句话&#xff1a; 若结局非你所愿&#xff0c;就在尘埃落定前奋力一搏。—— 《夏目友人帐》 手搓 list 容器 1 前言1.1 底层结构1.2 使用场景1.3 功能简介 2 框架搭建2.1 节点类2.2 list 类2.3 迭代器类 3 功能实现3.1 begin() 与 end()3.2 插入操作3.3 删除操作3…

【MCU开发规范】:MCU的性能测试

MCU的性能测试 前序性能评判方法MIPSCoreMark EEMBC其他参考 前序 我们平时做MCU开发时&#xff0c;前期硬件选型&#xff08;选那颗MCU&#xff09;基本由硬件工程师和架构决定&#xff0c;到软件开发时只是被动的开发一些具体功能&#xff0c;因此很少参与MCU的选型。 大部分…

编程规范(保姆级教程)

文章目录 为什么需要编程规范&#xff1f;&#x1f4a1;代码检测工具 ESLint&#x1f4a1;代码格式化 Prettier&#x1f4a1;ESLint 与 Prettier 配合解决代码格式问题eslint支持ts约定式提交规范Commitizen助你规范化提交代码什么是 Git Hooks使用 husky commitlint 检查提交…

ubuntu如何截图? ubuntu中截屏的三种方法

文章目录 1.ubuntu主要用途2.ubuntu如何截图&#xff1f;2.1 方法一&#xff1a;键盘按键快捷键截屏 2.2 方法二&#xff1a;系统自带软件2.3 方法三&#xff1a;第三方软件 Reference 1.ubuntu主要用途 1、桌面操作系统&#xff1a;Ubuntu可用作个人电脑或笔记本电脑的操作系…

3.网络编程-TCP

目录 TCP 建立连接的过程是怎样的 TCP为什么是三次握手 TCP 断开连接的过程是怎样的 TCP挥手为什么需要四次 为什么TIME_WAIT等待的时间是2MSL TCP详解之滑动窗口 TCP 半连接队列和全连接队列是什么 TCP粘包&#xff0c;拆包是怎么发生的&#xff0c;如何解决 TCP是如何…

Mapbox教程:一个简单Demo

近期工作中准备把Mapbox用起来&#xff0c;准备发几个教程&#xff0c;把Mapbox再熟悉熟悉。工作中也用过不少的Web GIS组件&#xff0c;在这里说一下我对这些WebGIS组件的印象。 Leaflet 代码简洁&#xff0c;插件丰富&#xff0c;相比于其大小&#xff0c;功能也挺强大&#…

C语言如何使⽤指针?

一、问题 指针变量在初始化以后就可以使⽤和参与操作了&#xff0c;那么就要⽤到对指针变量最常⽤的两个操作符——> * 和 &#xff06; 。 二、解答 这⾥⼜要提到始终贯穿着指针的⼀个符号“ * ”&#xff0c;但是这⾥的“ * ”是作为指针运算符使⽤的&#xff0c;叫做取内…

Transformer 模型及其典型应用研究

摘要&#xff1a; Transformer 模型是一种基于自注意力机制的深度学习架构&#xff0c;在自然语言处理等领域取得了巨大成功。本文介绍了 Transformer 模型的原理和结构&#xff0c;并探讨了其在语言翻译、文本生成、对话系统、语言模型、图像处理和推荐系统等典型应用领域的研…

配置vscode链接linux

1.安装 remote SSH 2.按F1 ssh ljh服务器公网ip 3. 选择保存远端host到本地 某位置 等待片刻后 4. 切换到远程资源管理器中 应该可以看到一台电脑&#xff0c;右键在当前窗口链接&#xff0c;输入你的服务器用户密码后电脑变绿说明远程连接成功 5.一定要登陆上云服务器后再…

基于小程序实现的校园失物招领系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

Pytest精通指南(02)对比Unittest的差异

文章目录 前言用例编写规则不同用例前置与后置条件不同断言功能不同测试报告失败重跑机制参数化用例分类执行Unittest 前后置示例Pytest 前后置示例总结 前言 在Python中&#xff0c;unittest和pytest是两个主流的测试框架&#xff1b; 它们都旨在支持自动化测试、使用断言验证…

Go gorm库(详细版)

目录 01. 什么是ORM 02. 环境搭建 03. 连接数据库 高级设置 gorm 的命名策略 创建表 日志显示 04. 模型定义 定义一张表 自动生成表结构 修改表字段大小 字段标签 05. 单表查询 5.1 表结构 5.2 添加单条记录 5.3 批量插入 5.4 单条数据查询 5.5 根据主键查询…

数据库被rmallox勒索病毒加密,如何还原?

近年来&#xff0c;网络安全问题日益严峻&#xff0c;勒索病毒作为其中的一种恶意软件&#xff0c;已成为网络安全领域的一大难题。其中&#xff0c;rmallox勒索病毒以其高度的隐蔽性和破坏性&#xff0c;给不少企业和个人带来了严重损失。本文将从rmallox勒索病毒的特点、传播…

小程序视频怎么保存

新的小程序视频保存方法来了&#xff01;不再需要依赖繁琐的Fiddler&#xff0c;也无需分析数据包。这款工具简单易用&#xff0c;帮助你轻松下载小程序视频&#xff0c;摆脱了繁琐的配置步骤。快来体验这个下载高手&#xff0c;让视频保存变得轻松简便&#xff01; 下载高手我…

Github 2024-04-09 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10Vue项目1JavaScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

漫途水产养殖水质智能监测方案,科技助力养殖业高效生产!

随着水产养殖业的蓬勃发展&#xff0c;水质和饲料等多重因素逐渐成为影响其持续健康发展的关键因素。由于传统养殖模式因监控和调节手段不足&#xff0c;往往造成养殖环境的恶化。需要通过智能化养殖&#xff0c;调控养殖环境&#xff0c;实现养殖的精细化管理模式&#xff0c;…

智能网联汽车自动驾驶数据记录系统DSSAD数据元素

目录 第一章 数据元素分级 第二章 数据元素分类 第三章 数据元素基本信息表 表1 车辆及自动驾驶数据记录系统基本信息 表2 车辆状态及动态信息 表3 自动驾驶系统运行信息 表4 行车环境信息 表5 驾驶员操作及状态信息 第一章 数据元素分级 自动驾驶数据记录系统记录的数…