
别胡说八道,去做吧!一:公交车

1.每个CPU芯片都有许多引脚,这些引脚连接到总线,并且CPU通过总线与外部设备进行交互
2.什么是巴士?
公共汽车是电线的集合
3.什么样的公交车?
数据总线
控制总线
4.微型计算机的基本结构

看看下面的图片
CPU从存储器的第三个单元读取数据

地址总线
地址总线的宽度决定了CPU的寻址能力
8086CPU的地址总线宽度为20,因此寻址能力为1M
如何计算?
这里有点令人费解,让我更仔细地谈论
如果我有两条地址总线,并且它们都已通电,那么它的值为11(二进制),即3,可以理解吗?
0(0 0)
1(0 1)
2(1 0)
3(1 1)
结合上图,其寻址能力为0 1 2 3,即4字节
地址总线寻址能力的度量单位为Byte,公式为寻址能力= 2 ^ n,其中n是地址总线的宽度
有20个?
答案是:2 ^ 20 B == 2 ^ 10 KB == 1 MB
如果您不理解上述表达式,则需要了解B KB MB的转换。
常识:10条地址总线的寻址能力为1KB
20条地址总线的寻址能力为1MB
30条地址总线的寻址能力为1GB
32根地址总线的寻址能力为4GB(2 ^ 2 GB)。这就是为什么32位系统内存最多仅支持4G,而不能使用更大的内存的原因。
数据总线
数据总线的宽度决定了CPU的单个数据传输量,即数据传输速度(通常称为数据吞吐量)
8086数据总线的宽度为16,因此一次最多可以传输2个字节的数据
这是如何计算的?看照片

1Byte = 8bit
一个字节等于8位(8个二进制位),也就是说,8个数据总线可以形成8个二进制数据位,即一个字节数据,而16个数据总线可以形成2个字节数据
控制总线
控制总线的宽度决定了CPU控制其他设备的能力以及它可以进行多少种控制
接下来,进行一些计算:
1。 CPU的寻址能力为8KB,则其地址总线的宽度为____
2. 8080、8088、80286和80386的地址总线宽度分别为16、20、24和32。那么它们的寻址能力分别是____ KB,____ MB,____ MB,____ GB?

3. 8080,8088,8086,80286,80386具有8、8、16、16和32数据总线宽度。那么他们一次可以传输的数据是:____ B,____ B,____ B,____ B,____ B,
4.从内存中读取1024字节的数据,8086必须读取至少____次,80386必须读取至少____次。
我将答案放在底部
二:记忆



只了解这些图片,我们主要是在ARM(主存储器)中播放,我们不能在其他地方操作。
0x00000〜0x9FFFF:主存储器读写
0xA0000〜0xBFFFF:将数据写入视频存储器,图形卡将其输出到显示器。读写
0xC0000〜0xFFFFF:存储各种硬件和系统信息。只读
存储器地址空间的大小受CPU地址总线宽度的限制。 8086的地址总线宽度为20,可以定位(2 ^ 2 0)个不同的内存单元(内存地址范围0x00000〜0xFFFFF),因此8086的内存大小为1MB
如何计算相同的问题?
首先,0x代表十六进制,每个数字都是十六进制
然后0xFFFFF == 16 ^ 5 == 2 ^ 4 ^ 5 == 2 ^ 20 == 1MB(F等于十进制1 6)
如果您不理解上面的公式,可以,请继续阅读
三:十六进制
目前有4个主流基地
二进制:由两个符号组成(0 1)每两个输入一个
八进制:它由八个符号组成(0 1 2 3 4 5 6 7)每八个输入一个符号
十进制:由十个符号组成(0 1 2 3 4 5 6 7 8 9)每十个输入一个
十六进制:每个十六进制数包含十六个符号(0 1 2 3 4 5 6 7 8 9 a b c d e f)
扩展名:N元:由N个符号组成,每N个前移
注意:我在说符号!符号!换句话说,您可以使用任何数字和字母形成任何底数。有什么好处?两个词,安全。可以在基站上执行加密和安全性操作的高端产品,因此它扮演着更重要的角色!
例如:
我使用0 1 3 4 2 5 6 7 8 9形成一个十进制系统
那么1 + 1 =?
等于3
有人知道此时的“ 3”是真实的“ 3”吗?
这是十六进制加密的好处,安全!
十六进制的计算
总计算:
2 + 3 = __,2 * 3 = __,4 + 5 = __,4 * 5 = __。
277 + 333 = __,276 * 54 = __,237-54 = __,234/4 = __。

