c
1int main() { 2 int *a; 3 int b; 4 b = 1; 5 a = &b; 6}
C言語で上記のコードを実行するとき
アセンブラでは
assembly
1main: 2 push rbp 3 mov rbp, rsp 4 mov DWORD PTR [rbp-12], 1 5 lea rax, [rbp-12] 6 mov QWORD PTR [rbp-8], rax 7 mov eax, 0 8 pop rbp 9 ret
と実行されます.
この時のメモリの動きを考えていたのですが,
※aのアドレス値と書かれていますがaを示すためのbのアドレス値が格納されている?
この写真のようにポインタ型のメモリ領域がまず確保されてその後にint型で定義されたもの(int b)という順番でスタックされていくという認識で良いのでしょうか?ポインタなしで処理をした場合
c
1int main() { 2 int a; 3 int b; 4 5 b = 1; 6 a = b; 7}
assembly
1main: 2 push rbp 3 mov rbp, rsp 4 mov DWORD PTR [rbp-4], 1 5 mov eax, DWORD PTR [rbp-4] 6 mov DWORD PTR [rbp-8], eax 7 mov eax, 0 8 pop rbp 9 ret
のように実行され2つを見比べるとポインタがついている変数が優先的に実行されかつポインタ変数は4byte, int型で4byte 計8byteがメモリが消費されスタック順としては変数, pointと順番を並べるとアドレス値の辻褄が合う気がするのですがどうなのでしょうか?アセンブラは初めて質問自体が根本的に間違えている可能性もありますがどうか教えていただけると幸いです.
回答2件