• ベストアンサー

アセンブリ言語にて、

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

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

  • ベストアンサー
  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.2

それぞれフローチャートを書いてみれば一目瞭然ですが、 ビットシフトの場合、乗数が2のn乗であることが前提となり、例えば64倍(2の8乗)するのであれば、被乗数を8回左シフト(ローテートの場合キャリービットはクリアする)すれば答えが出ます。CPUにもよりますが、シフト量に関わらず1ステートで答えが出るものもあります。即ち、実行速度が速い、もしくは64倍だろうが128倍だろうが速度の差が出ない(もしくは差が少ない)、という点が長所です。 加算を使う場合は、被乗数を乗数分ループして加算を繰り返すことになりますので、乗数が大きくなると、その分処理に時間がかかります。乗数が大きくなる従い処理速度が増えます。 逆に、ビットシフトは2のn乗が前提なので、2のn乗で端数が出た場合は、その分条件式を入れて、分解してビットシフトによる乗算を組み合わせたり、場合によっては加算のループ組み合わせたり、処理が複雑になります。 例えば、67倍する場合は、64倍のビットシフト演算と3回の加算に分解するとか、 192倍する時などは、128倍のビットシフトと64倍のビットシフトを組み合わせるとか、いずれにしても条件が複雑になります。 これに比べて加算の方は被乗数、乗数(0以外であれば)の条件に関わらず、ループの形だけで表現出来るので、とてもシンプルに記述出来ます。 長所、短所についてはこんなところかと思います。ご参考に。

その他の回答 (1)

  • debukuro
  • ベストアンサー率19% (3635/18948)
回答No.1

乗算を足し算の繰り返しでするかビットの回転でするかの違いでしょう これを筆算にお置き換えて考えれば分かるはずです

