汇编语言的种类
- 目前讨论比较多的汇编语言有:
- 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/程序的执行过程 15193672391363.jpg
- 硬件相关的最为重要的是 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 <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拥有有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指令
网友评论