您可以数数。比较下面的运算表,这是一个神奇的工具,就像我们年轻时记住的99乘法表

碱基之间的比较

您了解碱基之间的转换吗?
二进制:写0到1111
0 0 0 1 1 1111
使用这种二进制文件太麻烦了,请将其更改为更简单的符号:
0 1 2 3 4 5 6 7 8 9 A B C D E F这是十六进制的
数据宽度

从数学上讲,数字的大小没有限制,并且可以无限大。但是,在计算机中,由于硬件限制,数据的长度受到限制(我们称为数据宽度),超过最大宽度的数据将被丢弃。
我会写一个示例,如果您有兴趣,可以在Xcode上运行它
int max(){
int max = 0x1FFFFFFFF
最大回报;
}
printf(“%x \ n”,max());
看看最后输出的max()函数的值。是我们分配的值吗?
计算机常见的数据宽度
位:1位是1个二进制位。 0或1
字节(字节):1个字节由8位(8位)组成。内存字节中的最小单位。
字:1个字由2个字节(16位)组成,这2个字节分别称为高字节和低字节。
双字:1个双字由两个字(32位)组成
计算机中存储的数据分为有符号和无符号数字。


四:注册
CPU的内部组件通过总线连接

对于我们程序员来说,CPU的最重要部分是寄存器,可以通过更改寄存器的内容来实现对CPU的控制。它的作用是临时存储数据。
CPU的计算速度非常快。为了提高性能,CPU在内部打开了一个小的临时存储区域,并且在计算过程中将陷阱数据从内存复制到了这个小的临时存储区域。在这个小的临时存储区域中,我们统称为这个小的临时存储区域
不同的CPU具有不同数量和结构的寄存器
此外,还有另一个概念缓存
iPhoneX上的ARM处理器A11具有64KB的主高速缓存容量和8MB的辅助高速缓存容量
CPU执行一条指令之前,需要将其从存储器中读取到CPU中并执行。寄存器的运算速度比存储器的读写速度快得多。为了提高性能,CPU还集成了一个高速缓存存储区。程序运行时,首先将要执行的指令代码和数据复制到缓存中(此步骤由操作系统完成)。 CPU直接按顺序从高速缓存中读取指令以执行它们。
内存地址和缓存之间存在的映射。当我们阅读指令时,无论pc寄存器指向谁,我们都会阅读它。当我们将PC的地址提供给CPU时,它实际上是在缓存中查找,因为它们是映射关系。
还有另一个问题:当高速缓存中的所有8MB地址都用完并且在高速缓存中找不到pc指向的地址时,我该怎么办?
请放心,因为这时,来自内存的cpoy副本将再次发送到缓存。实际上中间有一个缓存过程。
那么为什么不将整个存储体都放入一个缓存区呢?只能打开8MB?
效率越高,硬件越复杂,工艺要求就越高,成本也就越高!
1.通用寄存器
ARM64具有31个64位(每个寄存器是64位,CPU是64位)通用寄存器x0到x30,这些寄存器通常用于存储通用数据,成为通用寄存器(有时有特定用途)

嗯?是x0到x30吗?为什么只能达到x28?
注意:fp是x29,lr是x30
而且:sp我们通常将其称为x31,但它不是通用寄存器。

w0到w28是32位,但是64位CPU可以向下兼容32位,因此仅使用64位寄存器的低32位,例如w0是x0的低32位
您如何看待这些寄存器,打开Xcode,运行程序,断点并将其全部选中(本来是自动的)

通常,CPU首先将存储器中的数据存储到通用寄存器中,然后对通用寄存器中的数据执行操作
例如:
假设内存中有一个快速的红色空间,值是3,现在我想在其值上加1并将结果存储在蓝色的内存空间中

CPU首先将红色存储空间的值放入x0寄存器:
mov x0,红色存储空间(伪代码)
mov数据传输指令(相当于分配)
上面的伪代码意味着将红色空间的值移动到x0
在允许后将x0寄存器添加到1:将x0,1(伪代码)添加
添加添加指令
这意味着将x0的值加1,然后将其存储在x0中
最后将值分配给存储空间:mov blue存储空间,x0(伪代码)
我不想谈论这段代码的含义
注意:我们所有操作不能直接使用内存中的数据直接计算,必须将值放入寄存器中进行操作!操作结束后将其写入内存。
2. pc寄存器(程序计数器)
重点,非常有趣
是指令指针寄存器,指示当前要由CPU读取的指令的地址
在内存或磁盘中,指令和数据之间没有区别。它们都是二进制信息。
CPU工作时,会将某些信息视为指令,将某些信息视为数据,从而对同一信息赋予不同的含义
示例:
例如1 0 1010 1010
可用作数据0xE003008AA
它也可以用作指令mov x0,x8
CPU在什么基础上将内存信息视为指令?
CPU将pc指向的存储单元的内容作为指令处理
如果CPU中已执行了内存中的一条内容,则pc必定指向了该内容所在的存储单元
接下来,让我们演示一下这台有趣的电脑

