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

次の問題があっているのかわかりません。

次のCASLIIプログラムの実行後のレジスタ(GR1,FR)とメモリ(AA,BB,CC番地)
の内容を16進表示および符号付き10進表示せよ。

PGM START
LD GR1,AA
ADDA GR1,BB
ST GR1,CC
RET
AA DC 32767
BB DC 1
CC DS 1
END

32767をGR1に入れて、1加算する。
だからGR1 = 32768
と思ったのですが、先生の書いた答えは
-32768
でした。

PGM START
LD GR1,AA
ADDL GR1,BB
ST GR1,CC
RET
AA DC #7FFF
BB DC 1
CC DS 1
END

#7FFFに1加算するので
GR1=#8000
だと思います。


また自分で書いた板書に

Arithmetic[ -32768, 32767](#8000,#7FFF)
Logical[0,65535](#0000,#FFFF)

とありました。
板書をとったのがだいぶ前なのでこれの意味をよく覚えていないのですが、
ADDA命令のときに扱える値の範囲は-32768,~32767
ADDL命令のときに扱える値の範囲は0~65535
ということなのでしょうか。

その場合、先ほどの問題のADDAの問題で
32767 + 1 をしたら範囲を超えてしまいます。
このような場合どうなるのでしょうか?
ADDLの場合も範囲を超えてしまったらどうなるのですか?

よろしくお願いします。

A 回答 (1件)

> 32767をGR1に入れて、1加算する。


> だからGR1 = 32768
> と思ったのですが、先生の書いた答えは
> -32768

#8000 を絶対値 (Logical) で見れば 32768, 2の補数表現 (Arithmetical) で見れば -32768 というだけです。
CASLII では加算命令がそれぞれ ADDL, ADDA と別々に用意されていますが、実際やってることは FR レジスタの動きを除けば全く同じで、その計算結果を絶対値と見るか負数と見るかはプログラマの都合次第です。

ですから答に符号付きdecimalでと求められたら -32768 ということです。

> その場合、先ほどの問題のADDAの問題で
> 32767 + 1 をしたら範囲を超えてしまいます。
> このような場合どうなるのでしょうか?

FR レジスタの Overflow Flag を各々確認してみてください。どちらも GR1 は #8000 ですが OF は ADDA でだけ 1 になります。

> ADDLの場合も範囲を超えてしまったらどうなるのですか?

OF が 1 になる境界が違いますが同様です。逆に #7FFF+1 したときは 0 のまま
ちなみ同じことは SUBL, SUBA にも言えます
    • good
    • 1

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