微处理器系统

1. 基本结构

在这里插入图片描述

2. Mu0 基本命令

在这里插入图片描述
mem[S]是地址
S是这个地址的索引
A是一个16bit的寄存器
S的范围为:
在这里插入图片描述

在编程时,可以用数字的形式来表示命令,可以看到下图中的命令都变成了对应的数字:
在这里插入图片描述

3. ARM 基本命令

在这里插入图片描述
ADR
LDR
STR
BGE
DCW

如果结果大于32bit,则会保存最后面的32bit

op2可以直接是一个数,也可以是register(MUL, MLA除外)
在这里插入图片描述

3.1 状态码

在这里插入图片描述
在这里插入图片描述下·

3.2 S code

在命令尾部加上S,可以设置FLAG
在这里插入图片描述
如图,只有第一个表格和最后一个表格里的才能同时设置4个FLAG

3.3 LDR和STR的indirect addressing

在这里插入图片描述

LDR赋予的r6的是r11包含的地址对应的值
而MOV赋予的是r11包含的地址

LDR这种寻址方式被称为indirect addressing
在这里插入图片描述
STR是将r6 register里的值赋予r11对应的memory

LDR r0, =0x…
可以将32bit的数据存入r0

3.3.1 Base plus addressing

可以在 LDR 的方框内加一个数字来改变地址
在这里插入图片描述

3.3.2 LOAD 和 STORE

LDR是将数据从memory移到register
STR是将数据从register移到memory

每个内存地址包含 1 byte,也就是 8 bits 的数据,然而LDR 和 STR包含4个byte, 也就是包含4个地址

3.3.2.1 LDHR, LDRB,STRH,STRB

LDHR 只会 load 最后面的 16 bits 数据,剩下的16 bits 清零
LDRB 只会 load 最后面的 8 bits 数据,剩下的24 bits 清零

同理 STRH 只会 store 最后的 16 bits
STRB 只会 store 最后的 8 bits

3.3.3 Big endian & little endian

不同的 ARM processor 形式不同

3.3.3.1 Big endian

在这里插入图片描述

3.3.3.2 Little endian

在这里插入图片描述

3.4 Compare

用于 compare 的 instructions 不需要目标寄存器,并且总是会设置 FLAG
在这里插入图片描述

3.5 Shift

在使用 MOV 命令改变寄存器内容时,可以追加命令来修改这些内容

例如:
在这里插入图片描述
LSL #5 将 r2 拥有的值左移了五格之后存进了 r1

一共有五种 shift

  • LSL #n 左移n位
  • LSR #n 右移n位
  • ASR #n 右移n位,新加进来的 bit 为原来的 sign bit
  • ROR #n 向右旋转n位,右边消失的会在左边出现
  • RRX 向右移动一位,将 carry flag 放在最左,如果有 ‘S’ ,则将最右被移出去的 bit 放进 carry flag

位移的数目也可以用 register 指定
在这里插入图片描述
r3 为 19,则会位移19位

3.5.1 用 shift 和 add 来实现 multiply

在这里插入图片描述

FLAG

四种FLAG分别为:

  • Zero flag Z = 1,结果为0
  • Negative flag N = 1,结果为负 (即most significant bit = 1)
  • Carry flag C = 1,结果带有一个进位(unsigned 溢出),对于减法,不借位就算是进位,C=1
  • Overflow flag V = 1,结果是 signed number 溢出(即两个整数相加得到负数,或两个负数相加得到正数时)

FLAG是微处理器中的一种标记符号,常常用来表示一个命令执行后的结果

0 FLAG 常常被用在循环中, 如下图
在这里插入图片描述

将有符号整数转换为16 bit 2’s complement

先将该整数的绝对值转换为二进制。如十进制数9转换为二进制得1001。不足16bit高位补零,得0000 0000 0000 1001。若十进制数是正数,最终结果就是刚刚得到的二进制数。但如果是负数,则再对刚刚得到的二进制数求补。规则是按位取反,末位加一。例如十进制数-9,对上面的二进制数求补得1111 1111 1111 0111

补码的作用

运算中出现负数时,需要取补码再运算

IEEE 754 Format

这一形式可以在计算机中表示浮点数

