草庐IT

ARM寄存器组织(常见专用寄存器、控制寄存器CPSR)

仲夏夜之梦~ 2023-04-12 原文

目录

一、寄存器的概念

1、什么是寄存器?

2、寄存器的分类

3、不同工作模式下使用的寄存器

二、常见专用寄存器

1、R15(PC,Program Counter)

2、R14(LR,Link Register)

3、R13(SP,Stack Pointer)

三、控制寄存器CPSR

1、模式位 Bit[4:0]

2、状态位 Bit[5]

3、FIQ使能位 Bit[6] / IRQ使能位 Bit[7]

4、判断是否进位/借位 Bit[28] —— 有符号数运算

5、判断是否进位/借位 Bit[29] —— 无符号数运算

6、判断运算结果是否为 0 Bit[30] 

7、判断运算结果是否为负 Bit[31]


一、寄存器的概念

1、什么是寄存器?

寄存器是CPU内部的存储器没有地址。一般用于暂时存放参与运算的数据和结果,比如CPU在做加法运算的时候,加数、被加数以及产生的结果都是暂存在寄存器里。

2、寄存器的分类

寄存器分为三种类型,分别是通用寄存器、专用寄存器、控制寄存器。

通用寄存器指的是没有指定用途,可以存放任意内容的寄存器。既可以存放地址,也可以存放参与运算的数据或者运算产生的结果。

专用寄存器指的是有着指定用途,只能存放指定内容的寄存器。比如程序计数器PC 用于存放下一个要执行的指令的地址、SP用于存放栈顶元素的地址。

控制寄存器指的是用于控制当前CPU运行状态或者运算状态的寄存器。比如CPSR寄存器用于可以用于控制CPU当前所处工作模式,以及保存运算时的进位状态。

3、不同工作模式下使用的寄存器

看下面这个图的时候要以列为单位观察,每一列代表一种工作模式,不同工作模式使用的寄存器也不尽相同。不带三角形符号的表示不同工作模式之间可以共用的寄存器,如r0~r7是所有工作模式都可以共用的寄存器;带三角形符号的表示某一工作模式下特有的寄存器,其他工作模式无法使用该寄存器。

注意:图中虽然看着有很多寄存器,但实际上很多寄存器是可以共用的,算上共用和特有寄存器,一个处理器中仅有40个寄存器

二、常见专用寄存器

1、R15(PC,Program Counter

程序计数器,用于存储当前取址指令的地址。我们写的程序在经过预处理、编译、汇编以后,得到的二进制机器码就是指令。这些指令是被保存在内存中的,CPU接下来要执行哪一条指令都是由PC控制的。

我们写程序时的逻辑是顺序执行,那么CPU在执行指令的时候也是如此,在ARM状态下,每一条指令都占4个字节,所以每执行完一条指令,PC的值会自动自增4个字节,为下一次取指令做准备

2、R14(LR,Link Register

链接寄存器,也是保存指令地址,一般是发生跳转的时候,事先保存跳转指令下一条指令的地址,一般有两种用途。

(1) 调用函数发生跳转

假设main函数在执行程序的时候,需要调用函数func(),这个时候会跳转到func() 函数的定义。由于执行完func()函数以后还要继续运行main函数,在跳转之前LR寄存器会保存func()函数下一条指令的地址,也就是printf函数的地址。

在执行完func函数以后,只需要让 PC = LR 就可以回到func()函数下一条指令的地址。

(2) 异常发生(中断产生)

产生异常时,异常模式下的LR会自动保存被异常打断的指令的下一条指令的地址。(也可以理解成是一种函数跳转)

比如CPU正在忙手里的任务,突然收到了网卡发来的信号,CPU就会进入FIQ或者IRQ模式,此时CPU就会停下手里的任务,转而先去执行异常处理程序。异常处理结束后将LR的值复制到PC可实现程序返回。

3、R13(SP,Stack Pointer

栈指针,用于存储当前模式下的栈顶地址。假设现在CPU要将运算结果保存到栈上,这个时候SP寄存器就会告诉CPU栈顶的位置在哪,保存完毕以后,SP指向的地址会更新。

三、控制寄存器CPSR

CPSR(Current Program Status Register)是当前程序状态寄存器。可以控制处理器当前所处工作模式,可以保存运算状态,如进位、借位。

1、模式位 Bit[4:0]

用于控制处理器所处的工作模式。不同工作模式对应的取值如下:

工作模式取值(左边高位,右边低位)
User10000
FIQ10001
IRQ 10010
SVC10011
Abort 10111
Undef 11011
System11111
Monitor10110

2、状态位 Bit[5]

表示当前处理器所处状态。ARM状态下,每一条指令占4个字节,PC每次自增4;Thumb状态下,每一条指令占2个字节,PC每次自增2。

处理器状态取值
ARM状态0(默认状态)
Thumb状态1

3、FIQ使能位 Bit[6] / IRQ使能位 Bit[7]

Bit[6] 表示是否开启FIQ,默认状态是开启。

FIQ状态取值
开启0(默认状态)
关闭1

Bit[7] 表示是否开启 IRQ,默认状态是开启。

IRQ状态取值
开启0(默认状态)
关闭1

4、判断是否进位/借位 Bit[28] —— 有符号数运算

该位记录的是,当参与运算的是有符号数时,运算是否发生了进位或者借位,这里要把加法和减法分开讨论。

  • 运算器进行加法运算
    • 进位自动置 1,否则为 0
  • 运算器进行减法运算
    • 借位自动置 0,否则为 1

5、判断是否进位/借位 Bit[29] —— 无符号数运算

该位记录的是,当参与运算的是无符号数时,运算时是否发生了进位或者借位,同样要把减法和减法分开讨论。

  • 运算器进行加法运算
    • 进位自动置 1,否则为 0
  • 运算器进行减法运算
    • 借位自动置 0,否则为 1

6、判断运算结果是否为 0 Bit[30] 

当运算结果为 0 时,该位自动置 1,否则为 0

7、判断运算结果是否为负 Bit[31]

当运算结果为负数时,该位自动置 1,否则为 0

有关ARM寄存器组织(常见专用寄存器、控制寄存器CPSR)的更多相关文章

  1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  2. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  5. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  6. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

  7. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

  8. ruby - 将全局 $stdout 重新分配给控制台 - ruby - 2

    我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r

  9. ruby-on-rails - Ruby 流量控制 : throw an exception, 返回 nil 还是让它失败? - 2

    我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id

  10. ruby - 将对象设置为 nil 是否很常见? - 2

    我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://

随机推荐