←前ページへ :  INDEX :  次へ→


3-2.加算 ( Addition )

   x86系のCPUには加算1つ見ても命令が2つある。順に見ていくことにする。

ADD ( Integer Add ) :加算

ADD	DEST,SRC

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

ADC ( Add with Carry ) :キャリーも含めて加算

ADC	DEST,SRC

   動作:DEST←DEST+SRC+CF
  影響を受けるフラグ:OF,SF,ZF,AF,CF,PF
    DEST:レジスタ、メモリー
    SRC :レジスタ、メモリー、即値(ただしメモリー、メモリーの組み合わせは除く)
      
  1. 2つのオペランドを指定し、それらを加算した結果を第1オペランドに格納する。
  2. 2つのオペランドの大きさは同じでなければならない。
  3. MOV命令の時の「直接アドレス法」「間接アドレス法」「即値法」が使える。

例)
CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	.186
	ORG	100h

START:
	mov	dl,DATA1
	add	dl,DATA2
	add	dl,'0'

	mov	ah,2
	int	21h

	mov	ax,4c00h
	int	21h

DATA1	byte	5
DATA2	byte	3

	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです
「DATA1」すなわち「5」をDLに入れ、「DATA2」すなわち「3」を足して、DLは「8」になる。そこに'0'の文字コードを足すため、DLは'8'の文字コードになる。そして「INT 21h」で文字を表示して、終了する。結果、画面には「8」と表示されるプログラムである。
 
【用例】
 
MOV  AL,5  ;
2進数5を設定します。
ADD  AL,AL ;
AL=AL+ALで結果としてALを2倍(10)します。
MOV  AH,AL ;
2倍した結果をAHに保存します。
ADD  AL,AL ;
2倍した結果を更に2倍し、4倍(20)となります。
ADD  AL,AL ;
4倍した結果を更に2倍し、8倍(40)となります。
ADD  AL,AH ;
8倍とAHに保存した2倍の結果を加算して10倍(50)となります。
【用例】
 
MOV  EAX,[SRC1]   ;
メモリ上の64ビット数値1の下位32ビットを取得します。
ADD  EAX,[SRC2]   ;
メモリ上の64ビット数値2の下位32ビットと加算します。
MOV  [DEST],EAX   ;
結果の下位32ビットをメモリ上の結果に保存します。
MOV  EAX,[SRC1+4] ;
メモリ上の64ビット数値1の上位32ビットを取得します。
ADC  EAX,[SRC2+4] ;
メモリ上の64ビット数値2の上位32ビット(もしあれば下位からの桁上げ)と加算します。
MOV  [DEST+4],EAX ;
結果の上位32ビットをメモリ上の結果に保存します。(この結果、64ビットの加算となる)

←前ページへ :  INDEX :  次へ→