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

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

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

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

Q&A

解決済

1回答

1586閲覧

アセンブラについて指導お願いします。

tanty

総合スコア14

アセンブリ言語

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

0グッド

1クリップ

投稿2018/05/24 16:35

前提・実現したいこと

逆アセンブルについてです。
mov などの命令文の意味これがAT&T記法で書かれているということくらいしか分かりません。
私が知りたいのはmovの後ろに abs (zbl)とあるのですがこれはいったい何を意味しているのか、cmpときて2とedi(第一引数?)を比較するとのことですが、ediには何も入っていないので比較することは不可能なのではないでしょうか。また、なにも命令がなければ上から下に処理していくという形であっていますでしょうか?
逆アセンブルという言葉すら知らない状態でこの問題に取り掛かり、知らない言葉などを調べていたのですが、自分の調べる能力、理解力も低くいので今回知識ある人たちに聞くことにしました。つたない文章ですが、ご指導のほどよろしくお願いいたします。
また初学者でも理解できるようなサイト、おすすめの本などありましたら教えていただけると幸いです。

発生している問題・エラーメッセージ

Debian(amd64)上で動作するあるプログラムのmain関数の逆アセンブル結果から実行結果0になる特定の文字列を求める問題です。
objdumpの表示です。

該当のソースコード

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
4003ee: 89 c1 mov %eax,%ecx
4003f0: 48 ff c0 inc %rax
4003f3: 80 7c 02 ff 00 cmpb $0x0,-0x1(%rdx,%rax,1)
4003f8: 75 f4 jne 4003ee <main+0x2e>
4003fa: 83 f9 08 cmp $0x8,%ecx
4003fd: b8 01 00 00 00 mov $0x1,%eax
400402: 75 3d jne 400441 <main+0x81>
400404: 48 8b 32 mov (%rdx),%rsi
400407: 31 c0 xor %eax,%eax
400409: 30 c9 xor %cl,%cl
40040b: 48 89 f2 mov %rsi,%rdx
40040e: 48 d3 ea shr %cl,%rdx
400411: 83 e2 0f and $0xf,%edx
400414: 0f b6 54 14 f0 movzbl -0x10(%rsp,%rdx,1),%edx
400419: 48 d3 e2 shl %cl,%rdx
40041c: 83 c1 04 add $0x4,%ecx
40041f: 48 09 d0 or %rdx,%rax
400422: 83 f9 40 cmp $0x40,%ecx
400425: 75 e4 jne 40040b <main+0x4b>
400427: 48 33 05 92 ff ff ff xor -0x6e(%rip),%rax # 4003c0 <main>
40042e: 48 ba 85 03 0e 67 b3 movabs $0x600967b3670e0385,%rdx
400435: 67 09 60
400438: 48 39 d0 cmp %rdx,%rax
40043b: 0f 95 c0 setne %al
40043e: 0f b6 c0 movzbl %al,%eax
400441: c3 retq

### 試したこと ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

movの後ろに abs (zbl)とあるのですがこれはいったい何を意味しているのか

movabs は gas 特有のニーモニックで、CPU的にはただの mov です。オペランドが64bitのとき、gas が区別の為に movabs と出力します。

参考:https://sourceware.org/binutils/docs/as/i386_002dVariations.html
In 64-bit code, ‘movabs’ can be used to encode the ‘mov’ instruction with the 64-bit displacement or immediate operand.

movzbl も同じく gas 特有のニーモニックで、intel 的には movzx です。オペランド1の値をオペランド2にコピーします。上位ビットはゼロクリアされます。

cmpときて2とedi(第一引数?)を比較するとのことですが、ediには何も入っていないので比較することは不可能なのではないでしょうか。

お察しの通り、%edi には第一引数が入っています。C言語で main の第一引数は「引数の数」でしたよね。

なにも命令がなければ上から下に処理していくという形であっていますでしょうか?

あっています。

また初学者でも理解できるようなサイト、おすすめの本などありましたら教えていただけると幸いです。

わたしの場合、自分で intel のリファレンスを読みながら逆アセンブラを書いて勉強しました。参考になるか分かりませんが……。

[5/25 2:30] movzbl に嘘を書いていた (cpu instruction だと書いてた) のを修正

投稿2018/05/24 17:26

編集2018/05/24 17:33
pute

総合スコア134

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

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

tanty

2018/05/25 04:22

わかりやすい回答ありがとうございます。 教えていただいたことを調べて理解できるところもあったのですが、ediの引数の説明が理解できませんでした。プログラミングもほとんどしたことがないので申し訳ないです。 引数の数ということはedi(第一引数)の下にあるrsi(第二引数)、edx(第三引数)、ecx(第四引数)といった引数の数の合計をcmp 2とedi(引数の数の合計)で比較するという考えなのですがどうでしょうか? また、比較した後はどのような処理になりますか? よろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問