![e098f9c01ab81be5873a2908cf0fc603.png](https://i-blog.csdnimg.cn/blog_migrate/d2d1f93b3eb4c2af5986ecdbef10dadb.jpeg)
寄存器
内部部件之间由总线连接
![6c789aef03208434ba09096f76b54483.png](https://i-blog.csdnimg.cn/blog_migrate/edd38ccb6ade410cfe8c8fbaecf6a794.jpeg)
- 对程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制
- 不同的CPU,寄存器的个数、结构是不相同的
通用寄存器
- ARM64拥有有31个64位的通用寄存器 x0 到 x30,这些寄存器通常用来存放一般性的数据,称为通用寄存器(有时也有特定用途)
- 那么w0 到 w28 这些是32位的. 因为64位CPU可以兼容32位.所以可以只使用64位寄存器的低32位.
- 比如 w0 就是 x0的低32位!
![3c675c477c92d620030f626f523cc305.png](https://i-blog.csdnimg.cn/blog_migrate/1a4a5f1d1e674ed2c72c1c9255d7933e.jpeg)
- 通常,CPU会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算
- 假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间
![b10ac422d155624971f8c8687004b6d9.png](https://i-blog.csdnimg.cn/blog_migrate/b70b5346e7b5ce8b2246621de7279055.jpeg)
- CPU首先会将红色内存空间的值放到X0寄存器中:mov X0,红色内存空间
- 然后让X0寄存器与1相加:add X0,1
- 最后将值赋值给内存空间:mov 蓝色内存空间,X0
pc寄存器(program counter)
- 为指令指针寄存器,它指示了CPU当前要读取指令的地址
- 在内存或者磁盘上,指令和数据没有任何区别,都是二进制信息
- CPU在工作的时候把有的信息看做指令,有的信息看做数据,为同样的信息赋予了不同的意义
- 比如 1110 0000 0000 0011 0000 1000 1010 1010
- 可以当做数据 0xE003008AA
- 也可以当做指令 mov x0, x8
CPU根据什么将内存中的信息看做指令?
- CPU将pc指向的内存单元的内容看做指令
- 如果内存中的某段内容曾被CPU执行过,那么它所在的内存单元必然被pc指向过
bl指令
- CPU从何处执行指令是由pc中的内容决定的,我们可以通过改变pc的内容来控制CPU执行目标指令
- ARM64提供了一个mov指令(传送指令),可以用来修改大部分寄存器的值,比如
- mov x0,#10、mov x1,#20
- 但是,mov指令不能用于设置pc的值,ARM64没有提供这样的功能
- ARM64提供了另外的指令来修改PC的值,这些指令统称为转移指令,最简单的是bl指令
bl指令 -- 练习
现在有两段代码!假设程序先执行A,请写出指令执行顺序.最终寄存器x0的值是多少?
![7f83f5880d875a46a7c5ac189cabe99e.png](https://i-blog.csdnimg.cn/blog_migrate/dacb24a9091d9645729635307c09245c.jpeg)