電子書籍の厳選無料作品が豊富!

以下のような問題があり、解答がありますが理解できません。
すみませんが、どなたか解説をお願いします。
----------------------------------------------------------
■問題
 10進数の「5×20」の結果を求め、その結果をメモリに格納するプログラムを作成せよ。ただし、「5×20」の数を他の数に置き換えた時も掛け算が行えるプログラムにすること。
■解答
 SAMPLE START
LAD GR1,0
LAD GR2,1
LD GR3,=5
LOOP LD GR4,C20
AND GR4,GR2
JZE NEXT
ADDA GR1,GR3
NEXT SLA GR3,1
SLL GR2,1
JNZ LOOP
ST GR1,ANS
RET
C20 DC 20
ANS DS 1
END

A 回答 (1件)

次のように行番号をつけてみました。


1:   LAD GR1,0
2:   LAD GR2,1
3:   LD GR3,=5
4:LOOP LD GR4,C20
5:   AND GR4,GR2
6:   JZE NEXT
7:   ADDA GR1,GR3
8:NEXT SLA GR3,1
9:   SLL GR2,1
10:   JNZ LOOP
11:   ST GR1,ANS

CASLのレジスタは16bit長ですが,桁数が長くてめんどうなので8bit幅として解説します。

a)2行・9行より,GR2はループのたび次のように変化する。
00000001 → 00000010 → 00000100 → ……
つまり,ビット1が最下位(右端)から左へと1bitずつ移動していく。

b)4行・5行より,GR4には(20)10 = (00010100)2 がセットされ,前述のGR2とのANDがとられる。つまり,GR4内のビット列を右端から左へと1bitずつ調べて,その位置が1か0か判定している。

c)3行・8行より,GR3はループのたび次のように2倍される。
(5)10 → (10)10 → (20)10 → ……

d)よって7行目で解答格納領域(GR1)に加算される値は次のとおり。
1回目:GR4=0001010零 なので 5は加算しない
2回目:GR4=000101零0 なので 10は加算しない
3回目:GR4=00010壱00 なので GR1に(20)加算
4回目:GR4=0001零100 なので 40は加算しない
5回目:GR4=000壱0100 なので GR1に(80)加算
6回目:GR4=00零10100 なので 160は加算しない
7回目:GR4=0零010100 なので 320は加算しない
8回目:GR4=零0010100 なので 640は加算しない

11行目でANSに格納される値は(20)+(80)=(100)です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
とてもわかりやすかったです(泣

お礼日時:2007/04/21 19:50

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