- ベストアンサー
SPARCアセンブリ言語
以下のC++でかかれたコードをSPARCアセンブリ言語に変換したいのですが、なかなかうまくいきません。 C++ main () { int x, y=0; for(x=2;x<=10;x=x+3) { y=y+(x/3 + 4); } x = x * 3; よろしければSPARCでの書き方を教えて下さい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
変数だけ処理してると最適化で意味の無いコードとして削られちゃんですよね。なので、参考として最適化オプションが有効になるようにCソースを変更してみました。 int main() { void func(int); int x, y=0; for(x=2;x<=30;x=x+3) { y=y+(x/3 + 4); func( y ); } x = x * 3; func( x ); } で、出力されたアセンブルコード。 .file "sparc.c" .global .div .section ".text" .align 4 .global main .type main, #function .proc 04 main: save %sp, -104, %sp mov 2, %i0 mov 0, %l0 mov %i0, %o0 .LL6: call .div, 0 mov 3, %o1 add %o0, 4, %o0 add %l0, %o0, %l0 call func, 0 mov %l0, %o0 add %i0, 3, %i0 cmp %i0, 32 bne .LL6 mov %i0, %o0 call func, 0 restore %g0, 96, %o0 nop .size main, .-main .ident "GCC: (GNU) 4.3.0" 以上です。
その他の回答 (4)
- zwi
- ベストアンサー率56% (730/1282)
>MSのVisual StudioでC++のコードをSPARC(ARC)に変換してくれるのでしょうか? >コンパイルした物ではなく、コードが欲しいです。 VisualStudioだと無理ですね。SPARCのアセンブル環境があるならgccぐらい入っているかと思ったんですが?たぶん、無いんですね。 基本的にコンパイラはアセンブラのソースコードを出力するオプションがあります。gccだと-Sですね。 試しにgccでクロスコンパイルしてみましたが、最適化するとコードが出なくなるので最適化していない冗長なコードです。 .file "sparc.c" .global .div .section ".text" .align 4 .global main .type main, #function .proc 04 main: save %sp, -120, %sp st %g0, [%fp-12] mov 2, %g1 st %g1, [%fp-16] b .LL2 nop .LL3: ld [%fp-16], %g1 mov %g1, %o0 mov 3, %o1 call .div, 0 nop mov %o0, %g1 add %g1, 4, %g2 ld [%fp-12], %g1 add %g1, %g2, %g1 st %g1, [%fp-12] ld [%fp-16], %g1 add %g1, 3, %g1 st %g1, [%fp-16] .LL2: ld [%fp-16], %g1 cmp %g1, 10 ble .LL3 nop ld [%fp-16], %g2 mov %g2, %g1 sll %g1, 1, %g1 add %g1, %g2, %g1 st %g1, [%fp-16] restore jmp %o7+8 nop .size main, .-main .ident "GCC: (GNU) 4.3.0"
- D-Matsu
- ベストアンサー率45% (1080/2394)
CygwinでSPARCターゲットのgccを使うとか。 バイナリコードじゃなくアセンブリ変換までで止められます。
- zwi
- ベストアンサー率56% (730/1282)
アセンブラ化したいんですよね。Cコンパイラでアセンブルコードを出力すれば良い見本が見れます。 でもRISC系のアセンブラコードを自前で書くには熟練しないとコンパイラ出力のコードの性能には勝てないですよ。そもそもコンパイラで最適化しやすいようにアセンブラ時の人間の可読性を無視して生まれたのがRISCですからね。 遅延スロットとかSPARC特有のクセにも要注意。 http://ja.wikipedia.org/wiki/%E5%88%86%E5%B2%90%E9%81%85%E5%BB%B6%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88
- Tacosan
- ベストアンサー率23% (3656/15482)
SPARC の C++ コンパイラで処理すればいいのに.
補足
MSのVisual StudioでC++のコードをSPARC(ARC)に変換してくれるのでしょうか? コンパイルした物ではなく、コードが欲しいです。 例えば main () { int x, y=0; for(x=2;x<=10;x=x+3) { y=y+(x/3 + 4); } x = x * 3; の場合、 .begin .org 2048 ld[x], %r1 top: subcc のような感じです・。