アプリ版:「スタンプのみでお礼する」機能のリリースについて

c言語のプログラムをアセンブリに変換する質問です

http://www5.si.gunma-u.ac.jp/sado/compiler/ex08/ …

上記のアドレスの5番の問題です

私が考えたコードがこれなのですが正解がないので

あっているかどうか心配です

実行環境がある方、もしくはアセンブリコードに

詳しい方チェックをお願いします

load r4 , #0 ## d = 0
load r1 , a ## r1 = a
load r3 , c ## r3 = c
cmp r1 , r4 ## a > d → a > 0 
jg Label ## a > 0 でないならLabelに分岐
mul r1 , r3 , r2 ## b = a * c;
sub r1 , r3 , r4 ## d = a - c
jmp Label2 ## Label2へ分岐
Label : mul r1 , r3 , r4 ## d = a * c
sub r4 , r1 , r2 ## b = a * c - a
add r1 , r3 , r4 ## d = a + c = d
Label2 : mul r2 , r4 , r1 ## a = b * d

A 回答 (2件)

・条件分岐が逆


・演算結果をstoreしていない (その必要があるか否か設問からは分からない)
    • good
    • 0
この回答へのお礼

あっ、確かに逆ですね。ご指摘ありがとうございます。storeの件は私もよくわからないです^^;

お礼日時:2010/07/25 19:47

ぶっちゃけ、全然アセンブリ分かんないんですけど、gccでも使えば -S オプション付けて実際にコード吐き出して貰えば大体のトコ概要は掴めるんじゃないですかね?


例えば、Linux(Ubuntu on intel)でgcc使って -S 付けて吐き出させたアセンブリコードは次のようになっています。


     .file"6063130.c"
     .text
.globl main
     .typemain, @function
main:
     pushl%ebp
     movl%esp, %ebp
     subl$16, %esp
     cmpl$0, -4(%ebp)
     jle.L2
     movl-4(%ebp), %eax
     imull-12(%ebp), %eax
     movl%eax, -8(%ebp)
     movl-12(%ebp), %eax
     movl-4(%ebp), %edx
     movl%edx, %ecx
     subl%eax, %ecx
     movl%ecx, %eax
     movl%eax, -16(%ebp)
     jmp.L3
.L2:
     movl-4(%ebp), %eax
     imull-12(%ebp), %eax
     xorl-4(%ebp), %eax
     movl%eax, -8(%ebp)
     movl-12(%ebp), %eax
     movl-4(%ebp), %edx
     leal(%edx,%eax), %eax
     movl%eax, -16(%ebp)
.L3:
     movl-8(%ebp), %eax
     imull-16(%ebp), %eax
     movl%eax, -4(%ebp)
     leave
     ret
     .sizemain, .-main
     .ident"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
     .section.note.GNU-stack,"",@progbits
    • good
    • 0
この回答へのお礼

私もアセンブリはまだほとんど勉強してないのでこれを見てもよくわからないですね^^;でもこういうことができるんだということが知れてよかったです。ご意見ありがとうございました。

お礼日時:2010/07/25 19:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!