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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1556閲覧

アセンブラについてです

cch4n

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/05/19 13:43

逆アセンブラについてです。
AMD64 ATT表記法です。

逆アセンブリ結果のmainが
00000000004003c0 <main>:
4003c0: 48 b8 0f 0e 0d 0b 00 movabs $0xc0601000b0d0e0f,%rax
4003c7: 01 06 0c
4003ca: 83 ff 02    cmp $0x2,%edi
4003cd: 48 89 44 24 f0 mov %rax,-0x10(%rsp)
4003d2: 48 b8 04 05 08 0a 02 movabs $0x70903020a080504,%rax
4003d9: 03 09 07
4003dc: 48 89 44 24 f8 mov %rax,-0x8(%rsp)
4003e1: b8 01 00 00 00 mov $0x1,%eax
4003e6: 75 59 jne 400441 <main+0x81>
4003e8: 48 8b 56 08 mov 0x8(%rsi),%rdx
4003ec: 31 c0 xor %eax,%eax

4003caの%ediレジスタにmain関数第一引数が入っていて、2個(1個)あるか比較していて
第2引数はrsi+8 つまり文字列の先頭がここに入ってると考えているのですが、あってますでしょうか。
また4003c0や4003d2などはメモリアドレスをそのままレジスタに代入していると考えているのですがあってますでしょうか?
するとこれはわかりませんがa=2 b=3などということでしょうか。

宜しくお願い致します。

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

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

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

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

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

y_waiwai

2018/05/19 13:56

そのバイナリの出所はどこでしょうか
cch4n

2018/05/19 14:11

課題の問題なので出所はよくわからないのですが・・・
rubato6809

2018/05/19 21:52

どのような内容の課題ですか?
rubato6809

2018/05/19 22:22

コンパイラはGCCですか?objdumpの表示に見えるので、そうかな?
cch4n

2018/05/20 06:42

すいません、 gcc下で動かしてみてmain関数の引数をとったところrsiレジスタが動いたため+8がargvでここが引数の文字列!と短的に理解してしまいました。 a=2は変数の例で出してしまいました。ubuntu環境のgccです
guest

回答1

0

ベストアンサー

第2引数はrsi+8 つまり文字列の先頭がここに入ってると考えているのですが

こちらに回答した通りです。main(int argc, char **argv) の第二引数 argv が rsi+8 である、ということにはなりません。

追記
(rsi+8) 番地のメモリ(の値)は、ある文字列の先頭番地である、そのような可能性は十分高いです。

4003c0や4003d2などはメモリアドレスをそのままレジスタに代入していると考えているのですが

4003c0: movabs $0xc0601000b0d0e0f,%rax ... 4003cd: mov %rax,-0x10(%rsp) 4003d2: movabs $0x70903020a080504,%rax 4003dc: mov %rax,-0x8(%rsp)

0xc0601000b0d0e0f と 0x70903020a080504 を raxレジスタにロードして、すぐスタック領域のメモリに書いています。スタック領域なので書いた先のメモリは関数のローカル変数だと推測できます。

値がアドレスなら2つの代入先はポインタ変数ですが、私なら**「2つとも、値はアドレスではない」に賭けます**(笑)。
アドレスとして見ると2つの値が大きくかけ離れていることからメモリアドレスだとは考えにくいし、違う見方ができそうである、それにIOポートのアドレスでもないだろう・・・と思うから。

すると… a=2 b=3などということ

どこから・何を根拠に a=2 b=3 と思ったのでしょうか?

投稿2018/05/20 02:30

編集2018/05/20 04:19
rubato6809

総合スコア1380

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

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

pepperleaf

2018/05/20 03:31

ここは元のソースが欲しいところ。
rubato6809

2018/05/20 04:12

いや、そうではなく「main関数から高級言語を予想する問題」、つまり元のCソースを復元することが課題らしいのです。 https://teratail.com/questions/126533 十中八九、コンパイラはGCC。簡単なプログラムをいくつかアセンブリコードにコンパイルし眺めてみれば、コード生成のやり方・スタックの使い方が見えてくるのですが、その努力が足りないのか、脳みそにかく「汗」が足りないのか・・・ それにしても、こういう問題を出すところって、どんな所だろうという興味はあります。
y_waiwai

2018/05/20 04:22

まー、課題がわからん、ってのを助ける気はないので放置してますが、 実際に動かしてみるというアタマはないもんかねえ、とはおもっとりますが
pepperleaf

2018/05/20 04:25

> 「main関数から高級言語を予想する問題」 そうなると、類似コードをコンパイルして、参考にするしかないですね。ま、頭の体操には良いですが。
cch4n

2018/05/20 06:45

もうすこしコンパイラを動かして逆アセンブル結果を考察してみたいと思います。 お手数おかけしました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問