トップ->アセンブラ入門

あなたは

人目のアセンブラの受講生です。

アセンブラ入門内検索

目次
アセンブラトップ
0. はじめに

1. 基礎
   1. レジスタとは
   2. セグメントとは

2. MOV命令
   1. MOV命令
   2. コンパイル
   3. 即値の転送
   4. メモリーへの転送
   5. データ定義疑似命令
   6. 練習問題

3. 算術演算
   1. 符号なし演算と符号付き演算
   2. 足し算
   3. 練習問題
   4. フラグ
   5. 引き算
   6. かけ算
   7. わり算
   8. INC,DEC

4. 分岐
   1. 無条件分離
   2. 比較命令
   3. 条件分離
   4. 練習問題
   5. ループ
   6. サブルーチン
   7. スタックとは
   8. PUSH,POP
   9. 練習問題

5. 論理演算
   1. AND命令
   2. OR命令
   3. XOR命令
   4. NOT命令
   5. NEG命令
   6. TEST命令
   7. 練習問題

6. シフト演算
   1. シフト
   2. ローテート
   3. 練習問題1
   4. 練習問題2

7. ストリング命令
   1. ストリング命令とは
   2. MOVS?
   3. REP
   4. DFの設定
   5. LODS?
   6. STOS?
   7. SCAS?
   8. CMPS?
   9 .練習問題

8. 入出力
   1. 概要
   2. IN命令
   3. OUT命令
   4. INS,OUTS命令

9. その他
   1. LEA
   2. XCHG
   3. NOP

10. 割り込み
   1. 割り込みとは
   2. ソフトウェア割り込み
   3. ハードウェア割り込み
   4. 割り込みベクター
   5. 割り込み処理の作り方
   6. 練習問題

11. レジスタの型変換(キャスト)

12. 卒業試験
   1. 卒業試験
   2. 画像データの格納形式
   3. インラインアセンブラ
   4. ネガポジ反転
   5. 明るくする、暗くする
   6. グレースケール
   7. 二値化
   8. 上下反転、左右反転
   9. 4分割
   10. モザイク
   11. シャープ
   12. ぼかし
   13. エンボス
   14. ディザ拡散
   15. 鉛筆を置いてください

13. 終わりに

文字コード

アセンブラ 〜MS-DOSの世界〜


・ このページの先頭に戻る
・ トップページに戻る



・ このページの先頭に戻る
・ トップページに戻る

トップ-> アセンブラ入門:3章.算術演算-> 3-1.符号なし演算と符号付き演算

←前ページへ :  トップへ :  次ページへ→



  では次に整数のお話をします。どんなプログラムでも整数は必ず出てくるので、 整数は小数よりも大事です。ただし小数ほど複雑な構造になっているわけでは ありません。まぁ、当たり前ですが・・・

符号なし整数
  もっとも単純なのが符号なし整数です。例えば8bitならば28の 数が記憶できます。すなわち、0〜255(28-1です。16bitならば、 0〜65535(216-1)ですし、32bitならば0から232-1までです。 0は00、FF(255)、などそのまんま表現するだけです。

  8bitの場合、255+10など、表現できる値を超えてしまった場合、アセンブラ、 C言語など多くのプログラム言語ではエラーにはなりません。255+10=265で、 8bitでは表現できないので、8bitに丸め込まれてしまいます。すなわち、 255を2進数で表すと(11111111)2で、10は(00001010)2で その結果の265は(100001001)2で、9桁になりますので、9桁以上を 切り捨てて、(00001001)=9になります。16bitの場合は、演算の結果が2進数で17桁 以上になった場合は17桁以上を切り捨てて、16桁に丸め込まれます。32bitも 同様で、32bitに丸め込まれます。このため、どんな言語を使っていても、勝手に 丸め込まれないようにプログラマーが注意しなくてはなりません。

  アセンブラでは、足し算を行った際に、丸め込まれたかを調べることができます。 これについては後で述べます。C言語ではわかりませんので、 必要ならば足し算を行う前に越えるかどうかをチェックしなければなりません。

  引き算の場合も同様なことが起こります。0-1はマイナスになります。 この場合、1つ上の位から桁を借りてきてマイナスします。つまり、8bit の場合、0は100hと解釈され、100h-1=FFhになります。50h-A0hはやはり マイナスになるので、1桁借りてきて、150h-A0h=B0hになります。これについても 後述します。

符号付き整数
  上位1bitを符号として扱います。上位1bitが0の時は正、1の時は負となります。 したがって、8bitの場合、正では0〜127、負は-128〜-1を表現できます。同様に 16bitでは-32768〜+32767までです。正の場合、下位7bitは上述の符号なし整数と 同じです。負の数については「2の補数」という概念で表現されます。

  例えば-5を考えると、+5を2進数で表現すると(00000101)2です。 これの「1の補数」すなわちNOTをとります。(0と1を逆にします。)すると、 (11111010)2です。これに1を加えます。すると(11111011)2 になります。これが「2の補数」の計算の仕方で、(11111011)2=-5と なります。ちなみにこれを符号なし整数で表すとFBhとなります。

  +5が(00000101)2なので、上位1bitの符号を1にして、(10000101)2 が-5になるわけではありません。

  2の補数で負の数を表現すると何が便利なのでしょうか? まだ演算装置 (いわゆるCPU)が初期の初期のころ、足し算命令はあったけれど、引き算の 命令がないCPUもありました。そこで足し算だけで引き算をする必要がありま した。その結果負の数を2の補数として表すことが考え出されたのです。

  例えば、「15-3」を考えます。これを15と-3を足すと考えます。 15=(00001111)2=0Fhで、-3=(11111101)2=FDhです。 これを足すと、上述したように9桁以上は無視されて0Ch=12となります。 引き算は行わずに引き算をすることができました。

  ところが問題もあります。8bitの場合は-128〜+127までですから、 16進数で表現すると-80h〜+7Fhです。+7Fh=(01111111)2に 1を加えると、(10000000)2となり、上位1bitが1ですので、 これは-80hになります。正の整数に1を足したら負の数になってしまいました。 これをオーバーフローといいます。これについては後述します。

  すなわち、コンピュータが数値を覚えるというのは、メモリーに記憶する だけのことですから、コンピュータにとっては今覚えた値が、正だろうが 負だろうが、小数だろうがなんだろうが関係ないわけです。プログラマーが どう判断し、コンピュータにどう扱わせるかというだけの話です。高級言語 ではある程度の判断をコンパイラがやってくれます。C言語では、この変数に 入れた値は小数なのか、符号なし整数なのか、符号付き整数なのかなどを 一番最初に宣言しなければなりません。アセンブラではすべてをプログラマが 管理しなければなりません。足し算を行う際も、符号なし整数なのか、符号付き 整数なのかによって、やり方も異なります。

  本ホームページのアセンブラ入門では、符号なし整数しか扱いませんが、 この「アセンブラ入門」に書かれていることを一通り勉強すれば、符号付き 整数の計算の仕方くらいは余裕で考えられると思います。がんばってください。


←前ページへ :  トップへ :  次ページへ→