stm32中有3条总线:地址总线,数据总线,系统总线;地址总线上是地址值,数据总线上是数据值,cpu读写时会先在地址总线上传输地址值,如果是写操作之后数据总线上会放往前面地址处写入的数据值,如果是读操作之后数据总线上会放前面地址处的数据值;地址总线既可以访问RAM也可以访问ROM,而当前访问RAM和ROM的地址会被寄存器SP和PC记录下来,即SP和PC就是用来记录当前RAM和ROM的访问地址/位置。

SP MSP PSP的理解:参考 1:https://blog.csdn.net/u012351051/article/details/125107815    2: https://mp.weixin.qq.com/s?__biz=MjM5MzUxMTAwMg==&mid=2649785048&idx=2&sn=8f3c5ac9cd4d4586d1543cb96502634d&chksm=be91c1ed89e648fb6c082a77f18b6bcffafc730c0041f1de3d50f3b53b0d7a37a170a55f17f9&scene=27

在CPU中,堆栈寄存器SP一共有3个,分别为SP、MSP、PSP。SP是对外使用的寄存器,或者认为SP始终指向当前模式下使用的MSP/PSP,只不过在OS内核或Handler模式下,SP先指向MSP,或者说SP拷贝了MSP的值,可以直接访问主堆栈。而在线程模式下,SP拷贝了PSP的值,可以直接访问线程(任务)堆栈。即SP是MSP和PSP的代言人,即SP是MSP和PSP的逻辑地址,对于裸机程序,我们只需要知道SP即可,而对于OS系统,尤其涉及中断、任务上下文切换时,就需要知道PSP和MSP了,OS底层也会直接针对PSP进行编程。

在发生中断时,CPU硬件需要自动保存现场,此时SP指向MSP还是PSP,取决于发生中断前正在使用的堆栈,即如果发生中断前,正在运行线程模式,而且是task任务运行,则使用PSP,而如果进入中断前,使用的MSP,这里就继续使用MSP。一旦开始执行中断服务程序,即handler模式,则一定使用MSP,也就是,如果是有OS的情况下,正在运行task的时候,发生了中断,CPU先使用PSP自动保存现场,跳入到中断服务程序后,就从PSP切换到MSP,所有中断服务程序用到的临时变量都存放到MSP里。

只有中断服务函数ISR工作在处理模式/handler下,其余所有的代码包括os的内核、驱动、应用等都工作在线程模式/thread下;而线程模式又分为特权状态(也叫内核态)和非特权状态(也叫用户态),之所以分成两个态就是为了os设计的;os的内核代码运行在线程模式的特权态下,用户app代码运行在线程模式下的非特权态。

FreeRTOS 中栈指针的类型为uint32*,而没用uint32,虽然地址是个uint32的数,也可以通过 *(uint32 *)addr来获取地址处的值,但FreeRTOS的栈是使用uint32数组的形式实现,因此遍历数组内的元素值(其实就是cpu中寄存器中的数值,这个数值既可以是地址值也可是数据值)就需要一个数组类型的指针即uint32*,这个uint32*的数据指向(等于)数据内各元素的地址值。

32位ARM和Thumb指令:32位Thumb指令具有.w后缀。

MOV 指令码

  语法: MOV   A    B

  解释: GUN ARM    汇编语法是把右值传入左值  A <---- B
      Inter x86  汇编语法是把左值传入右值  A ----> B

C语言中对所有标号/变量的操作,都是对其值的操作,而不是操作其地址值,即使是指针变量也是如此;对指针变量的操作也是指针变量的值,即它指向的变量的地址值,而不是指针变量本身的地址值。

asm语言中对所有标号/变量的操作,都是对其地址的操作,而不是操作其值,即使是普通变量也是如此;

LDR R0 [a]; 从a变量地址值处取出值传入R0中,等同于把a的值传入R0中,这里的a指变量a的地址值;

LDR 指令码 中 =后跟标号,取得是标号的地址,而不是标号的值,如果是一个具体的数值,那这个值是个地址值。

