通过汇编查看 指针到达是什么?
- 指针(包括多级指针): 就是 一个 地址编号 ;
- 内容:每个地址编号里面 都存储了东西;
通过下面的例子,可以很简单的了解
char a = 'A' ;其实 a 是 ‘A’的地址;
char * pa = &a ; pa 是 a的地址
int test() {
/**
左边的就是给我们程序员看的;
右边的 才是 真正操作的
*/
// mov w8, #0x41 ; w8 存储 ‘A’ 这个立即数
// strb w8, [sp, #0x2f] ; 把值 ‘A’ 存到 a = (sp + 0x2f); 可以看到 a 其实是 ‘A’的地址
char a = 'A';
// add x8, sp, #0x2f ; 取出 a (这个a其实是 ‘A’的地址)
// str x8, [sp, #0x20]; 将a 存储到 pa =(sp + 0x20) 这个地址
char * pa = &a;
// add x8, sp, #0x20 ; 取出 pa
// str x8, [sp, #0x18] ; 把 pa 存到 ppa =(sp + 0x18)
char ** ppa = &pa;
// ldr x8, [sp, #0x18]; 取出 ppa的内容 pa
// ldr x8, [x8]; 取出 pa 的内容 a
// str x8, [sp, #0x10]; a 存放到 pa2 =(sp - 0x10)的地址中
// char *pa2 = *ppa; => char *pa2 = &a;
char *pa2 = *ppa;
// ldr x8, [sp, #0x18] ; 取出 ppa,下面有两个指针,就自身取两次
// ldr x8, [x8]
// ldrb w8, [x8]
// strb w8, [sp, #0xf] ; 把w8 存储到 a2 =(sp + 0xf) 这个地址
char a2 = **ppa;
// ldr x8, [sp, #0x10];取出 pa2
// ldrb w8, [x8]; 把 pa2 的内容取出来
char a3 = *pa2;
return 0;
}