嵌入式学习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.hqwc.cn/news/611266.html

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

相关文章

sonar搭建(linux系统)

前景 静态代码扫描是CI/CD中重要的一环&#xff0c;可以在代码提交到代码仓库之后&#xff0c;在CI/CD流程中加入代码扫描步骤&#xff0c;从而及时地对代码进行质量的检查。这可以有效地降低后期维护成本&#xff0c;优化产品质量&#xff0c;提高产品交付速度。同时&#xf…

数字IC/FPGA——复位篇

本文主要介绍以下几点&#xff1a; 复位的作用及什么时候需要复位复位的分类全局复位、局部复位的目的如何选择全局复位和局部复位同步复位、异步复位及异步复位同步释放的原理、优缺点 注&#xff1a;参考文章在文末给出 目录 一、复位信号的作用和分类1.复位信号的作用2.复…

神经矩阵:数字进化的新生命形式

随着人工智能技术的快速发展&#xff0c;有些人害怕机器人的崛起&#xff0c;有些人担心人工智能将会接管世界。但是人们需要了解人工智能的未来发展&#xff0c;以及电子生命形式将会如何诞生。 本文不仅介绍电子生命形式将如何诞生&#xff0c;而且还将详细描述神经矩阵的关键…

MySQL选择普通索引还是唯一索引(2/16)

普通索引和唯一索引 基本概述 MySQL中可以创建普通索引与唯一索引&#xff0c;这两种索引的区别是&#xff1a; 普通索引&#xff08;Non-Unique Index&#xff09;&#xff0c;也称为非唯一索引&#xff0c;它允许索引中的条目具有重复的键值。普通索引的主要目的是加快查询…

【回溯】Leetcode 17. 电话号码的字母组合【中等】

电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 **输入&#xff1a;**digits “23” 输出&am…

io流的学习

目录 io流 FileOutputStream 字节输出流的细节: FileOutputStream写数据的方式 FilelnputStream FilelnputStream书写细节 FilelnputStream读取方式 计算机的存储规则 ASCll规则&#xff08;英文&#xff09; GBK(汉字) Unicode字符集的UTF-8编码格式 java中的编码和…

FPGA在医疗的应用,以4K医疗内窥镜为例

前言 随着技术的发展&#xff0c;医学影像作为科学技术的主要成就之一&#xff0c;在无创诊断和治疗领域已经有了多种应用。其中一个应用是内窥镜&#xff0c;在20世纪90年代&#xff0c;当利用电荷耦合装置将图像传输到显示器上成为可能时&#xff0c;内窥镜变得更加广泛。为…

牛客小白月赛90(A,B,C,D,E,F)

比赛链接 官方题解&#xff08;视频&#xff09; 这场偏思维&#xff0c;感觉好像没啥算法。E需要动态维护前 k k k 小&#xff0c;F是个离散化加dp&#xff0c;状态和递推方程比较 非常规&#xff0c;建议还是看一下涨涨姿势。 A 小A的文化节 思路&#xff1a; 签到 cod…

Open3D(C++) 0~1归一化到0~255

目录 一、算法原理二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 0-1归一化到0~255的计算原理如下: g ′ = 255 ∗

C语言 递归

递归指的是在函数的定义中使用函数自身的方法。 举个例子&#xff1a; 从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&#xff0c;正在给小和尚讲故事呢&#xff01;故事是什么呢&#xff1f;“从前有座山&#xff0c;山里有座庙&#xff0c;庙里有个老和尚&…

【C语言基础】:文件操作详解(后篇)

文章目录 一、文件的顺序读写1.1 顺序函数读写函数介绍1.2 fgetc函数和fputc函数1.3 fputs函数和fgets函数1.4 fprintf函数和fscanf函数1.5 fwrite函数和fread函数 二、文件的随机读写2.1 fseek函数2.2 ftell函数2.3 rewind函数 三、文件读取结束的判定3.1 feof函数 四、文件缓…

React 集成三方登录按钮样式的插件库

按钮不提供任何社交逻辑。 效果如下&#xff1a; 原地址&#xff1a;https://www.npmjs.com/package/react-social-login-buttons 时小记&#xff0c;终有成。