#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で困ったらコンパイルした後のアッセンブラを見れば良いのかな。