我们现在在地址0x102b58bac处建立断点,对!
ni是一行,可以执行下一个操作
我之前说过可以通过更改寄存器的内容来实现对CPU的控制
然后立即更改
该寄存器的当前内容地址为0x102b58bac
现在我要更改

此代码寄存器写入pc 0x102b58b94
这意味着将当前pc寄存器的地址更改为0x102b58b94
我们执行ni项操作
嗯?
它没有在地址0x102b58bb0处执行下一个操作,而是转到了我们更改的内存地址。是不是“哦,莫西·罗伊”
3.数据地址寄存器
数据地址寄存器通常用于临时存储,累加,计数,地址保存和其他数据计算功能。定义这些寄存器的作用主要是用于将操作数保存在CPU指令中,并将它们用作CPU中的常规变量。
ARM64(CPU)
64位:X0-X30,XZR(零寄存器)
32位:W0-W30,WZR(零寄存器)
注意:Inter体系结构CPU段寄存器中有特殊的寄存器:CS,DS,SS,ES,主要用于存储这些段的基址。但是在ARM中没有。
4.浮点和向量寄存器
由于浮点数的存储和操作的特殊性,CPU专门提供了浮点寄存器来处理浮点数。
浮点数寄存器:
64位:D0-D31
32位:S0-S31
当前的CPU支持矢量运算(矢量运算在图形处理相关领域中非常多地使用)。通过支持向量计算,系统还提供了许多向量寄存器。
向量寄存器:
128位:V0-V31
5. SP和FP寄存器
sp寄存器将随时保存堆栈顶部的地址
fp寄存器也称为x29寄存器,它是通用寄存器,但是在某些时候我们使用它来保存堆栈底部的地址
另外:从ARM64开始,已取消了32位LDM,STM,PUSH和POP指令,并由ldr \ ldp str \ stp代替
ldr \ ldp str \ stp这些是内存读写指令
注意:读/写操作都是将数据读/写到高位地址
str(存储寄存器)指令
从寄存器中读取数据并将其存储在内存中
ldr(加载寄存器)指令
从内存中读取数据并将其存储在寄存器中
ldp和stp是str和ldr的两个变体指令
在ARM64中,堆栈上的操作是16字节对齐的
扩展名:什么是堆栈?
堆栈:遵循LIFO(LIFO)特殊访问方法的存储空间
什么是后进先出方法?
后进先出。最后一个进来了,第一个出来了
有一个不好的例子:
将羽毛球放入羽毛球管中,最后插入的羽毛球必须是第一个出来的羽毛球

5. bl指令
CPU执行指令的位置由PC的内容决定。我们可以通过更改pc的内容来控制CPU执行目标指令。
ARM64提供了一条mov指令(传输指令),可用于修改大多数寄存器的值
例如:
mov x0,#1 0、 mov x1,#20
在这里解释##
的含义
#其后是数字,它的概念称为“立即数”
立即数是多少?
这表示它代表数字,而不是符号!
您了解吗?在谈到基本系统时,我说的是0 1 2 ...这些是符号。
将#符号添加到前面后,它代表一个数字
因此mov x0,#10指令的意思是:将数字10放入x0
但是,mov指令不能用于设置pc的值,ARM64不提供此类功能
例如:mov pc,#0x102b58bb0该汇编指令有误,您不能这样写
ARM64提供了其他指令来修改PC的值。这些指令统称为传输指令。最简单的是bl指令
计算问题的答案
1.之前说过10条地址总线的寻址能力是1KB,那么8KB == 8 * 1 KB == 2 ^ 3 * 1KB == 2 ^ 3 * 2 ^ 10 B = 2 ^ 13 B
所以地址总线的宽度是13
2.相同的计算方法
a:2 ^ 16B ==(2 ^ 10B)^ 6 KB == 2 ^ 6 KB == 64KB
b:2 ^ 20B == 2 ^ 10 KB == 1MB
c:2 ^ 24B == b ^ 4 MB == 16MB
d:2 ^ 32B == 2 ^ 2 GB = 4GB(如上所述,30条地址总线的寻址能力为1GB)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-315542-1.html
他不是把军舰开去了吗
别说你双降就八连降我也只能喝粥