関連するQ&A

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

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

  • アセンブリ言語の質問のコト

    アセンブリ言語で、最大公約数を求めるプログラムを つくらなければならないんですが、 まぁ...だいたいできたんですが...ちょっとわからないトコが ありまして... acc(アキュムレータ)にはいってるデータが、負のバアイに、 それを正にかえたいんですが、どうしたらいいんでしょう? ビット反転さして、1足したらいいんじゃないか、ってのを思いついたんですが、 (これもあってるのかどうか自信ないんですけど...) ナンカ、反転さす命令がないみたいで...がっくシ... ということで、だれかお力ゾエをおねがい致しまス。 必要かどうかワカリマセンが、とりあえず、 ちょっとだけ命令を以下に挙げておきます。 (たしか、アセンブリ言語って、それぞれ違うっていっても、どれも結構  似てるんですよね...ぼくの頼りない知識がタシカなら...) ADD,SUB,INC,DEC,OR,EOR,AND,NOT, LSL,ASL,LSR,ASR,ROL,ROR,SWP JP,JPc,JPz,JPs,JPv,JP,JP,Call,Ret,

  • アセンブリ言語は原始プログラムですか?

    質問(1) アセンブリ言語というのは、 add $S1, $S2 みたいなやつですよね? wikipediaで「ソースコード(ソースプログラム、原始プログラム)」の注釈1,2を読むと、 注1:【機械語の命令に記述するアセンブリ言語(アセンブラ)が存在するが、このアセンブラ用の文字列で記述されたプログラムはソースコードとは呼ばれないのが普通である。】 注2:【アセンブリ言語で書かれたプログラムはソースコードと呼ばれない】 と書かれてあります。 でも、 他の教材では アセンブリ言語で書かれたプログラム(原始プログラム) と書かれています。 どっちが正しいのでしょうか? 質問(2) 目的プログラム(オブジェクトプログラム)とは、 IT用語辞典によると 【オブジェクトプログラムとは、ソースプログラム(人間が認識できるプログラム言語で高水準言語など?)をコンパイラで機械語に翻訳したプログラムのことである】 とありますが、 ソースプログラムをコンパイラで翻訳するとアセンブリ言語になるんではないのですか? そのアセンブリ言語をアセンブラで翻訳して機械語になるのではないのでしょうか? どなたかご教授ください。 お願いします。

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

    「 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をスタックから戻す)

  • アセンブリ言語の問題について質問します。

    アセンブリ言語の問題について質問します。 言語はCOMETIIのCASLIIです。 今現在、LD.ST,LAD,AND,OR,XOR,比較,分岐命令まで習った段階です。 問題は (1)A番地からNブロック分(1ブロック256語)のメモリに、 それぞれのアドレスの下位バイトの値(#00~#FF)を書き込み (2)書き込まれたNブロック分のメモリの内容を、 B番地からNブロック分のメモリに転送するプログラムを完成させよ。 ただしAは#8100,Bは#8500,Nは2をDC命令で設定のこと。 宜しくお願いします!

  • アセンブリ言語で変数を正しく使えない

    アセンブリ言語の勉強をして、小文字のaからzまでを表示するプログラムを書いています。今回、以下のようなコードを書きました。 org 100h mov dl, 61h           ;'a'のコード Disp: mov ah, 02h          ;1文字表示 int 21h inc dl                ;dlレジスタ内の文字コードをインクリメント cmp dl, 7Ah+1           ;dlレジスタ内のコードと'z'の文字コードを比較 jnz Disp              ;一致しなければループ mov ah, 4Ch int 21h sCode db 61h eCode db 7Ah ここで連続表示する文字の始点と終点をあとで変更することになった場合を考え、最後の2行にsCode(始点となる文字コード)とeCode(終点となる文字コード)という2つの変数を設定しました。しかしこれらをそれぞれコード中の即値61hと7Ahと置き換えるとうまく動作しません。何も文字が表示されずに終わってしまいます。これは何故なのでしょうか?

  • アセンブリプログラムの問題です。

    アセンブリプログラムの勉強をしているのですが、以下の問題がわかりません。 (1) 変数f, g, h, i, j はCのプログラム内で32ビットの整数として宣言されているものとする。 以下のCのステートメントをMIPSのアセンブリコードで表せ。 また、f, g, h, i, j の値がそれぞれ1, 2, 3, 4, 5 であるならば最終的なfの値はいくつか。 a. f = g + f + i ; b. f = g + (h + 2); (2) 変数f, g, h, i, jはそれぞれ$s0, $s1, $s2, $s3, $s4に割り当てるられているものとする。また、配列AとBのベースアドレスは、それぞれレジスタ$s6 と$s7 に割り当てられているものとする。 次のCのステートメントをMIPSのアセンブリコードで表せ。 a. f = g + h + B[4] ; b. f = g - A[ B[4] ] ; c. f = -g + h + B[1] ; d. f = A[ B[g] + 1 ] ; (3) (2)の設定において、次のMIPSのステートメントをCのステートメントで表せ。 また、可能ならばこのMIPSアセンブリコードを同じ機能を果たしながらMIPS命令の数が最小になるように書き直せ。 a. add $s0, $s0, $s1 add $s0, $s0, $s2 add $s0, $s0, $s3 add $s0, $s0, $s4 b. lw $s0, 4($s6) 以上です。わかるものだけでも良いので教えてもらえますでしょうか?

  • 教えて下さい、中古車

    180SXについて、長所・短所など思うところを御自由に述べてください。 AE101GT-Zについて、長所・短所など思うところを御自由に述べてください。 両者を比較して、どちらが好きですか? 私は、最高速、ドリフト、ゼロヨン、は狙ってません。主に、サーキット、グリップ、山、を走りたいと思います。どちらがいいでしょう? また、あわせて、任意保険の値段や、燃費についても教えてください。 こちらが、質問をする立場なのに、なんだか、命令的な感じで申し訳ございません。

  • Z80について

    Z80のアセンブリ言語の命令でAレジスタの値を反転させるにはCPL命令を使えばいいんですが、その命令以外の命令を使ってAの値を反転させるにはどうすればいいでしょうか? どんな命令を使えばよろしいでしょうか?

  • マイクロコンピュータ 乗算演算について

    マイクロコンピュータで、8ビット演算回路の乗算演算を行ったのですが、その際、乗数の0、1パターンに応じて被乗数を左シフトさせ加算していくロジックで演算をするというアルゴリズムを組み立てて実行しました。 乗算演算をより高速化させるには、この他にどのような手段が考えられるのか教えていただけないでしょうか? お願いいたします。

専門家に質問してみよう