在汇编代码执行过程当中少不了两个东西一个是进制
,一个是寄存器
。xcode
八进制
由8个符号组成:0 1 2 3 4 5 6 7 逢八
进一
十进制
由10个符号组成:0 1 2 3 4 5 6 7 8 9逢十
进一
N进制
就是由N个符号组成:逢N
进一
那咱们想一下在哪一种状况下1加1能够等于3
? 若是定义十进制由10个符号组成: 0 1 3 5 8 A B F S 6 逢十进一。注意这里的0、一、3只是一种符号。这种状况下1 + 1 = 3,是否是颇有意思。想想咱们还能够定义本身的一套进制规则,能够用来加密✌️。 如下为八进制加法表缓存
0 1 2 3 4 5 6 7
10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27
...
1+1 = 2
1+2 = 3 2+2 = 4
1+3 = 4 2+3 = 5 3+3 = 6
1+4 = 5 2+4 = 6 3+4 = 7 4+4 = 10
1+5 = 6 2+5 = 7 3+5 = 10 4+5 = 11 5+5 = 12
1+6 = 7 2+6 = 10 3+6 = 11 4+6 = 12 5+6 = 13 6+6 = 14
1+7 = 10 2+7 = 11 3+7 = 12 4+7 = 13 5+7 = 14 6+7 = 15 7+7 = 16
复制代码
如下为八进制乘法表markdown
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27...
1*1 = 1
1*2 = 2 2*2 = 4
1*3 = 3 2*3 = 6 3*3 = 11
1*4 = 4 2*4 = 10 3*4 = 14 4*4 = 20
1*5 = 5 2*5 = 12 3*5 = 17 4*5 = 24 5*5 = 31
1*6 = 6 2*6 = 14 3*6 = 22 4*6 = 30 5*6 = 36 6*6 = 44
1*7 = 7 2*7 = 16 3*7 = 25 4*7 = 34 5*7 = 43 6*7 = 52 7*7 = 61
复制代码
二进制: 1 0 1 1 1 0 1 1 1 1 0 0
三个二进制一组: 101 110 111 100
八进制: 5 6 7 4
四个二进制一组: 1011 1011 1100
十六进制: b b c
复制代码
二进制
:从0 写到 1111。0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 这种二进制使用起来太麻烦,改为更简单一点的符号:0 1 2 3 4 5 6 7 8 9 A B C D E F 这就是十六进制
了。架构
数学上的数字,是没有大小限制的,能够无限的大。但在计算机中,因为受硬件的制约,数据都是有长度限制的(咱们称为数据宽度),超过最多宽度的数据会被丢弃。性能
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int test(){
int temp = 0x1FFFFFFFF;
return temp;
}
int main(int argc, char * argv[]) {
printf("%x\n",test());
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
复制代码
一、位(Bit): 1个位就是1个二进制位.0或者1 二、字节(Byte): 1个字节由8个Bit组成(8位).内存中的最小单元Byte 三、字(Word): 1个字由2个字节组成(16位),这2个字节分别称为高字节和低字节 四、双字(Doubleword): 1个双字由两个字组成(32位)加密
上图为内部部件之间由总线链接示意图。
CPU
除了有控制器
、运算器
还有寄存器
。其中寄存器
的做用就是进行数据的临时存储。CPU的运算速度是很是快的,为了性能CPU在内部开辟一小块临时存储区域,并在进行运算时先将数据从内存复制到这一小块临时存储区域中,运算时就在这一小快临时存储区域内进行。咱们称这一小块临时存储区域为寄存器
。对于arm64
系的CPU来讲, 若是寄存器以x
开头则代表的是一个64位
的寄存器,若是以w
开头则代表是一个32位
的寄存器,在系统中没有提供16位和8位的寄存器供访问和使用。其中32位的寄存器是64位寄存器的低32位部分并非独立存在的。CPU中最主要部件是寄存器
,能够经过改变寄存器的内容来实现对CPU的控制,不一样的CPU,寄存器的个数、结构是不相同的。spa
浮点数的存储以及其运算的特殊性,CPU中专门提供浮点数寄存器来处理浮点数。浮点寄存器
64位: D0 - D31 32位: S0 - S31。如今的CPU支持向量运算
(向量运算在图形处理相关的领域用得很是的多)为了支持向量计算系统了也提供了众多的向量寄存器
。向量寄存器
128位:V0-V31。操作系统
通用寄存器
也称数据地址寄存器
一般用来作数据计算的临时存储、作累加、计数、地址保存等功能。定义这些寄存器的做用主要是用于在CPU指令中保存操做数,在CPU中当作一些常规变量来使用。ARM64拥有有32个64位的通用寄存器 x0
到 x30
,以及XZR(零寄存器),这些通用寄存器有时也有特定用途。那么w0
到 w28
这些是32位
的.。由于64位CPU能够兼容32位,因此能够只使用64位寄存器的低32位。好比 w0
就是 x0
的低32位。在8086汇编中有一种特殊的寄存器段寄存器:CS、DS、SS、ES四个寄存器来保存这些段的基地址,这个属于Intel架构CPU中,在ARM中并无。在xcode断点调试过程当中能够直观的看到寄存器的内存地址。 CPU是如何处理数据的运算的呢?
CPU会先将内存中的数据存储到通用寄存器中,而后再对通用寄存器中的数据进行运算。例如假设内存中有块绿色内存空间的值是3,如今想把它的值加1,并将结果存储到黄色内存空间。 CPU其实进行了以下操做 一、CPU首先会将绿色内存空间的值放到X0寄存器中:
mov
X0, 绿色内存空间 二、而后让X0寄存器与1相加:add
X0, 1 三、最后将值赋值给内存空间:mov
黄色内存空间, X03d
pc寄存器
为指令指针寄存器,它指示了CPU
当前要读取指令的地址。在内存或者磁盘上,指令
和数据
没有任何区别,都是二进制信息。CPU在工做的时候把有的信息看作指令,有的信息看作数据,为一样的信息赋予了不一样的意义。好比 1110 0000 0000 0011 0000 1000 1010 1010
。能够当作数据 0xE003008AA
。也能够当作指令 mov x0, x8
。CPU将pc指向的内存单元的内容看作指令。若是内存中的某段内容曾被CPU执行过,那么它所在的内存单元必然被pc指向过。CPU每执行一条指令前都须要从内存中将指令读取到CPU内并执行。而寄存器的运行速度相比内存读写要快不少,为了性能,CPU还集成了一个高速缓存存储区域
。当程序在运行时,先将要执行的指令代码以及数据复制到高速缓存中去(由操做系统完成),CPU直接从高速缓存依次读取指令来执行。iPhoneX上搭载的ARM处理器A11它的1级缓存的容量是64KB,2级缓存的容量8M。指针
CPU从何处执行指令是由pc寄存器
中的内容决定的,咱们能够经过改变pc寄存器
的内容来控制CPU执行目标指令。ARM64提供了一个mov指令
(传送指令),能够用来修改大部分寄存器的值,好比 mov x0,#10
、mov x1,#20
。可是,mov
指令不能用于设置pc寄存器
的值,ARM64
没有提供这样的功能。ARM64
提供了另外的指令来修改pc寄存器
的值,这些指令统称为转移指令
,最简单的是bl
指令。 bl做用:
lr寄存器
。lr寄存器
后面接的地址是汇编执行过程当中回来的路。