asm 理解的更多相关文章

  1. 理解ASM的Extent

    理解ASM的Extent 分类: Oracle 2017-04-14 10:19:44   ASM中分配空间的单位是AU,Extent包含1个或多个AU.在11g之前,1个Extent对应1个AU.而 ...

  2. 对ASM存储管理的一些初步理解记录

    ASM:Automatic Storage Management,是ORACEL10G以后为了简化存储管理的复杂性,也是为了摆脱对其他厂商的依赖而推出的.ASM作为目前ORACLE推荐的首选存储方案, ...

  3. 保护模式下pmtest1.asm的理解

    整个代码对应内存线性地址分为四段,[gdt] [code32] [video32] [code16] 代码先在实模式[code16]下运行,code16中的cs就是系统分配的该程序物理地址的基址. 编 ...

  4. 201709015工作日记--上下文的理解,ASM

    1.Android上下文理解 Android上下文对象,在Context中封装一个所谓的“语境”,Activity.Service.Application都继承自Context,所以在这三者创建时都会 ...

  5. ASM X86&&X64 Registers 对寄存器ESP和EBP的一些理解

    ESP EIP EBP : frame pointer(base address of stack) Calling Convention: 调用约定 为什么fun调用之后 esp -ebp = 20 ...

  6. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程

    1. 实验目的 选择一个系统调用(13号系统调用time除外),系统调用列表,使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 分析汇编代码调用系统调用的工作过程,特别是参数的传递的方 ...

  7. 浅谈ASM中的SLB

    接触Azure几个月,总想写点什么,迟迟没有动笔,一是怕自己技术粗鄙,写的东西会令人捧腹,二是工作原因,时间比较匆忙,在此再次声明,以下写的东西都是我个人看法,若有不足,请多多包涵!!! 情景是这样的 ...

  8. AOP理解

    1.问题 问题:想要添加日志记录.性能监控.安全监测 2.最初解决方案 2.1.最初解决方案 缺点:太多重复代码,且紧耦合 2.2.抽象类进行共性设计,子类进行个性设计,此处不讲解,缺点一荣俱荣,一损 ...

  9. 【spring】 <tx:annotation-driven /> 的理解 【转载的】

    在使用SpringMvc的时候,配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx.mvc 等也能很直白的理解出来分别的作用.<tx: ...

  10. ASM文件系统

    1.确认数据库版本 2.个人理解的存储解决方案的发展趋势 2.1图示说明 2.2图示描述 如上图我们描述了在不同时期的IT行业(数据库)出现的存储文件系统,下面我们将分别说明: ü  裸设备:所谓裸设 ...

随机推荐

  1. js获取父节点的方式

    js获取父节点的方式: 1.parentNode获取父节点 获取的是当前元素的直接父元素.parentNode是w3c的标准. var p = document.getElementById(&quo ...

  2. 操作系统实战45讲笔记- 07 Cache与内存:程序放在哪儿?

    程序局部性原理: CPU 大多数时间在执行相同的指令或者与此相邻的指令 时间局部性VS空间局部性: a. 时间局部性:当前访问的指令或数据,也可能在之后访问: b. 空间局部性:当程序访问内存地址x时 ...

  3. 如何查看nvidia官网发布的tensorrt镜像中都包含哪些包,trt版本是多少,cuda版本是多少?如何查看nvidia官网发布的triton镜像中都包含哪些包?

    在这里查看trt镜像中包含哪些内容:https://docs.nvidia.com/deeplearning/tensorrt/container-release-notes/rel_21-07.ht ...

  4. 制作docker php5.6的镜像

    docker pull centos Docker run -it --name="centos-test" centos yum install wget  # 报错在后面有处理 ...

  5. highcharts冷门功能总结

    1.散点图控制点的样式. Highcharts.chart('container', { series: [{ type: "scatter", marker: { fillCol ...

  6. 更改svn地址

    svn修改了服务器地址之后,本地要更新一下地址: 1. 在svn目录上右键,选TortoiseSVN->Relocate 2. 在To URL中填写新的地址,点击OK

  7. .net基础—多线程(二)

    Thread 在.NET中最早提供的控制线程类型的类型:System.Threading.Thread类.使用该类型可以直观地创建.控制和结束线程.下面是一个简单的多线程程序: static void ...

  8. 【C学习笔记】【分享】day2-2 不允许创建临时变量,交换两个数的内容(附加题)

    加法实现: #include <stdio.h> int main() { int a = 30; int b = 20; a = a + b; b = a - b; a = a - b; ...

  9. Qt6以上安装速度慢解决-国内镜像加速

    1.安装抓包软件Fiddler最新版本 Fiddler30天试用 2.在软件下方输入栏内粘贴以下命令 urlreplace download.qt.io mirrors.tuna.tsinghua.e ...

  10. linux服务器项目迁移非常好用的工具scp和rsync

    linux系统下一般都安装了,启用一下就可以了 (1):编辑配置文件 # sudo vi /etc/default/rsync #ubuntu  # vi /etc/xinetd.d/rsync #c ...