[arm64]5、指针

作者: 史记_d5da | 来源:发表于2021-12-12 13:36 被阅读0次

1、指针的基本操作

1.1、指针相加减

1、指针变量加减

void func() {
    int *a;
    a = (int *)100;
    a ++; // 指针的自增自减和执行的数据类型的宽度有关!
    printf("%d", &a); // 104
}
void func() {
    int *a;
    a = (int *)100;
    int *b;
    b = (int *)200;
    int x = a - b;// 指针的运算单位是执行的数据类型的宽度!!
    printf("%d", x); // 25
}

2、指针的指针加减

void func() {
    int **a;
    a = (int **)100;
    a ++;  
    printf("%d", &a); // 108
}
1.2、指针的汇编
void func(){
    int *a;
    int b = 10;
    a = &b;
}
    0x102f1df90 <+0>:  sub    sp, sp, #0x10             ; =0x10 
// 将 0x4+sp的地址赋值给x8寄存器 == int * a
    0x102f1df94 <+4>:  add    x8, sp, #0x4              ; =0x4 
// int b = 10
    0x102f1df98 <+8>:  mov    w9, #0xa 
// 将w9=10的内容存放到 0x4 + sp的内存中
->  0x102f1df9c <+12>: str    w9, [sp, #0x4]
// 将x8寄存器的值存放到了0x8+sp中
    0x102f1dfa0 <+16>: str    x8, [sp, #0x8]
    0x102f1dfa4 <+20>: add    sp, sp, #0x10             ; =0x10 
    0x102f1dfa8 <+24>: ret    
指针
1.3、空指针异常
void func(){
    char *a;
    char c = *a;
}
    0x102dedf94 <+0>:  sub    sp, sp, #0x10             ; =0x10 
    0x102dedf98 <+4>:  ldr    x8, [sp, #0x8]
// x8寄存器的地址值并不存在
->  0x102dedf9c <+8>:  ldrb   w8, [x8]
    0x102dedfa0 <+12>: strb   w8, [sp, #0x7]
    0x102dedfa4 <+16>: add    sp, sp, #0x10             ; =0x10 
    0x102dedfa8 <+20>: ret    
错误提示
1.4、二级指针

1、地址分析

void func(){
    char **a;
    char c = **a;
}
    0x102271f90 <+0>:  sub    sp, sp, #0x10             ; =0x10 
    0x102271f94 <+4>:  ldr    x8, [sp, #0x8]
// 第一次取地址
->  0x102271f98 <+8>:  ldr    x8, [x8]
// 第二次取地址
    0x102271f9c <+12>: ldrb   w8, [x8]
    0x102271fa0 <+16>: strb   w8, [sp, #0x7]
    0x102271fa4 <+20>: add    sp, sp, #0x10             ; =0x10 
    0x102271fa8 <+24>: ret    

2、内存分析

void func(){
    char **a;
    char c = *(*(a + 2) + 2);
}
    0x100cf1f90 <+0>:  sub    sp, sp, #0x10             ; =0x10 
    0x100cf1f94 <+4>:  ldr    x8, [sp, #0x8]
// *(a + 2) a为指针 0x10= 16= 2*8
->  0x100cf1f98 <+8>:  ldr    x8, [x8, #0x10]
// *(a + 2) + 2其中 *(a + 2)为char类型相加
    0x100cf1f9c <+12>: ldrb   w8, [x8, #0x2]
    0x100cf1fa0 <+16>: strb   w8, [sp, #0x7]
    0x100cf1fa4 <+20>: add    sp, sp, #0x10             ; =0x10 
    0x100cf1fa8 <+24>: ret  

相关文章

  • [arm64]5、指针

    1、指针的基本操作 1.1、指针相加减 1、指针变量加减 2、指针的指针加减 1.2、指针的汇编 1.3、空指针异...

  • Runtime(一)

    isa 在arm64 之前,isa就是一个普通的指针,它指向classormeta-class 在arm64之后,...

  • dealloc源码解读

    isa指针 在看dealloc源码之前, 首先要了解isa指针 在arm64架构之前,isa就是一个普通的指针,存...

  • runtime-isa

    在arm64架构之前,isa就是一普通指针,存储着class,meta-class对象的地址 从arm64架构开始...

  • iOS底层 -- Runtime之isa底层结构

    在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址从arm64架...

  • isa详解

    在arm64架构之前,isa就是一个普通的指针,存储着Class或Meta-Class对象的内存地址。arm64架...

  • 对isa的理解

    在arm64位之前就是个普通的指针,里面存储这类对象还有元类对象地址值,在arm64位开始,进行了优化,采用uni...

  • iOS 如何获取真正isa指针的地址

    isa指针 从runtime源码来看:runtime源码 arm64 之后instance获取到class的isa...

  • 【iOS-RunTime系列二】isa指针

    runTime底层的一些常用数据结构,比如isa指针; arm64之前,isa就是一个普通的指针,存储着Class...

  • Runtime之isa详解

    isa 概念 isa是相当于是OC对象的一个标识指针,只要是OC对象就一定会有isa指针,arm64之前isa就是...

网友评论

    本文标题:[arm64]5、指针

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