汇编语言的种类
目前讨论比较多的汇编语言有:
8086 汇编(8086处理器是16bit 的 CPU)
Win32 汇编
Win64 汇编
ARM 汇编
架构 | 设备 |
armv6 | iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch |
armv7 | iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4 |
armv7s | iPhone5, iPhone5C, iPad4(iPad with Retina Display) |
arm64 | iPhone5S 以后 iPhoneX , iPad Air, iPad mini2 |
必要常识:
首先了解 CPU 等硬件结构
APP/程序的执行过程
硬件相关的最为重要的是 CPU 和内存
汇编中,大部分指令都是和 CPU、内存相关的
总线
CPU正面-A11处理器
CPU背面-管脚
每一个 CPU 芯片都有许多管脚,这些管脚和总线相连,CPU 通过总线跟外部器件进行交互
总线:一根根导线的集合
总线的分类:
地址总线-
它的宽度决定了 CPU 的寻址能力
8086的地址总线宽度是20,所以寻址能力是1M(2^20)
数据总线
它的宽度决定了 CPU 的单次数据传送量,也就是数据传送速度
8086的数据总线宽度为16,所以单词最大传递2个字节的数据
控制总线
它的宽度决定了 CPU 对其他器件的控制能力、能有多少种控制
内存
各类存储区的逻辑连接
各类存储器的逻辑连接-物理地址对应图
各类存储器的物理地址情况
内存地址空间的大小受CPU地址总线宽度的限制。8086的地址总线宽度为20,可以定位2^20个不同的内存单元(内存地址范围0x00000~0xFFFFF),所以8086的内存空间大小为1MB
0x00000~0x9FFFF:主存储器。可读可写
0xA0000~0xBFFFF:向显存中写入数据,这些数据会被显卡输出到显示器。可读可写
0xC0000~0xFFFFF:存储各种硬件/系统信息。只读
数据的宽度
数学上的数字,是没有大小限制的,可以无限的大。但在计算机中,由于受硬件的制约,数据都是有长度限制的(我们称为数据宽度),超过最多宽度的数据会被丢弃。
#import #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拥有有31个64位的通用寄存器 x0 到 x30,这些寄存器通常用来存放一般性的数据,称为通用寄存器(有时也有特定用途)
那么w0 到 w28 这些是32位的. 因为64位CPU可以兼容32位.所以可以只使用64位寄存器的低32位
比如 w0 就是 x0的低32位
通常,CPU会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算
假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间
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指令
作者:原_子_弹
链接:https://www.jianshu.com/p/75b224c4fcc