• ベストアンサー

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での書き方を教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.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)
回答No.4

>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)
回答No.3

CygwinでSPARCターゲットのgccを使うとか。 バイナリコードじゃなくアセンブリ変換までで止められます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

アセンブラ化したいんですよね。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

Intel_404
質問者

補足

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 のような感じです・。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

SPARC の C++ コンパイラで処理すればいいのに.

関連するQ&A

  • SPARC3はホントに64bitで動いてる?

    SUNのSPARC3は64ビットのCPUらしいのですが次のプログラムを動かした ところなんだかホントかどうか疑わしくなりました。 #define T long long main() { const int N=100; T a[N],b[N]; for(int i=0;i<N;i++) { a[i]=i; b[i]=i; } b[N-1]=0; T *x,*y; for(int i=0;i<10000000;i++) for(x=a,y=b;*x==*y;x++,y++); } このプログラムを走らせたところTがintの時とlonglongのときでは 実行時間が倍近く違いました。(int 5.4秒、long long 9.5秒) SPARC3が64ビットをネイティブで計算できるならintとlonglongでは これほどの差は出ないと思うのですが。コンパイラはgccを使っているのですが そのせいでしょうか。OSはソラリスです。

  • [C言語→アセンブリ言語]はどうするのですか?

    C言語でプログラムを作って、それをアセンブリ言語に変換したいのですが、どうしたらよいでしょうか?

  • MIPSのアセンブリ・コードの問題です。

    CコードからMIPSアセンブリコードへの変換問題を教えてください。 以下のC のコードに対応するMIPS のアセンブリ・コードを書け。 C コード: #define TAB_SIZE 8 int tab[TAB_SIZE]; void main() { int i; for (i = 1; i < TAB_SIZE; i++) { tab[i - 1] = tab[i]; } } • SPIM でのシミュレーションのため、 tab[8] = {8, 9, 10, 11, 12, 13, 14, 15}; としてコードを書け。つまり、データ・セグメントを次のようにせよ。 .data tab: .word 8, 9, 10, 11, 12, 13, 14, 15 • SPIM のDATA セクションが以下のようになることを確認せよ。 [0x10010000] 9 [0x10010004] a [0x10010008] b [0x1001000c] c [0x10010010] d [0x10010014] e [0x10010018] f [0x1001001c] f 1

  • アセンブリ言語について。

    これが何をしているのか教えていただけないでしょうか?すみません。 これの事です。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret

  • アセンブリ言語について

    アセンブリ言語でプログラムを構築するに当たって「xの最初のmビット、yのnビット、xの次のmビットの順で左詰で結合した 2m+nビットで、その右側は0」というプログラムを作りたいのですがどうすればいいですか?

  • アセンブリ言語にて、

    アセンブリ言語にて、 「乗算Z←X×Yを、 ビットシフト(ROT命令ほか)で用いた計算手順と、 加算(ADD命令)の各長所、短所を比較しなさい」 という問題の答えがわかりません・・・ 教えていただけませんか?

  • アセンブリ言語とC言語

    アセンブリ言語とC言語について調べているのですが、この二つ言語のプログラムについて実質的に同じと言えることはなんでしょうか? また異なっていることはなんでしょうか?(たとえばアセンブリは低級言語であり、C言語は高級言語であるなどなんでもいいです。) 是非解答お願いします。

  • アセンブリ言語について。

    アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。

  • アセンブリ言語について。

    >2進数の羅列では人間にはあまりに読み書きしにくいからです。 >それを命令単位に区切って、英単語を元にした名前を与えたのが、 >アセンブリ言語です。 ニーモニックとは、その命令の名前の事です。 簡潔に要点がまとまっている、すばらしい説明ですね。その通りです。 これで理解できないなら、追加の説明のしようがありません。 (なお、このように、他人の発言は引用符を付けて引用すると、わかりやすくなります。是非そうしてください。) まあ具体例を挙げるならこんな感じ。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret 人間がCPUを直接動かすプログラムを書こうとするとき、アセンブリ言語を使って書きます(右側の部分)。 mov $0x616b6157,%eax push %ebx push %eax mov $0x4,%edx mov $0x1,%ebx mov $0x4,%eax mov %esp,%ecx int $0x80 pop %eax xor %eax,%eax pop %ebx ret そしてこれをアセンブルすると、1対1対応した機械語のデータ列が出来ます。 それが b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 この部分。 機械語には改行なんてありませんから、実際は一連の b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 と言うデータ列になります。 これをCPUが実行していきます。 相当熟練した人で無ければ、このデータ列を見るだけでプログラム構造を理解する、というわけに行きません。 なので、人間が機械語レベルでプログラミングする際には、アセンブリ言語を使います。 ※この回答のプログラムはこちらから引用しました。 >31バイトでつくるアセンブラプログラミング アセンブラ短歌の世界 >https://book.mynavi.jp/support/pc/4946/c01_assembra.pdf で、機械語データは、なぜ、0と 1だけではないのでしょうか?教えていただけないでしょうか?すみません。

  • 機械語とアセンブリ言語について。

    (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret こちらのアセンブリ言語の命令がわかるおすすめの書籍を知らないでしょうか? 教えていただけないでしょうか?すみません。

専門家に質問してみよう