精华内容
下载资源
问答
  • 8051内部21,在物理上是分散在片内各功能部件中,在数学上把它们组织在内部数据存储器地址空间80H~FFH中,以便能使用统一的直接寻址方式来访问。这些特殊功能寄存器颁在以下各个功能部件中:(1)CPU:ACC、B、...
  • ARM 关键几个寄存器

    2015-10-09 01:29:44
    ARM 关键几个寄存器 1. PC(程序计数器) = windows 中 EIP 解析:  处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条 地取到处理器中再译码、...

    ARM 关键几个寄存器

    1. PC(程序计数器)  = windows 中 EIP
    解析: 
    处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条
    地取到处理器中再译码、执行,以完成整个程序的执行。为了保证程序能够连续地执行下去,CPU必须具
    有某些手段来确定下一条取指指令的地址.程序计数器(PC)正是起到这种作用,所以通常又称之为‘指令计数器’
    。CPU总是按照PC的指向对指令序列进行取指、译码和执行,也就是说,最终是PC 决定了程序运行流向。故而,程
    序计数器(PC )属于特别功能寄存器范畴,不能自由地用于存储其他运算数据.

    在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,CPU 按照 PC
    的指示从内存读取第一条指令(取指)。当执行指令时,CPU自动地修改PC 的内容,即每执行一条指令PC增加一个
    量,这个量等于指令所含的字节数(指令字节数),使 PC总是指向下一条将要取指的指令地址。由于大多数指令都
    是按顺序来执行的,所以修改PC 的过程通常只是简单的对PC 加“指令字节数”。
        当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目标地址。处理器总是按照PC
     指向取指、译码、执行,以此实现了程序转移。

    2.堆栈指针寄存器 SP  (寄存器 R13)
    ARM处理器中通常将寄存器R13作为堆栈指针(SP)。ARM处理器针对不同的模式,共有 6 个堆栈指针(SP),其中
    用户模式和系统模式共用一个SP,每种异常模式都有各自专用的R13寄存器(SP)。它们通常指向各模式所对应的专
    用堆栈,也就是ARM处理器允许用户程序有六个不同的堆栈空间,ARM处理器中的R13被用作SP。当不使用堆栈时,
    R13 也可以用做通用数据寄存器.
    ****************************************************************************************************
    由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模
    式下的R13,使其指向该运行模式的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R
    13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的
    正常执行。
    ****************************************************************************************************


    3.R14称为子程序链接寄存器LR(Link Register),当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备
    份.在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值复制给
    R14,执行完子程序后,又将R14的值复制回PC,即可完成子程序的调用返回。以上的描述可用指令完成。
    执行以下任意一条指令:
    MOV PC,LR
    BX LR
    在子程序入口处使用以下指令将R14存入堆栈:
    STMFD SP!,{,LR}
    对应的,使用以下指令可以完成子程序返回:
    LDMFD SP!,{,PC}
    R14也可作为通用寄存器。

    4. PSR 寄存器
    条件码标志(Condition Code Flags)
    N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否
    被执行。
    在ARM状态下,绝大多数的指令都是有条件执行的。
    在Thumb状态下,仅有分支指令是有条件执行的。

      N  Negative        如果结果是负数则置位     当用补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果是正数或零。
      Z  Zero            如果结果是零则置位       Z=1表示运算的结果为零;Z=0表示运算的结果不为零。
      C  Carry           如果发生进位则置位       有4种方法影响C的值:
                    l  加法运算:当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
                    2  减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出)时,C=0,否则C=1。
                    3  对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
                    4  对于其他的非加/减运算指令,C的值通常不改变。

      V  Overflow        如果发生溢出则置位       有2种方法设置V的值:
                   l  对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
                  2  对于其它的非加/减法运算指令,V的值通常不改变。
      I  IRQ             中断禁用  
      F  FIQ             快速中断禁用  
      T                  工作状态位,1为Thumb;0为ARM

    展开全文
  • 置顶/星标公众号,不错过每一条消息! 今天分享点小知识,希望对你帮助!1Flash容量寄存器问题是之前人问过,说:我的芯片被抹掉,看不清了,我怎么知道这块...
        

    置顶/星标公众,不错过每一条消息!

    640?wx_fmt=jpeg

        今天分享几点小知识,希望对你有帮助!

    1Flash容量寄存器

    这个问题是之前有人问过,说:我的芯片被抹掉,看不清了,我怎么知道这块芯片容量大小?


    解决办法:


    1.通过读寄存器

    在STM32的“参考手册”中有Flash size data register这么一个寄存器(一般在手册最后),明确写了寄存器的基地址。


    提示:不同芯片型号,可能这个寄存器地址不同。比如F103的基地址为:0x1FFFF7E0。

    640?wx_fmt=png

    是一个16位的数值,出厂写入,程序只能读取。读取方法很简单,可以如下:

    uint16_t Flash_size;

    Flash_size = *(uint16_t *)0x1FFFF7E0;


    说到这里,可以参看我之前分享的一篇文章《你的STM32芯片FLASH容量真如ST官方选型手册那样吗?


    2.通过STM32 ST-LINK Utility直接读取

    通过ST-Link连接芯片,直接读取,可以看到容量信息:

    640?wx_fmt=png

    2

    UID寄存器

    之前有人问我,可以通过STM32的UID来加密吗? 这个肯定是可以的。


    但又问了我一个问题,我不希望读取全部(96位),可以只读取部分寄存器来作为标识吗?读取的部分会不会重复?

    STM32的UID唯一标识符适用于

    • 用来作为序列号。

    • 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。

    • 用来激活带安全机制的自举过程。

    STM32的UID共有96位(32 x 3)。所有,就有朋友,我是否可以只读取其中某一部分来作为唯一识别?


    这个问题,严格来说,不可以。但如果不是特别严格,还是可以。因为这个UID是通过晶元、分批等来进行编号的。如果你买同一批次,你会发现那个编号可能连续。


    640?wx_fmt=png

    640?wx_fmt=png

    我之前曾读取过几块生产的板卡(购买得_MCU是同一批次),芯片的UID是连续的,感兴趣的可以试试。

    所以,通过读取部分UID来作为标识,只能说不严格的情况是可以的


    3

    寄存器偏移地址

    现在还有许多初学的朋友在学习底层的一些知识,比如前面就有朋友想自己通过寄存器来编程,但是却不知道什么是寄存器基地址,什么是寄存器偏移地址。


    1.基地址

    每一个片内外设都有一个对应的基地址,而且是由厂商决定我们不能修改。如下图:

    640?wx_fmt=png

    在程序中,你会发现和上面对应的代码:

    640?wx_fmt=png

    2.偏移地址

    偏移地址就是在基地址基础上偏移(一般是以4字节增加),比如TIM定时器的偏移地址:

    640?wx_fmt=png

    同样,在程序中对应的代码通过结构体实现偏移:

    640?wx_fmt=png

    关于基地址和偏移地址,不管是标准外设库还是HAL库,都是上面所示那种基地址+偏移的方法实现。


    还是之前多次在文章中提到的,想要了解寄存器原理,或者通过寄存器来实现的朋友,最好参考“标准外设库”例程。HAL库封装的相对复杂,不适合研究最底层寄存器。



    推荐阅读:

    1.精选汇总文章

    2.你的STM32芯片FLASH容量真如ST官方选型手册那样吗?

    4最后

    若觉得文章对你有帮助,随手点赞、分享,也是对我莫大的支持和鼓励。


    扫描下面二维码、关注公众号,在底部菜单中查看更多精彩内容!


    640?wx_fmt=jpeg

    长按识别图中二维码关注

    640

    赞赏是对作者的认可与支持!

    展开全文
  • 寄存器介绍

    2017-12-26 22:50:39
    寄存器是CPU的组成部分,因为在CPU内,所以CPU对其读写速度是最快的,不需要IO传输,但同时也决定了此类寄存器数量非常有限,有限到几乎每存储都自己的名字,而且有些还有多名字。  IA-32构架提供了16...
     寄存器是CPU的组成部分,因为在CPU内,所以CPU对其读写速度是最快的,不需要IO传输,但同时也决定了此类寄存器数量非常有限,有限到几乎每个存储都有自己的名字,而且有些还有多个名字。

     IA-32构架提供了16个基本寄存器,这16个基本寄存器可以归纳为如下几类:
      • 通用寄存器
      • 段寄存器
      • 状态和控制寄存器
      • 指令寄存器

            通用寄存器

    32位通用寄存器有八个,eax, ebx, ecx, edx, esi, edi, ebp, esp,

    他们主要用作逻辑运算、地址计算和内存指针,具体功能如下:

    • eax    累加和结果寄存器
    • ebx    数据指针寄存器
    • ecx    循环计数器
    • edx    i/o指针
    • esi    源地址寄存器
    • edi    目的地址寄存器
    • esp    堆栈指针
    • ebp    栈指针寄存器
    当然,以上功能并未限制寄存器的使用,特殊情况为了效率也可作其他用途。

    这八个寄存器低16位分别有一个引用别名 ax, bx, cx, dx, bp, si, di, sp, 

    其中 ax, bx, cx, dx, 的高8位又引用至 ah, bh, ch, dh,低八位引用至 al, bl, cl, dl

    在 64-bit 模式下,有16个通用寄存器,但是这16个寄存器是兼容32位模式的,
    32位方式下寄存器名分别为 eax, ebx, ecx, edx, edi, esi, ebp, esp, r8d – r15d. 
    在64位模式下,他们被扩展为 rax, rbx, rcx, rdx, rdi, rsi, rbp, rsp, r8 – r15. 
    其中 r8 – r15 这八个寄存器是64-bit模式下新加入的寄存器

    段寄存器

    段寄存器 cs, ds, ss, es, fs, gs, 保存16位的段选择子,一个段选择子指定了一个段在内存的指针,

    以便再内存中访问段,访问方式与内存模式有关,段模式和平坦模式其代表的意义并不相同。

    • cs    代码段寄存器

    • ds, es, fs, gs    数据段寄存器

    • ss    堆栈段寄存器

    在 64-bit 模式下,这6个寄存器并无变化,只是使用上略有区别。

    状态和控制寄存器 eflags
    这个寄存器表示的意义非常丰富,程序中并不直接操作此寄存器,并由此衍生出很多操作指令。
    除去一些保留位,其他每位都代表一个具体的含义,
    其中 bits 0, 2, 4, 6, 7, 11 是状态位
    ,标识了某此操作后的状态:
    • CF (bit 0) —— 进位标识,算术操作进行了进位和借位,则此位被设置
    • PF (bit 2) —— 奇偶标识,结果包含奇数个1,则设置此位
    • AF (bit 4) —— 辅助进位标识,结果的第3位像第4位借位,则此位被设置
    • ZF (bit 6) —— 零标识,结果为零,此位设置
    • SF (bit 7) —— 符号标识,若为负数则设置此位
    • OF (bit 11) —— 溢出标识,结果像最高位符号位进行借位或者进位,此标志被设置

    8, 9, 10 位为控制标识:

    • TF (bit 8) —— 陷阱标识,设置进程可以被单步调试

    • IF (bit 9) —— 中断标识,设置能够响应中断请求

    • DF (bit 10) —— 方向标识,用于标示字符处理过程中指针移动方向。

    64-bit模式下,该寄存器被扩展为64位,rflags,但是其高32位保留未被使用,其低32位所表示含义与32位模式相同。
    指令寄存器 EIP
    EIP —— 标志当前进程将要执行指令位置,在64位模式下扩展为 RIP 64位指令寄存器。
    控制寄存器
    cr0, cr2, cr3, cr4

    系统表指针寄存器

    • idtr —— 中断描述符表信息
    • gdtr —— 全局描述符表信息
    • ldtr —— 局部描述符表信息

    任务寄存器tr

    保存任务的状态信息 tss

    调试寄存器
    dr0 – dr7,控制和允许监视进程的调试操作
    x87 FPU 寄存器
    这组指令专门用过浮点运算,因为浮点运算尤其固有的特性,所以需要使用一组独立寄存器。
    数据寄存器包括 r0 – r7 的8个 80 位寄存器,汇编程序中通过名字 st(x) 引用,
    另外还有3个16位寄存器,分别是控制寄存器,状态寄存器,标记寄存器。这里的省略具体含义的介绍。
    MMX 寄存器
    MMX 为一种 SIMD 技术,即可通过一条指令执行多个数据运算,共有8个64位寄存器,分别为mm0 – mm7,
    他与其他普通64位寄存器的区别在于通过它的指令进行运算,可以同时计算2个32位数据,或者4个16位数据等等,
    可以应用为图像处理过程中图形 颜色的计算。
    另外需要特别注意的是,MMX并非一种新的寄存器,而是FPU 80位寄存器的低64位,也就是说,使用MMX指令集,会影响浮点运算!
    XMM 寄存器

    XMM 同 MMX,只是他有 8 个 128 位寄存器,分别为 xmm0 – xmm7,另外还包含计算过程中的状态和控制寄存器

    展开全文
  • ARM的37个寄存器详解

    千次阅读 2017-12-17 19:55:15
    ARM共有37个寄存器,都是32位长度 37个寄存器中30为“通用”型,1固定用作PC,一固定用作CPSR,5固定用作5种异常模式下的SPSR。注意:System模式使用User模式寄存器。...ARM总共37个寄存器

    这里写图片描述
    ARM共有37个寄存器,都是32位长度
    37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。

    这里写图片描述

    注意:System模式使用User模式寄存器。当ARM从用户模式(User)切换到快速中断模式(FIQ),寄存器r0~r7,r15是不变的,FIQ的寄存器r8~r14切换User模式下的同名寄存器。其它几种模式之间切换同理。

    ARM总共有37个寄存器,但是每种模式下最多只能看到18个寄存器,其它寄存器虽然名字相同但是在当前模式不可见。

    对r13这个名字来说,在ARM中共有6个名叫r13(又叫sp)的寄存器,但是在每种特定处理器模式下,只有一个r13是当前可见的,其它的r13必须切换到它的对应模式下才能看到。这种设计叫影子寄存器。

    寄存器的作用:

    r13(sp)是堆栈(程序工作现场)指针,如果7种模式都是采用同一个堆栈指针的话,在某一个模式中,堆栈出现了问题,则会导致7种模式都奔溃,故7种模式的栈都是不同的。

    r14(lr)是存储返回地址的。在用户模式跳到中断模式,然后再调回用户模式,就可以用该返回地址。中断模式下的函数调用也可以用到该返回地址。

    r15(pc)是程序控制计数器,记录当前程序处理到哪里。所以CPU只有一个程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)

    cpsr是程序状态寄存器,用来记录CPU运行状态,每个CPU都有一个

    spsr是用来保存cpsr的

    CPSR状态寄存器

    这里写图片描述

    中断禁止位:
    I:普通中断
    F:快速中断

    条件位(自动运算):
    N:ALU运算结果负位
    Z:ALU运算结果负位
    C:进位标志位
    V:有溢出

    CPSR中各个bit位表明了CPU的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和CPSR中的Z标志位有关)
    CPSR中的I,F位和开中断、关中断有关

    CPSR中的mode位(bit4~bit0共5位)决定了CPU的工作模式,在uboot代码中会使用汇编进行设置

    展开全文
  • 单片机寄存器

    千次阅读 2019-05-30 14:10:30
    单片机寄存器其实就相当于一变量,只不过这变量在固定的地址,特殊的名称(当然也不强制)。...这就是为什么数据手册上全是第位表示什么含义,对一字节的操作就要看半天手册,因为一字节8bit,...
  • MIPS32通用寄存器($0-$31),各寄存器的功能及汇编程序中应用约定如下: 下表描述32通用寄存器的别名和用处 REGISTER NAME USAGE $0 $zero 常量0(constant value 0...
  • 早在16位的8086CPU时代,内存资源宝贵,CPU使用分段式内存寻址技术: 16位的寄存器能寻址的范围是64KB,通过引入段的概念,将内存...段寄存器有下面6,前面4是早期16位模式就引入了,到了32位时代,又新增了.
  • 寄存器编址

    千次阅读 2014-04-12 15:37:45
    分析这几个容易混淆的概念.  引用一段资料: 几乎每一种外设都是通过读写设备上的寄存器来进行操作的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器...
  • 在AHCI协议中Port Register中如下几个寄存器,我们这里主要关注PxSSTS和PxSERR 2. 什么是SCR寄存器 参考AHCI协议14.1章节 Sata host适配器包括了一个额外的寄存器块,这些寄存器是分离的独立的,映射了ATA ...
  • LINUX寄存器总结

    2020-08-03 21:45:48
    前言(wxy):说到寄存器,迷迷茫茫好多年,首先不知道到底哪些寄存器,因为不同的博客总会出现几个我不认识的寄存器;其次,想记住每个寄存器的名称,真的太南了;最后,他们到干什么用的,寄存器之间到底什么关系...
  • 导致每次只能使用一副本寄存器去暂存然后移位后控制固定的寄存器位置,但是这样写起来较为麻烦,考虑到Verilog肯定不会这么低能,所以查阅了一些资料后发现果然可以动态控制的方法。 Verilog里只是前后不能同时...
  • ARM 寄存器

    2017-03-24 15:22:41
    ARM 关键几个寄存器 1. PC(程序计数器) = windows 中 EIP 解析: 处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条 地取到处理器中再译码、执行,以...
  • 汇编笔记:寄存器介绍

    千次阅读 2019-03-18 11:30:39
    寄存器是CPU的组成部分,因为在CPU内,所以CPU对其读写速度是最快的,不需要IO传输, 但同时也决定了此类寄存器数量非常有限,有限到几乎每存储都有自己的名字,而且有些...32位通用寄存器有,eax, ebx, ecx,...
  • 8086数据寄存器介绍

    千次阅读 2016-10-04 18:27:30
    下面介绍这几个通用寄存器: 数据寄存器(AX,BX,CX,DX): 数据寄存器有 AX,BX,CX,DX 四个组成, 由于在 8086 之前的 CPU 为 8 位 CPU,所以为了兼容以前的 8 位程序,在 8086 CPU 中,每一个数据寄存器都...
  • CPU寄存器英文名字

    2021-04-26 16:54:55
    8086CPU14个寄存器,我弄了一虚拟机在里面运行了debug.exe,结果我的芯片9代i7也是14个寄存器,不知道是不是我的操作引发的问题,十年寄存器数量没有变,这似乎说不通。 通用寄存器 ax,bx,cx,dx共4 a,b,c,d...
  •  几个常用的SFR  1、ACC:累加器,常常用A表示。这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中...
  • 8086寄存器分类

    千次阅读 2016-10-16 14:04:58
    几个寄存器又分为高八位和低八位,分别取名为AH / AL、BH / BL、CH / CL、DH / DL; 假如AX的值为00000000 执行mov ah,1 那么ax的值为00010000,执行mov al,1 那么ax的值为00000001  SI――源变址寄存器...
  • 前几天把外部中断基本搞好了,但对几个中断寄存器的具体含义和区别不是很了解。今天特意拿起datasheet详读并网络上查了这方面的资料。将结果记录如下: S3C2440的中断寄存器有6个中断裁决器,分为2级:第一级为5...
  • 什么是寄存器

    2020-08-31 16:06:45
    身上只有那么几个,只装最常用或者马上要用的东西。 内存就是你的背包。时候拿点什么放到口袋里,时候从口袋里拿出点东西放在背包里。 辅存就是你家里的抽屉。可以放很多东西,但存取不方便。 如果把被储存的...
  • 线程都上下文环境,它包含了有关线程的大部分信息,例如线程栈的地址,线程当前正在执行的指令地址等。上下文环境保存在寄存器中,系统进行线程调度的时候会发生上下文切换,实际上就是将一线程的上下文
  • STM32巧用两32位寄存器的Bit位创建多达64事件标志位 本人搞硬件半路出家的野狐禅,十年以前学习过微芯的PIC汇编语言入门单片机的。近一年来因为工作关系所以又摸索着自学了STM32的单片机编程,由于以前学习...
  • JVM之PC寄存器

    2020-09-09 22:05:30
    运行时数据区分为以下几个区域,按照所属性可以分为以下两类:属于JVM(生命周期与JVM相同,线程共享),属于线程(生命周期与线程相同,线程私有) 属于JVM堆(Dump)和方法区(Method Area),属于线程程序计数寄存器...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,065
精华内容 826
关键字:

寄存器有几个