2017-02-25 9 views
-3

を使用せずに、私は私が指定したオペランドを掛けるのと同じ動作を行いSHL操作を使用してそれを書いしよう乗算MUL命令

(SIC及びSIC/XEマシンの両方のための)プログラムを記述する必要があります二人で左に2ビットシフトすると、オペランドに4が乗算されます。左の3ビット位置にシフトすると、オペランドに8が乗算されます。一般に、オペランドを左のnビットにシフトすると、2n倍になります。一連のシフト、加算、シフト、および減算を使用して、任意の値に定数を掛けることができます。たとえば、axレジスタに10を掛けるには、8を掛けるだけで元の値の2倍を加算する必要があります。すなわち、10 * ax = 8 * ax + 2 * ax。これを達成するためのコードは

です。どうすればプログラム(SICとSIC/EXマシン)を書くことができますか? 誰かを助けてもらえますか?

+0

これはx86コードですが、ロジックは有効です。だから、どこに詰まったの? – Jester

+2

誰かがあなたに答えるかもしれませんが、これはSOが本当に何であるかではありません。実際の援助を得るには、自分で書き留めてから、問題が発生したときに投稿してください。これは語学教育サイトではなく、「このコードを私のために書く」サイトでもありません。 –

答えて

1

あなたの理解とアルゴリズムは正しい方向にあります。ベース2を除いて、グレードの学校を覚えておくほうがずっと簡単です。

abcd * ghef = (abcd*(f*(2^0)))+(abcd*(e*(2^1)))+(abcd*(h*(2^2)))+(abcd*(g*(2^3))) 

ので、ビットは、他の数があなたのアキュムレータに同じ量をずらし追加設定されている場合、数字の1がそれを介して1を歩く取るある

 abcd 
    * 1101 
    ========= 
     abcd 
     0000 
     abcd 
+ abcd 
============= 

//a = op1 * op2 in binary 
a=0; 
b=op1; 
for(x=1;x;x<<=1) 
{ 
    if(x&op2) a+=b; 
    b<<=1; 
} 

このように、どのような言語であれ、どんな命令でも実装できます。

+0

ええとf倍TWOを0にするなど、ありがとう。 –