iOS汇编基础(四)指针

作者: meryin | 来源:发表于2018-05-03 16:00 被阅读14次

    一 基本运算

    1. 加法

    int* a;
    a=(int*)100;
    a++;
    printf("%d",a);
    

    运行结果为:104
    a为指向int类型的指针,a++相当于指针偏移寻找下一个int,int在64位占4个字节,所以a++是104

    char** a;
    a=(char**)100;
    a++;
    

    运行结果为108
    a为指向指针的指针,指针偏移,64位中指针占8个字节,所以结果为108

    2. 减法

    int* a;
    a=(int*)100;
    int* b;
    b=(int*)300;
    printf("%d", a-b);
    

    运行结果为-50
    因为 a和b都是指向int的指针,指针减法是要让结果除以数据类型的宽度,int类型宽度为4

     int** a;
     a=(int**)100;
     int** b;
     b=(int**)300;
     printf("%d", a-b);
    

    运行结果为-25
    因为a为指针类型,指针类型占8个字节

    int* a;
    a=(int*)100;
    int c = a-99;
    printf("%d", c);
    

    运行结果为-296

    • 指针的加减运算本质上是指针偏移,寻找下一个地址或上一个地址
    • 指针求差,得到的结果是整形,其结果和指针指向的数据类型宽度有关
    • 指针的运算单位是数据类型的宽度

    3. 取值

    int arr[5] = {1,2,3,4,5};
    for (int i=0; i<5; i++) {
        printf("%d ",*(arr+i));
    }
    //运行结果为 1 2 3 4 5
    

    arr为数组首地址,指针偏移依次取出每一个值
    以上代码可以这样写:

    int arr[5] = {1,2,3,4,5};
        int* a=arr;
        for (int i=0; i<5; i++) {
            printf("%d ",*(a));
            a++;
        }
    

    还可以这样:

    int arr[5] = {1,2,3,4,5};
        for (int i=0; i<5; i++) {
            printf("%d ",arr[i]);
        }
    

    二 指针的汇编

    1. 一级指针

    int* p1;           //  ldur   x8, [x29, #-0x8]
     int c = *p1;      // ldr    w9, [x8]
    

    把这块内存 [x29, #-0x8]给x8;然后x8的值给w9

    2. 二级指针

     int** p1;    //ldur   x8, [x29, #-0x8]
     int c = **p1;    // ldr    x8, [x8];  ldr    w9, [x8]
    

    把[x29, #-0x8]这块内存给x8;然后x8存的是指向指针的指针。ldr x8, [x8]取出x8的值,还是指针赋给x8;ldr w9, [x8]取出x8的值赋给w9为int类型。

    3. 指针偏移

    char** p1;   //  ldr    x8, [sp, #0x8]
    char c = *(*(p1 + 1) + 2);
    

    *(p1 + 1)是指针的指针偏移一个单位,宽度为8个字节,所以汇编代码为:ldr x8, [x8, #0x8]; ((p1 + 1) + 2) char的宽度是1所以汇编代码为ldrb w9, [x8, #0x2]

    相关文章

      网友评论

        本文标题:iOS汇编基础(四)指针

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