cポインタとassembler

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