• ベストアンサー

アセンブリ言語の質問です

「 100人分の試験点数がある。 一人分のデータは32bit 符号無し整数でそれが連続して格納されている.先頭のアドレスがEAXで与えられる時,全員の点数の合計をEAXに入れて戻るようなサブルーチンをアセンブリ言語で書きなさい。 • loop unrollingを使用して,ループ内容を4倍に展開して,条件分岐数を減らすこと • 他のレジスタの値は保存すること • 合計点はEAXレジスタに十分納まるものとする。 • 次のような命令を使ってよい。 ADD EAX, [EBX] 」 というような問題が出て自分で解答を作ってみたのですがこれでよいのでしょうか?詳しい方ご検討よろしくお願いいたします。 PUSH EBX(EBXをスタックにおいておく) PUSH ECX(ECXをスタックにおいておく) MOV ECX 25(ECXに25を代入。4回の操作を25回すれば100回になるからである。) label0:ADD EAX [EAX] ([EAX]をEAXに加算) ADD EAX [EAX+1]([EAX+1]をEAXに加算) ADD EAX [EAX+2]([EAX+2]をEAXに加算) ADD EAX [EAX+3]([EAX+3]をEAXに加算) MOV [EAX] [EAX+4]([EAX]を[EAX+4]に移動させる) EBX=EBX+1 (EBXはこのループを何回やったか、という数) CMP ECX EBX(25とEBXを比べる) JNZ:label0(比べてEBXが25になってないならば繰り返す。25になったら終了。) POP EBX(EBXをスタックから戻す) POP ECX(EBXをスタックから戻す)

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

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

Intel の表記を使った上での「ソース上の間違い」は ・MOV ECX 25 など複数オペランド命令は各オペランドを「,」で区切る ・JNZ:label0 の「:」はいらない ・メモリ間の転送命令は存在しない ・EBX=EBX+1 って, なぜここだけこんな表記なのか くらいかな. といってもこれらは「アセンブルすれば一瞬でわかる」程度の, ある意味では「ど~でもいい」間違い. #2 の「加算が間違っている」は本質的. これは CPU の気持ちになって処理をすればわかるはず. もうちょっと言うと ・ADD EAX, [EAX] とやったときに EAX はどう変化するか ・EAX+1 がどこを指しているか を考えること. でも, この処理で「比較して分岐」ってやるのかなぁ? loop 使った方が簡単な気がする.

ararabre
質問者

お礼

具体的なご指摘ありがとうございます。 自分なりに試行錯誤してみたところ、できました。

その他の回答 (5)

  • memphis
  • ベストアンサー率40% (975/2395)
回答No.6

No,2ですが、 加算している所を良く見て下さい。 出題している問題の解答になるような加算をしていません。 チェックする時は、実際にどういうように値が入るかを考えれば 何が間違っているか気が付くはずです。 各レジスタにサンプルとして値を入れてみて考えて見て下さい。 結果が、まったく変な値になることに気が付くはずです。

ararabre
質問者

お礼

そうでした、これでは同じ加算を続けてしまいますよね。 ありがとうございました。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.4

_______JZ______LBL01___________; Is Count Up ? No,GOTO LBL01  X --> _______JNZ______LBL01___________; Is Count Up ? No,GOTO LBL01 でした。

ararabre
質問者

お礼

ありがとうございます。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.3

Intelではないど、某社のアセンブラなら こんな感じかな? ちょっと文法がでたらめですが。。。 見栄えが悪いですが、スペースを_アンダーバーにしてます。 ------------------------------------------------------------- ________PUSHM___R1,R2___________; R1,R2 save to Stack ________MOV.L___#25,R1__________; Loop Count ________MOV.L___#0,R2___________; Init Sum data to Zero LBL01: ________ADD.L___[R0],R2_________; 00+ ________ADD.L___4[R0],R2________; 04+ ________ADD.L___8[R0],R2________; 08+ ________ADD.L___12[R0],R2_______; 12+ ________ADD.L___#16,R0__________; Address += 16 ________SUB.L___#1,R1___________; Counter-- ________JZ______LBL01___________; Is Count Up ? No,GOTO LBL01 END: ________MOV.L___R2,R0___________; Sum data Output To R0 register ________POPM____R1,R2___________; Regster Restore ________RTS

  • memphis
  • ベストアンサー率40% (975/2395)
回答No.2

正常に動きません。 無駄なこともあるし、加算も間違っています。

ararabre
質問者

お礼

ありがとうございます。 どのように間違っているでしょうか?

  • A88No8
  • ベストアンサー率52% (836/1606)
回答No.1

こんにちは 詳しいことは判らないですけど、POPの順序が逆では?

ararabre
質問者

お礼

そうでした、ありがとうございます。

関連するQ&A