计算流程

在线计算器

Example

254.456

254 = 1111 1110
0.456 = 0111 0100 1011 1100

11111110.0111010010111100
1.11111100111010010111100 * 2^7
取小数点后面的数为尾数,即11111100111010010111100

阶码 = 7 + 127 = 128 + 4 + 2 = 10000110

整数,sign number 为 0, 放在最前面

Sign number + 阶码 + 尾数
0100 0011 0111 1110 0111 0100 1011 1100

16进制

0x437E74BC

特殊数字

0x7F800000 代表正无穷
0xFF800000 代表负无穷

地址总线,数据总线,内存容量

在这里插入图片描述
最上面的A0, A1是地址总线,因为只有4个地址,所以两个地址总线足够表达4个地址了

如果是22个地址,则需要地址总线能表达的数字大于22,也就是至少需要32bit的地址总线

2^地址总线 需要大于处理器的内存区块数量

数据总线与处理器的字长一样

内存容量为 字长*内存区块数

Words

words代表“字”,不同系统的字包含信息量可能不同

22 words of 32 bits each,说明这个处理器有22个字,每个字的字长是32bit

寻址

Register addressing

在这里插入图片描述

Immediate addressing

在这里插入图片描述

Immediate addressing 的问题

在这里插入图片描述

Branch

通过 branch 可以让程序在一个不同的内存位置继续执行

Conditional branch 实例

Unconditional branch 无论如何都会执行
在这里插入图片描述
上图的程序,在执行到B时会跳转到对应的地址继续执行

这里的 B 也可以在后缀加上状态码

Conditional branches 实例

Conditional branch 只有特定情况才会执行,通常和 flag 相关

Branch 限制

目标地址必须在 branch instruction 当前地址的 32MB 以内

Branch 记忆

通常会用 label 代替地址,不然会很混乱

示例如下:
在这里插入图片描述
这里用 continue 代替了地址

Cache memory

越大的内存意味着越慢的读写速度

用 cache memory 可以同时拥有内存和速度

Cache memory 会保存最近从main memory获取的数据的副本

cache 的性能表现为’hit rate‘,当代cache 的 hit rate 应该超过 90%

16进制,10进制互相转换

10进制:428
428/16 = 26…12=C
26/16 = 1…10=A
1AC

16进制:3FA
3 ∗ 1 6 2 + F ∗ 1 6 1 + A ∗ 1 6 0 = 768 + 240 + 10 = 1018 3*16^2+F*16^1+A*16^0=768+240+10=1018 3162+F161+A160=768+240+10=1018

IEEE 754 example

-40

在这里插入图片描述
sign 为 1, 负数

exponent 为 2 7 + 2 2 = 132 2^7+2^2=132 27+22=132
132-127=5

matissa 为 1 + 2 ( − 2 ) = 1.25 1+2^{(-2)}=1.25 1+2(2)=1.25

结果为
在这里插入图片描述

1.5

在这里插入图片描述
第一位为 0 ,正数

expoent 为 2 7 − 1 = 127 2^7 - 1=127 271=127
127-127=0

matissa 为 1 + 2 ( − 1 ) = 1.5 1+2^{(-1)}=1.5 1+2(1)=1.5

结果: 1.5 × 2 0 = 1 1.5\times2^0=1 1.5×20=1

1

在这里插入图片描述
matissa = 1

结果= 1 × 2 0 = 1 1\times2^0=1 1×20=1

Loop

进入 loop 前先把计数清零

While

在进入 loop 之前用 B 先跳入 loop 最后一行
在这里插入图片描述

For loop

在这里插入图片描述

Count down loop

在这里插入图片描述

冒泡算法

比较相邻的元素。如果第一个比第二个大,就交换他们两个。 [1]
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 [1]
针对所有的元素重复以上的步骤,除了最后一个。 [1]
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 [1]
在这里插入图片描述

Table

系数始于0

每一个data 的 size 是 4 bytes (32bits)
在这里插入图片描述
在这里插入图片描述
LSL#2 乘以 2^2

LDRH 只提取一半 (2 bytes)
LDRB 提取四分之一 (1 byte)

找到 Table 中的最大值

Sort

Search

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值