CASL U - 2の補数の計算
 前へ 目次へ 次へ

2の補数の計算

 負数を表すために使う「2の補数」を計算する。例えば、-0001(16)を2の補数で表すとFFFF(16)となる。計算方法は、すべてのビットを反転(1を0に、0を1に)し、1を加算する。

0001(16) → 0000 0000 0000 0001(2)
1111 1111 1111 1110(2)
 ↓全ビットを反転する。
+ 0000 0000 0000 0001(2)
FFFF(16) ←  1111 1111 1111 1111(2)
 ↓ 1を加算する。

 2の補数を元に戻すには逆の順で計算すれば良い。すなわち、1を減算して、全ビットを反転させるのである。

FFFF → 1111 1111 1111 1111 - 1 = 1111 1111 1111 1110
       1111 1111 1111 1110 →反転→ 0000 0000 0000 0001 → 0001

 ちなみに、全ビット反転し、1加算する方法でも元に戻る。

FFFF(16) → 1111 1111 1111 1111(2)
0000 0000 0000 0000(2)
 ↓全ビットを反転する。
+ 0000 0000 0000 0001(2)
0001(16) ←  0000 0000 0000 0001(2)
 ↓ 1を加算する。


全ビットを反転する

 あるデータの全ビットを反転するには、全ビット1のデータとXOR演算を行う。
 例えば、AAAA(16)=1010101010101010(2)を全ビット反転する。

A  B Y
0  0
0  1
1  0
1  1
0
1
1
0
1010101010101010(2)
XOR  1111111111111111(2)
0101010101010101(2)

 2の補数を計算する副プログラムHOSUU2を作成する。元のデータをGR1に記憶して呼び出す。結果はGR1に格納される。
 プログラムは次のとおりである。

MAIN1    START
         LD      GR1, DATA
         CALL    HOSUU2
         ST      GR1, ANS
         RET
DATA     DC      100
ANS      DS      1
         END
HOSUU2   START
         XOR     GR1, =#FFFF    ;全ビット反転.
         ADDA    GR1, =1        ;1を加算.
         RET
         END


課題1 整数データが負数の場合、絶対値を計算する副プログラムABSを作成せよ。データはGR1に格納して副プログラムに渡し、絶対値をGR0に格納して戻る。データは-32767〜32767の範囲にあるものとする。

 データの正負を調べるにはLD命令を使い、FR(フラグレジスタ)のSF(サインフラグ)を調べる。

 データとして-100を定義している。

 負数は-32768(#8000)まで記憶できるが、-32768の絶対値は32768であり記憶できる範囲を超えてしまう。このプログラムで-32768の絶対値を計算すると-32768となる。

8000(16) → 1000 0000 0000 0000(2)
0111 1111 1111 1111(2)
 ↓全ビットを反転する。
+ 0000 0000 0000 0001(2)
8000(16) ←  1000 0000 0000 0000(2)
 ↓ 1を加算する。


 前へ 目次へ 次へ
 CASL U Copyright © 2003,2017  Hiroshi Masuda

 

 

inserted by FC2 system