#include <stdio.h> int main(void) { int a = 75; long addrA = (long)&a; printf("%ld\n", addrA); return 0; }
|main| PROC |$LN3| stp fp,lr,[sp,#-0x20]! mov fp,sp mov w8,#0x4B str w8,[sp,#0x10] add x8,sp,#0x10 mov w8,w8 str w8,[sp,#0x14] ldr w1,[sp,#0x14] adrp x8,|$SG4983| add x0,x8,|$SG4983| bl printf mov w0,#0 ldp fp,lr,[sp],#0x20 ret
str w8,[sp,#0x14] としてるのは、先頭アドレスを保存しているっぽいね。
ポインタは
int main(void) { int a = 75; int* addrA = (void*)&a; printf("%p\n", addrA); return 0; }
|main| PROC |$LN3| stp fp,lr,[sp,#-0x20]! mov fp,sp mov w8,#0x4B str w8,[sp,#0x10] add x8,sp,#0x10 str x8,[sp,#0x18] ldr x1,[sp,#0x18] adrp x8,|$SG4983| add x0,x8,|$SG4983| bl printf mov w0,#0 ldp fp,lr,[sp],#0x20 ret
アドレス&aとポインタ*addrAはそれぞれメモリ上別の領域に格納されて、printfでは*addrAのアドレスが呼ばれていますね。
Cで困ったらコンパイルした後のアッセンブラを見れば良いのかな。