← 返回 计组与微机控制

计组与微机控制

2.4 流控制与对应条件码寄存器

2.4流控制与对应条件码寄存器

一.认识条件码寄存器

2.4 ???????????? ? 1

不同地方不同简称不太一样~比如说计算机组成原理和电子信息工程的微机控制大概学的大差不差吧~但是叫法不一样,当然我专业是电子信息工程的,嘻嘻……(题外话)

下面来看看区别吧

1. CCR(条件码寄存器)—— 通用概念

这是在学习计算机组成原理时遇到的**通用术语**。

- **它是什么**:指 CPU 内部一个专门用来存放**条件码(标志位)** 的寄存器。

- **包含什么**:就是我们之前讨论的 **N(负数)、Z(零)、C(进位)、V(溢出)** 等标志位。

- **作用**:记录上一条运算指令的结果状态,供后续条件跳转指令(如 `BEQ`)判断。

2.4 ???????????? ? 2

在之前的 `ADD` 指令更新标志位的那张图里,那个存放标志位的盒子,通用的名字就叫 **CCR**。

2.4 ???????????? ? 3

所以说加S和不加会影响CCR的判断~

2.4 ???????????? ? 4

我们看这个加法~注意一下这个加的是补码哦因为要考虑负数,所以第一位我们永远是看符号,有8位所以,所以带上符号范围是-127~+127,主要看下第二个这个例子是产生了进位,这个是-1的补码,也是导致我们把第九位抹除了,保留了后八位,同样是对的是-1的补码加上1的补码位0,然后进位位存在了ccr里面,现在看第三个,诶,错了?你会发现他产生了溢出位,

看分析~## 1. 当作有符号数(补码)解释

- **第一个数** `01011100`

最高位是 `0`,所以是正数。

计算其值:( 64 + 16 + 8 + 4 = 92 )。

- **第二个数** `01000001`

最高位是 `0`,也是正数。

计算其值:( 64 + 1 = 65 )。

- **数学上**:( 92 + 65 = 157 ),应该在 0~255 之间,不会溢出(对8位无符号数是正确的)。

- **但结果** `10011101` 的最高位是 `1`,如果把它解释为**有符号数**,它是一个负数。

计算其值:

先取反得 `01100010`,加1得 `01100011` = ( 64 + 32 + 2 + 1 = 99 ),

所以结果是 **-99**。

- **问题**:两个正数相加,结果却是负数——这显然不符合数学预期,所以从有符号数角度看,结果是**错误的**。

导致我们看第三个~发现诶是不是加错了,

原因是因为相加的结果是157,超了+127,导致了错误,记住一句话,计算机加的永远是对的,那这个我们怎么解决呢,这个我们下个误区讲

2. CPSR(当前程序状态寄存器)—— ARM 的具体实现

当真正进入 ARM 处理器的世界,它不叫 CCR,而叫 **CPSR**。

- **它是什么**:这是 ARM 架构中**真正存在的、物理的 32 位寄存器**。

- **包含什么**:它不仅包含我们关心的条件码标志位(N、Z、C、V),还包含了很多**控制位**:

- **中断禁止位**:是否允许响应中断。

- **处理器模式位**:当前是用户模式、内核模式还是中断模式等。

- **状态位**:当前是 ARM 状态(32位指令)还是 Thumb 状态(16位指令)。

- **一句话总结**:CPSR 是 ARM 处理器中那个**完整的管理者**,既管状态,也管控制。

3. APSR(应用程序状态寄存器)—— 用户能看到的“部分”

这是为了现代 ARM 处理器(比如 Cortex-M 系列)支持**双操作系统**而引入的概念。

- **它是什么**:可以理解为 **CPSR 的“简化版”或“用户视图”**。

- **包含什么**:它主要包含那些**用户程序(应用层)** 可以直接访问的标志位,也就是你最熟悉的 **N、Z、C、V 和 Q(饱和标志)** 这些条件码。

- **为什么需要它**:在有些运行高级操作系统的处理器中,CPSR 里的控制位(如模式、中断)对普通应用程序是不可见的,也不能随意修改。APSR 就是专门开放给应用程序来查看运算标志的那一部分。

总结与关系图

- **CCR**:课本里的概念,泛指那一组标志位。

- **CPSR**:ARM 硬件里真实的 32 位寄存器,包含**标志位 + 控制位**。

- **APSR**:从 CPSR 里抽出来的、供应用程序读写的**那部分标志位**。

2.4 ???????????? ? 5

二.流控制~

上一节里面那个PC不是自动加4个字节的循环嘛,如果说我们在指令中遇到了跳转操作或者类似于CMP这种比较的操作,这些也就是所谓的条件分之指令,进行下一步操作时,我们要判断ccr的内容,如果测试位是true,则我们去取IR中操作数的地址,false就自动加4

下面展示两个例子~

1.

2.4 ???????????? ? 6

上面是类似于高级语言的表示,当然不是C或python,只是类似而已啦,下面看汇编语言

从上往下依次执行,直到SUBS这里,这个后面会说,他会自动更新ccr的状态位和普通的SUB相减不一样,因为我们下面要用BPL进行分支语句,这时候会根据ccr判断,如果true,我们直接跳转到Then那里,也就是PC不自动加4了,如果是false,我们就继续从上往下执行,然后到B那里无条件(上节常用指令里面)跳转到Exit,然后后面我们DCD把这些结果依次存储到内存里面

2.

2.4 ???????????? ? 7

我们从上往下依次执行把1放入r0,然后把0放入r1,这时候把r0+r1的值加起来再存到r1里面,这时候r0的值加一存到r0里面,我们用CMP比较r0-21的大小,(CMP会自动更新状态位)(这些CMP和BNE用的都是条件分支指令后面会说)直到r0等于21的时候停止,否则就用Next跳转到上面Next在的地方,也就是说r0此时是2,r1是1,再循环一次也就是1+2再存到r1里面 这时候r0+1再存到r0是3,再和r1相加,类推,r1就是最后结果的地方