#変数初期化のアセンブリ一例
C言語における変数初期化のアセンブリの一例です(自分メモ)。
諸々の設定によりアセンブリは変わります。
・x86-64 gcc 10.2
・確認環境:Compiler Explorer
32ビット以下は簡単。
C言語
// 32bit以下
int i = 100;
char c = 'a';
bool b = true;
long l_1 = 100;
char str_1[] = "aaa";
アセンブラ
mov DWORD PTR [rbp-4], 100
mov BYTE PTR [rbp-5], 61h
mov BYTE PTR [rbp-6], 1
mov QWORD PTR [rbp-16], 100
mov DWORD PTR [rbp-20], 616161h
32ビットを超えるとレジスタを使い始める。
※movabs、movsdは、ざっくりmovと同じと考えてよい。
※doubleの詳細はWikipedia参照
C言語
// 32bit~64bit
long l_2 = 9223372036854775807;
char str_2[] = "aaaaaaa";
double d = 3.14;
アセンブラ
movabs rax, 9223372036854775807
mov QWORD PTR [rbp-8], rax
movabs rax, 61616161616161h
mov QWORD PTR [rbp-24], rax
movsd xmm0, QWORD PTR .LC0[rip]
movsd QWORD PTR [rbp-16], xmm0
.LC0:
.long 1374389535
.long 1074339512
一見、32ビット超えても以下でいいんじゃないかと思うが、
アセンブラ
mov QWORD PTR [rbp-8], 9223372036854775807
以下を見ると納得。
C言語
// 64bit~
char str_3[] = "aaaabbbbccccddddeeeeffffgggghhhh";
アセンブラ
movabs rax, 6262626261616161h
movabs rdx, 6464646463636363h
mov QWORD PTR [rbp-48], rax
mov QWORD PTR [rbp-40], rdx
movabs rax, 6666666665656565h
movabs rdx, 6868686867676767h
mov QWORD PTR [rbp-32], rax
mov QWORD PTR [rbp-24], rdx
mov BYTE PTR [rbp-16], 0
ちなみに、文字数により最後のアセンブリは変わる。
アセンブラ
movabs rax, 6262626261616161h
mov QWORD PTR [rbp-12], rax
mov DWORD PTR [rbp-4], 636363h