←前へ :  INDEX :  次へ→


  3-3.練習問題の解答をフラグとALレジスタの変化をあわせて見てみる。
		                   CF PF ZF SF OF AL
	mov	si,offset DATA1    ?  ?  ?  ?  ?  ??
	mov	di,offset DATA2    ?  ?  ?  ?  ?  ??
	mov	bx,ANS             ?  ?  ?  ?  ?  ??

	mov	al,[si]            ?  ?  ?  ?  ?  FF
	add	al,[di]            1  1  1  0  0  00
	mov	[bx],al            1  1  1  0  0  00

	mov	al,[si+1]          1  1  1  0  0  FF
	adc	al,[di+1]          1  1  1  0  0  00
	mov	[bx+1],al          1  1  1  0  0  00

	mov	al,[si+2]          1  1  1  0  0  FF
	adc	al,[di+2]          1  1  1  0  0  00
	mov	[bx+2],al          1  1  1  0  0  00

	mov	al,[si+3]          1  1  1  0  0  EF
	adc	al,[di+3]          0  1  0  1  0  F0
	mov	[bx+3],al          0  1  0  1  0  F0 

	mov	ax,4c00h
	int	21h

DATA1	dd	0EFFFFFFFh
DATA2	dd	1
ANS	dd	?
「?」は前の結果が残っているため、不明
最初の「ADD」命令以前
フラグの変わらない「MOV」命令なので、フラグの値は変化しない。

最初の「ADD」命令
  1. FFh+01h=100hはALレジスタに収まりきれず、桁があがっているので、CF(キャリーフラグ)は「1」になる
  2. FFh+01h=100h→AL=00hなので、PF(パリティフラグ)は「1」になる
  3. ALレジスタは00hが入るので、ZF(ゼロフラグ)は「1」になる
  4. ALレジスタは00hで、最上位ビットは「0」。したがってSF(サインフラグ)は「0」になる
  5. 符号なし演算の場合はオーバーフローになったが、この加算を符号あり演算と解釈すると、-1+1=0でオーバーフローしていないので、OF(オーバーフローフラグ)は「0」になる

次の「ADC」命令以前
フラグの変わらない「MOV」命令なので、フラグの値は変化しない。

次の「ADC」命令
FFh+00h+CY(1)=100hなので、最初の「ADD」命令と同じ結果になる。

次の「ADC」命令以前
フラグの変わらない「MOV」命令なので、フラグの値は変化しない。

次の「ADC」命令
FFh+00h+CY(1)=100hなので、最初の「ADD」命令と同じ結果になる。

最後の「ADC」命令以前
フラグの変わらない「MOV」命令なので、フラグの値は変化しない。

最後の「ADC」命令
  1. EFh+00h+CY(1)=F0hなので、桁あふれしていないのでCFは「0」になる
  2. AL=F0hとなるので、2進数で考えると「11110000」。1の数は4つ。したがってPFは「0」になる
  3. AL≠0なので、ZFは「0」になる
  4. AL=F0hとなるので、2進数で考えると「11110000」で、最上位ビットは「1」。したがってSF(サインフラグ)は「1」になる
  5. 符号付き演算としてみてもオーバーフローしない。したがってOFは「0」になる

←前へ :  INDEX :  次へ→