CASL U - 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 10
1
1
01010101010101010(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(サインフラグ)を調べる。
負数は-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 |