(since 1998/11)(更新 2004/02/26)
©Copyright 1998-2001,2003,2004 小野智章(小野情報設計)
無断転載を禁止します。
本ページは、「Rook」仕様に対応済みです。
今度は、右向きシフトの「SRL」命令を使ってみましょう。
SAMPLE | | START |
| | LAD | | GR0,#000F | ;15 |
| | SRL | | GR0,1 | ;#F/2 |
| | WRITE | | 0 |
| | LAD | | GR1,1 |
| | SRL | | GR0,0,GR1 | ;#F/2/2 |
| | WRITE | | 0 |
| | LAD | | GR0,#FFFF | ;−1 |
| | SRL | | GR0,1 | ;#FFFF/2 |
| | WRITE | | 0 |
| | SRL | | GR0,1 | ;#FFFF/4 |
| | WRITE | | 0 |
| | SRL | | GR0,1 | ;#FFFF/8 |
| | WRITE | | 0 |
| | EXIT |
| | END |
|
GR0=7(0007)
GR0=3(0003)
GR0=32767(7FFF)
GR0=16383(3FFF)
GR0=8191(1FFF)
プログラムは、PR[0024;SAMPLE+36]が指定したEXIT命令で終了しました。
|
この様に「SRL」命令は、最上位のビットに0が入ります。
負の数を2倍、または1/2すると、どの様になるでしょう。
結果を予想してみて下さい。
SAMPLE | | START |
| | LAD | | GR0,−1 | ;#FFFF |
| | SLL | | GR0,1 | ;#FFFF×2 |
| | WRITE | | 0 |
| | SRL | | GR0,1 | ;#FFFF×2/2 |
| | WRITE | | 0 |
| | LAD | | GR0,−16385 | ;#BFFF |
| | SLL | | GR0,1 | ;#BFFF×2 |
| | WRITE | | 0 |
| | EXIT |
| | END |
|
GR0=-2(FFFE)
GR0=32767(7FFF)
GR0=32766(7FFE)
プログラムは、PR[0016;SAMPLE+22]が指定したEXIT命令で終了しました。
|
「SLL」命令や「SRL」命令では、
この様に負の数を2倍、または1/2した時に正の数になったり、
前のプログラムの様に正の数を2倍した時に負の数になったりすることが
あります。
16ビットのデータを、2の補数表現を使わず、
0〜65535の範囲として使いたい時には、これらの命令が有効です。
(ただし、通常は「WRITE」命令は2の補数表現で表示します。
非負整数として表示するには、
「2の補数表現」チェック・ボックスの
チェックを外して下さい。)
「−2」の1/2が正しく「−1」になって欲しい。
「−16385」を2倍した時の結果の「−32770」の様に
16ビットで2の補数表現を使うと表し切れない数でも、
符号ぐらいは正しくなって欲しい。
この様な場合がありますが、
この様な目的の、符号を保存する様なシフト命令に、
「SLA」命令、「SRA」命令があります。
実際にやってみましょう。
SAMPLE | | START |
| | LAD | | GR0,−1 | ;#FFFF |
| | SLA | | GR0,1 | ;#FFFF×2 |
| | WRITE | | 0 |
| | SRA | | GR0,1 | ;#FFFF×2/2 |
| | WRITE | | 0 |
| | LAD | | GR0,−16385 | ;#BFFF |
| | SLA | | GR0,1 | ;#BFFF×2 |
| | WRITE | | 0 |
| | EXIT |
| | END |
|
GR0=-2(FFFE)
GR0=-1(FFFF)
GR0=-2(FFFE)
プログラムは、PR[0016;SAMPLE+22]が指定したEXIT命令で終了しました。
|
符号が保存されていますね。
これらの「SLA」、「SRA」の様に
符号を保存した数値の計算に便利なシフトを、
「算術シフト」と呼びます。
又、その様な扱いをする数値を
「算術値」と呼ぶことがあります。
これに対して、
「SLL」、「SRL」の様に16ビット全てを同じ扱いにするシフトを、
「論理シフト」と呼びます。
又、その様な扱いをする数値を
「論理値」と呼ぶことがあります。
(「論理値」は、通常は「真」「偽」を意味するデータを指します。)
これら4つのシフト命令を、混乱しないで覚えることが出来る様に、
命令のアルファベットの意味を、次の表に示しておきます。
SLA= | Shift Left Arithmetic | (算術) |
SRA= | Shift Right Arithmetic | (算術) |
SLL= | Shift Left Logical | (論理) |
SRL= | Shift Right Logical | (論理) |
|
シフト命令では、算術値と論理値を扱っていました。
他にこの様な、算術値と論理値を扱う命令はないでしょうか。
又、算術シフトであるか論理シフトであるかは、
最後の1文字が「A」か「L」かで区別されていましたが、
最後にこの様な文字の付く命令はなかったでしょうか。
「論理」と言えば、「論理演算」がありましたね。
「論理演算」である「OR」「AND」「XOR」の扱っている値も、
「論理値」だったのです。
と言っても、「OR」「AND」「XOR」の場合は、
特別の差は無いのですが。
最後の1文字が「A」になる命令としては、
「ADDA」「SUBA」がありましたが、
これらは「算術演算」だったのです。
説明は未だですが、「CPA」もそうです。
そして、最後の1文字が「L」になる命令としては、
説明は未だですが、「ADDL」「SUBL」「CPL」がありました。
これらは、「論理演算」です。
対応する「算術演算」と同様の動作になります。
これらの命令では、
演算結果の値が算術値と論理値で表すことの出来る範囲内の値かどうかによって、
細かい違いが出てきます。
その区別は、先の章で見て行くことになります。
質問・ご意見等、お待ちしております。
小野智章(小野情報設計)
Mail to
Mail連絡先
©Copyright 1998-2001,2003,2004 小野智章(小野情報設計)
無断転載を禁止します。