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

あなたは

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

アセンブラ入門内検索

目次
アセンブラトップ
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-5.引き算

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



3-5.引き算

  昔々の世界では、減算命令がないCPUもありました。そこで前にも 説明したように「2の補数」という概念を用いて減算を実行してきました。現在のCPUでは、 どんなに安いCPUにも減算命令は用意されています。
SUB	DEST,SRC

   動作:DEST←DEST-SRC
  影響を受けるフラグ:OF,SF,ZF,AF,CF,PF
    DEST:レジスタ、メモリー
    SRC :レジスタ、メモリー、即値(ただしメモリー、メモリーの組み合わせは除く)

SBB	DEST,SRC

   動作:DEST←DEST-SRC-CF
  影響を受けるフラグ:OF,SF,ZF,AF,CF,PF
    DEST:レジスタ、メモリー
    SRC :レジスタ、メモリー、即値(ただしメモリー、メモリーの組み合わせは除く)

  減算命令も加算命令と同様にキャリーフラグを考慮する「SBB」と考慮しない「SUB」の 2つの命令が用意されている。

  「SUB」命令では、DEST(引かれる数)がSRC(引く数)より小さく結果がマイナスになる場合 は加算と逆に、桁を借りてくる。我々が日常計算する場合、引かれる数の方が小さいと、 とりあえず大きい方から小さい方を引いて、頭にマイナスをつける。例えば、「5-10」は 引かれる数の方が小さいので、とりあえず大きい数(10)から小さい数(5)を引いて、 マイナスをつけ「-5」とする。

  アセンブラの場合はもう1桁増やし、その桁が1であると仮定して計算する。例えば、 「5Bh-85h」を計算すると、図のようになる。引かれる数(5Bh)の方が小さいので、 さらに1桁上に「1」があると仮定して、15Bh-85h=D6hとなる。この場合、桁借りをしたので キャリーフラグが1になる。(OF=0,SF=1,ZF=0,他のフラグは省略)

  「SBB」命令では、キャリーフラグが1ならば、さらに1を引く。すなわち前の 引き算の結果、桁借りを起こしていたら、その分も引くことになり、「ADD」命令 の後に、「ADC」命令を実行したのと同様に、「SUB」命令後必要ならば「SBB」命令 を行う。

  「SUB」「SBB」どちらも、フラグは同様に変化し、キャリーフラグは今説明した 通りである。ZFは減算の結果が0であればZF=1、それ以外ならZF=0になる。

  符号付き整数の減算を考えた場合、80h(-127)-1=7Fh(+127)となり、引き算を したはずなのに、結果が大きくなってしまった場合に、オーバーフローを起こしたと言い、 オーバーフローフラグOF=1となる。オーバーフローを起こさなかった場合には0になる。 符号なし整数の場合はOFは無視して構わない。

  符号なし、符号付き整数のどちらも計算結果の上位1bitが1ならばSF=1、上位1bitが 0ならばSF=0となる。そのほかのフラグについては省略する。


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