通過匯編查看 指針到達(dá)是什么?
- 指針(包括多級指針): 就是 一個 地址編號 ;
- 內(nèi)容:每個地址編號里面 都存儲了東西;
通過下面的例子,可以很簡單的了解
char a = 'A' ;其實 a 是 ‘A’的地址;char * pa = &a ; pa 是 a的地址
int test() {
/**
左邊的就是給我們程序員看的;
右邊的 才是 真正操作的
*/
// mov w8, #0x41 ; w8 存儲 ‘A’ 這個立即數(shù)
// 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的內(nèi)容 pa
// ldr x8, [x8]; 取出 pa 的內(nèi)容 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 的內(nèi)容取出來
char a3 = *pa2;
return 0;
}