转载

ARM64汇编学习笔记一(初始汇编)

汇编语言的种类

  • 目前讨论比较多的汇编语言有:

        8086 汇编(8086处理器是16bit 的 CPU)

        Win32 汇编

        Win64 汇编

        ARM 汇编

架构设备
armv6iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4
armv7siPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64iPhone5S 以后 iPhoneX , iPad Air, iPad mini2

必要常识:

  • 首先了解 CPU 等硬件结构

  • APP/程序的执行过程

ARM64汇编学习笔记一(初始汇编)

  • 硬件相关的最为重要的是 CPU 和内存

  • 汇编中,大部分指令都是和 CPU、内存相关的

总线

ARM64汇编学习笔记一(初始汇编)

CPU正面-A11处理器

ARM64汇编学习笔记一(初始汇编)

CPU背面-管脚

  • 每一个 CPU 芯片都有许多管脚,这些管脚和总线相连,CPU 通过总线跟外部器件进行交互

  • 总线:一根根导线的集合

  • 总线的分类:

        地址总线-

            它的宽度决定了 CPU 的寻址能力

            8086的地址总线宽度是20,所以寻址能力是1M(2^20)

        数据总线

            它的宽度决定了 CPU 的单次数据传送量,也就是数据传送速度

            8086的数据总线宽度为16,所以单词最大传递2个字节的数据

        控制总线

            它的宽度决定了 CPU 对其他器件的控制能力、能有多少种控制

ARM64汇编学习笔记一(初始汇编)

内存

ARM64汇编学习笔记一(初始汇编)

各类存储区的逻辑连接

ARM64汇编学习笔记一(初始汇编)

各类存储器的逻辑连接-物理地址对应图

ARM64汇编学习笔记一(初始汇编)

各类存储器的物理地址情况

  • 内存地址空间的大小受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位)

寄存器

内部部件之间由总线连接

ARM64汇编学习笔记一(初始汇编)

对程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制

不同的CPU,寄存器的个数、结构是不相同的

通用寄存器

  • ARM64拥有有31个64位的通用寄存器 x0 到 x30,这些寄存器通常用来存放一般性的数据,称为通用寄存器(有时也有特定用途)

那么w0 到 w28 这些是32位的. 因为64位CPU可以兼容32位.所以可以只使用64位寄存器的低32位

比如 w0 就是 x0的低32位

ARM64汇编学习笔记一(初始汇编)

通常,CPU会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算

假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间

ARM64汇编学习笔记一(初始汇编)

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

正文到此结束
Loading...