美文网首页
ARM64汇编学习笔记一(初始汇编)

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

作者: 7c205247047d | 来源:发表于2018-04-23 15:27 被阅读0次

    汇编语言的种类

    • 目前讨论比较多的汇编语言有:
      • 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指令

    相关文章

      网友评论

          本文标题:ARM64汇编学习笔记一(初始汇编)

          本文链接:https://www.haomeiwen.com/subject/ryfllftx.html