美文网首页
汇编探索(二)

汇编探索(二)

作者: 沉淀纷飞 | 来源:发表于2021-08-06 11:59 被阅读0次

      在汇编代码执行过程中少不了两个东西一个是进制,一个是寄存器

    进制

    • 八进制由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、1、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
    

    以下为八进制乘法表

    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]));
        }
    }
    
    • 常见的数据宽度
      1、位(Bit): 1个位就是1个二进制位.0或者1
      2、字节(Byte): 1个字节由8个Bit组成(8位).内存中的最小单元Byte
      3、字(Word): 1个字由2个字节组成(16位),这2个字节分别称为高字节和低字节
      4、双字(Doubleword): 1个双字由两个字组成(32位)

    寄存器


      上图为内部部件之间由总线连接示意图。CPU除了有控制器运算器还有寄存器。其中寄存器的作用就是进行数据的临时存储。CPU的运算速度是非常快的,为了性能CPU在内部开辟一小块临时存储区域,并在进行运算时先将数据从内存复制到这一小块临时存储区域中,运算时就在这一小快临时存储区域内进行。我们称这一小块临时存储区域为寄存器。对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如果以w开头则表明是一个32位的寄存器,在系统中没有提供16位和8位的寄存器供访问和使用。其中32位的寄存器是64位寄存器的低32位部分并不是独立存在的。CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制,不同的CPU,寄存器的个数、结构是不相同的。
    • 浮点和向量寄存器
        浮点数的存储以及其运算的特殊性,CPU中专门提供浮点数寄存器来处理浮点数。浮点寄存器 64位: D0 - D31 32位: S0 - S31。现在的CPU支持向量运算(向量运算在图形处理相关的领域用得非常的多)为了支持向量计算系统了也提供了众多的向量寄存器向量寄存器 128位:V0-V31。
    • 通用寄存器
         通用寄存器也称数据地址寄存器通常用来做数据计算的临时存储、做累加、计数、地址保存等功能。定义这些寄存器的作用主要是用于在CPU指令中保存操作数,在CPU中当做一些常规变量来使用。ARM64拥有有32个64位的通用寄存器 x0x30,以及XZR(零寄存器),这些通用寄存器有时也有特定用途。那么w0w28 这些是32位的.。因为64位CPU可以兼容32位,所以可以只使用64位寄存器的低32位。比如 w0就是 x0的低32位。在8086汇编中有一种特殊的寄存器段寄存器:CS、DS、SS、ES四个寄存器来保存这些段的基地址,这个属于Intel架构CPU中,在ARM中并没有。在xcode断点调试过程中可以直观的看到寄存器的内存地址。

        CPU是如何处理数据的运算的呢?
        CPU会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算。例如假设内存中有块绿色内存空间的值是3,现在想把它的值加1,并将结果存储到黄色内存空间。

      CPU其实进行了如下操作
      1、CPU首先会将绿色内存空间的值放到X0寄存器中: mov X0, 绿色内存空间
      2、然后让X0寄存器与1相加:add X0, 1
      3、最后将值赋值给内存空间:mov 黄色内存空间, X0

    pc寄存器

       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。

    • bl指令
        CPU从何处执行指令是由pc寄存器中的内容决定的,我们可以通过改变pc寄存器的内容来控制CPU执行目标指令。ARM64提供了一个mov指令(传送指令),可以用来修改大部分寄存器的值,比如
      mov x0,#10mov x1,#20。但是,mov指令不能用于设置pc寄存器的值,ARM64没有提供这样的功能。ARM64提供了另外的指令来修改pc寄存器的值,这些指令统称为转移指令,最简单的是bl指令。
      bl作用:
    • 跳转到标号处执行
    • 将下一条指令地址放进lr寄存器lr寄存器 后面接的地址是汇编执行过程中回来的路。

    相关文章

      网友评论

          本文标题:汇编探索(二)

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