1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

変数初期化のアセンブリ一例

Last updated at Posted at 2021-01-13

#変数初期化のアセンブリ一例

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
1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?