美文共赏

[arm64]5、指针

2021-12-12  本文已影响0人  史记_d5da

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  
上一篇 下一篇

猜你喜欢

热点阅读