アセンブリの読み方について
Posted: 2012年12月18日(火) 16:53
以前アセンブリについて投稿した者です。
前回の問題の類似問題を解いていたのですが、提出先に間違いだと突き返されてしまいましたのでまた質問させていただきます。
前回同様、<fff>と<main>を読めばわかるようで、かつmainは同じくscanfから入力した値を<fff>で処理してprintfで出力するものなのですが
fffの解釈が間違っていました。
コメント(私の考え)とコードを載せますので何がよろしくないのか教えていただきたいです。
以上から私の考えは以下のようになりました。
入力値と値1の差を、←(ここが怪しい
入力値で割り、その値を戻り値とする。
fffを再帰呼び出した後、最終的(再帰呼び出し終了時)にeaxに1が入るのはわかったのですがそれまでの過程でどうしたいのかわからなくなってしまいました。
なんとなくなのですが、素数や公約数が絡んでいる気がします。
以上です、回答よろしくお願いします。
前回の問題の類似問題を解いていたのですが、提出先に間違いだと突き返されてしまいましたのでまた質問させていただきます。
前回同様、<fff>と<main>を読めばわかるようで、かつmainは同じくscanfから入力した値を<fff>で処理してprintfで出力するものなのですが
fffの解釈が間違っていました。
コメント(私の考え)とコードを載せますので何がよろしくないのか教えていただきたいです。
00000000004004d8 <fff>:
4004d8: 55 push %rbp
4004d9: 48 89 e5 mov %rsp,%rbp
4004dc: 48 83 ec 08 sub $0x8,%rsp
4004e0: 89 7d fc mov %edi,0xfffffffffffffffc(%rbp) 入力値ediをrbpcに。
4004e3: 83 7d fc 01 cmpl $0x1,0xfffffffffffffffc(%rbp) 1とrbpcの値を比較。
4004e7: 75 09 jne 4004f2 <fff+0x1a> 1≠rbpcならジャンプ
4004e9: c7 45 f8 01 00 00 00 movl $0x1,0xfffffffffffffff8(%rbp) 1をrbp8に。
4004f0: eb 14 jmp 400506 <fff+0x2e> ジャンプ
4004f2: 8b 7d fc mov 0xfffffffffffffffc(%rbp),%edi rbpcの値をediに。
4004f5: 83 ef 01 sub $0x1,%edi ediから1を引く。
4004f8: e8 db ff ff ff callq 4004d8 <fff> fffの再帰呼び出し。
4004fd: 89 c2 mov %eax,%edx eaxをedxに。
4004ff: 0f af 55 fc imul 0xfffffffffffffffc(%rbp),%edx edxをrbpcで割り、その商をedxとする。
400503: 89 55 f8 mov %edx,0xfffffffffffffff8(%rbp) edxの値をrbp8に。
400506: 8b 45 f8 mov 0xfffffffffffffff8(%rbp),%eax rbp8の値をeaxに。このeaxが戻り値になる。
400509: c9 leaveq
40050a: c3 retq
000000000040050b <main>:
40050b: 55 push %rbp
40050c: 48 89 e5 mov %rsp,%rbp
40050f: 48 83 ec 10 sub $0x10,%rsp
400513: 48 8d 75 fc lea 0xfffffffffffffffc(%rbp),%rsi
400517: bf 48 06 40 00 mov $0x400648,%edi
40051c: b8 00 00 00 00 mov $0x0,%eax
400521: e8 ca fe ff ff callq 4003f0 <scanf@plt>
400526: 8b 7d fc mov 0xfffffffffffffffc(%rbp),%edi
400529: e8 aa ff ff ff callq 4004d8 <fff>
40052e: 89 c6 mov %eax,%esi
400530: bf 4b 06 40 00 mov $0x40064b,%edi
400535: b8 00 00 00 00 mov $0x0,%eax
40053a: e8 91 fe ff ff callq 4003d0 <printf@plt>
40053f: c9 leaveq
400540: c3 retq
400541: 90 nop
400542: 90 nop
400543: 90 nop
400544: 90 nop
400545: 90 nop
400546: 90 nop
400547: 90 nop
400548: 90 nop
400549: 90 nop
40054a: 90 nop
40054b: 90 nop
40054c: 90 nop
40054d: 90 nop
40054e: 90 nop
40054f: 90 nop
入力値と値1の差を、←(ここが怪しい
入力値で割り、その値を戻り値とする。
fffを再帰呼び出した後、最終的(再帰呼び出し終了時)にeaxに1が入るのはわかったのですがそれまでの過程でどうしたいのかわからなくなってしまいました。
なんとなくなのですが、素数や公約数が絡んでいる気がします。
以上です、回答よろしくお願いします。