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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1497閲覧

プログラミングについて

strike1217

総合スコア651

アセンブリ言語

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/06/30 11:09

C++とアセンブラについて質問があります。

int(table[])(void) = {
destiny, tree, green, you ...
};

tableEAX;

and $0xfffffff0, %esp
sub $0x10, %esp

EAX, esp はレジスタです。
この2つのプログラムの意味が分かりません。
特に上のC++のプログラムの記述法がなんなのかわかりません。
ラムダ関数とは少し違うみたいなんですが・・・・
おしえてください。

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

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

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

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

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

cateye

2016/06/30 11:24

C++、アセンブラとも一部を抜き出さずにひとまとまりのソースを提示してください。また、環境(OSやコンパイラ)も教えてください。 and $0xfffffff0, %esp sub $0x10, %esp については、スタックポインタの操作であることはわかりますが、前後がなければ意味が分かりません。
guest

回答2

0

ベストアンサー

こんにちは。

C

1int(table[])(void) = { 2destiny, tree, green, you ... 3};

は、雰囲気的に関数ポインタ配列と思います。しかし、私の知る限りでは、下記のように記述します。

C

1int(*table[])(void) = { 2destiny, tree, green, you ... 3};

table[i]が引数なしでintを返す関数へのポインタですね。
そして、tablei;でその配列のi番目の関数を呼び出します。

table[0]();destiny();と同じ処理になります。

tableEAX;

このような記述ができる処理系を知りませんが、レジスタEAXの値に従って関数を呼び出しているのかも知れません。

コンパイラは何でしょうか?

and $0xfffffff0, %esp
sub $0x10, %esp

これだけでは分かりませんが、16バイトのローカル変数領域を確保するコードかも知れません。
gccは16バイト・アラインを必ず確保するような話を聞いた気がします。最初の行はその16バイト・アライン調整のようにも見えます。
次の行は16バイトのスタック領域を確保しています。

投稿2016/06/30 11:55

Chironian

総合スコア23272

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

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

strike1217

2016/06/30 12:30

ありがとうございます!! すいません。*table[]でした。間違えました。すいません。 アセンブラの方は「16バイト確保する」と書いてあるんです。 すごいです! しかし、なぜ、この記述で16バイト確保できるのかわからないんです。
Chironian

2016/06/30 12:42

スタックの仕組みはご存知でしょうか? もし、ご存知なければ↓は参考になりそうです。 http://www.kumikomi.net/archives/2008/07/15stack.php?page=4 https://www.uquest.co.jp/embedded/learning/lecture07-2.html sub %0x10, %esp にて、スタック・ポインタから16引いています。 これにより、スタック・エリアに16バイトの空きが発生します。 単に無駄に空けることが目的ということはあまりないので、16バイトのローカル変数を確保している可能性が高いと思います。
mugicya

2016/07/02 00:06 編集

esp ってのはスタックなんですね。 私はコードでスタック操作とか恐ろしくてできんです。
strike1217

2016/07/09 03:29

返事が遅れました。 分かりやすくて助かります。 ありがとうございました
guest

0

and $0xfffffff0, %esp
sub $0x10, %esp

and は論理和 sub は減算。
C++のコードとニーモニックの関連性は質問から見出せませんが、
and は esp の中身の4ビットのみのこして、どっかに入れているのかな。
Z80あたりでいうと、結果をAレジスタとかに入れてるのだと思うけれど。
sub は見たまんま、esp、%の意味は分かりかねるけど、(間接アドレッシングモードとか?)
16ひいて、これも決まったレジスタに格納しているだけだね。

投稿2016/07/02 00:04

mugicya

総合スコア1046

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問