質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

1回答

2212閲覧

アセンブリ

strike1217

総合スコア651

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

2グッド

0クリップ

投稿2016/08/21 08:39

アセンブリ言語で質問があります。
C言語のプログラムをコンパイルした際に出てくるアセンブリ言語の一部なんですが、main()前の初期化の箇所で以下のような部分がありました。

main+3: and $0xfffffff0,%esp

このmain+3とはなんですか??
"and $0xfffffff0,%esp"の部分が何をしているのかわかりません。
x86でコンパイラはgccです。
英語の説明を読んだら、16byteにアライアメントしているとか・・なんとか・・
よくわからないんです。

mpyw, matobaa👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、「main+3」は、「mainの開始位置から3バイト目」という意味です。それ以前に3バイト分の何かがあると思います(x86命令は可変長なので少しわかりづらいですが)。

そして、その行のAND命令は、「ESPレジスタ(スタックポインタ)の下4ビットを0にする」という意味です。x86の取り扱うデータは整数が4バイト、doubleが8バイトありますが、これが4バイト・8バイトで割り切れないメモリに入ってしまうと大きく速度低下します(x86はどうにか動きますが、CPUによってはエラーで止まってしまうものすら存在します)。

ということで、関数に入ったところで、スタックをキリの良い位置に揃えることになります。x86の場合は、スタックがアドレスの小さい方に進むので、下位の数ビットをクリアすれば、ちょうどいい位置になります(8バイトでなくて16バイトに揃えている理由はよくわからないですが)。

投稿2016/08/21 12:02

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/08/21 12:08

下4bitのポインタ x 整数4byteで16byteってことですかね? なぜ4bitでアライアメントすることで速度低下を抑えられるのか、よくわからないです・・・
maisumakun

2016/08/21 12:14

CPUは1バイトずつではなく4バイトや8バイトなど、一定の単位でメモリをまとめて読み書きしますが、それが「4で割り切れるバイトから4バイト」というように固定となっているので、アドレスがずれると複数回読み書きが必要になって非効率となります。
strike1217

2016/08/22 03:14

ほぉおお 4の倍数に固定しているということですね。 x86のcpuアーキテクチャはキャッシュラインが16byteで固定のようですね。 0xfffffff0で32bitで、espレジスタも32bitなので「あああ〜〜」みたいな?? 感じですかね。 ポインタなので、最後の0で4bit、10進数で15なので、0〜15で16byte??? ですかね? 僕の予測・・・
yohhoy

2016/08/22 04:32 編集

スタックが16バイトアライメントされる理由は http://qiita.com/yohhoy/items/54633faf0546f8cd0e3a も参考にどうぞ。 また「and $0xfffffff0,%esp」の解釈を少し勘違いされているような?ここでは 下位4ビットを0でマスク=16の倍数に切り捨て演算 しています。C言語的に書くなら ((unsigned)(esp / 16) * 16) 相当の計算です。 余談ですがx86アーキテクチャではキャッシュラインサイズ64byteです。
strike1217

2016/08/22 08:41

x86アーキテクチャではキャッシュラインサイズ64byteなんですか? もっとよく調べてみますね! ”下位4ビットを0でマスク=16の倍数に切り捨て演算”ってところは「なるほど!」と思いました!!
strike1217

2016/08/22 08:43

4bit = 15 ---> (0 ~ 15)16ってことですね。 次の桁を0にすれば32ですね。 これで16の倍数ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問