←前へ :  INDEX :  次へ→


  ところで、「AL=90h」の時「ADD AL,90h」とした場合はどうなるでしょうか? 90h+90h=120hで、ALレジスタには収まりません。「AX=90h」の時に、「ADD AX,90h」とすれば、AX=120hで収まります。収まりきれない場合は、「AL=20h」となり、オーバーフローした桁は無視されます。

  「ADD」命令ではレジスタの長さ(80286以下のCPUは16bit、80386以上では32bit)しか計算できないのでは、僕のお小遣いを計算する分には十分ですが、銀行や大企業の場合は困ります。私たちは日常の計算の中で1桁の足し算は暗算でできますが、桁が多くなると、筆算をします。

  このように私たちは繰り上がりという概念を用いて計算しています。
なんとか、この繰り上がりを用いてもっと大きい数を計算できないか、これを解決するのが、「ADC」命令です。

  実は上の例では、ALレジスタは20hになるが、桁上がりがあるとキャリーフラグというフラグが「1」に変化します。桁上がりがない場合にはキャリーフラグは「0」になります。

  「ADC」は基本的には「ADD」命令と同じであるが、このキャリーフラグが「0」であれば、 DEST←DEST+SRCを行い、キャリーフラグが「1」であれば、さらに1を足します。つまり、1桁目を足す場合は「ADD」、2桁目より上を足す場合は「ADC」を用いることで、 32bit(80286以下では16bit)よりも桁の多い数の計算が可能となる。

ADC	DEST,SRC

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

例)
「ADD AX,BX」を8bitレジスタの足し算で書き換えると次のようになる。
	mov	ax,DATA1
	mov	bx,DATA2

	add	al,bl
	adc	ah,bh

	mov	ANS,ax

←前へ :  INDEX :  次へ→