본문 바로가기

Assembly

4-2강 - Data Transfer, Addressing and Arithmetic 2 (Addition and Subtraction)

2. Addition and Subtraction

1) INC, DEC Instruction

1> 증감 연산자를 의미한다.

2> 사용

inc destination : destination = destination + 1

dec destination : destination = destination - 1 

3> 규칙

4> 예시 1

.data
myWord WORD 1000h
myDword DWORD 10000000h

.code
inc myWord 		; 1001h
dec myWord 		; 1000h
inc myDword 	; 10000001h
mov ax,00FFh
inc ax 			; AX = 0100h
mov ax,00FFh
inc al 			; AX = 0000h

- 마지막 line : (ax가 00FFh) al에 대해 inc 연산을 가하면 al에서의 연산 결과만 저장한다. (ah 자리의 1이 사라진다.)

 

4> 예시 2

.data
myByte BYTE 0FFh, 0

.code
mov ah,[myByte+1] ; AH = 00h
mov al,myByte ; AL = FFh
dec ah ; AH = FFh
inc al ; AL = 00h
dec ax ; AX = FEFFh

- 마지막 line : ah와 al로 따로 선언이 되어 있던 경우 ax에 대해 inc 혹은 dec 연산 시 ah, al 모두 각각 연산한다.

 

2) ADD, SUB Instruction

2> 사용

ADD destsrc : dest = dest + src 
SUB dest, src : dest = dest – src 

3> 규칙

- MOV와 같은 규칙이 적용된다.

4> 예시

.data
var1 DWORD 10000h
var2 DWORD 20000h

.code 			; ---EAX---
mov eax,var1 	; 00010000h
add eax,var2 	; 00030000h
add ax,0FFFFh 	; 0003FFFFh
add eax,1 		; 00040000h
sub ax,1 		; 0004FFFFh

 

3) NEG Instruction

1> 부호(sign)를 바꿔주는 연산

2> 사용

NEG operand : 

3> 규칙

- operand : register or memory operand

4> 0이 아닌 operand에 사용하면 Carry Flag 발생

 

5> 예시 1

.data
valB BYTE 1,0
valC SBYTE -128

.code
neg valB 		; CF = 1, OF = 0
neg [valB+1]		; CF = 0, OF = 0
neg valC 		; CF = 1, OF = 1

 

6> 예시 2

.data
valB BYTE -1
valW WORD +32767

.code
mov al,valB 		; AL = -1
neg al 			; AL = +1
neg valW 		; valW = -32767
mov ax, -32768 		; AX = 8000h
neg ax 			; AX = 8000h

 

4) Flags affected by Arithmetic

0> 특징

- ALU는 여러 개의 status flag를 가지며, status flag는 arithmetic 연산 결과로 결정된다.

- MOV instruction은 flag에 어떤 영향도 주지 않는다.

 

1> Zero flag (ZF)

- 결과(destination operand)가 0일 때 설정(set)된다.

mov cx,1
sub cx,1 	; CX = 0, ZF = 1 (set)
mov ax,0FFFFh
inc ax 		; AX = 0, ZF = 1
inc ax 		; AX = 1, ZF = 0 (clear)

 

2> Sign flag (SF)

- 결과(destination operand)가 음수일 때 설정(set)된다. (MSB의 copy와 같다.)

- 반대로 결과(destination operand)가 양수일 때 clear

mov cx,0
sub cx,1 	; CX = -1, SF = 1
add cx,2 	; CX = 1, SF = 0
mov al,0
sub al,1 	; AL = 11111111b, SF = 1
add al,2 	; AL = 00000001b, SF = 0

 

cf> Signed and Unsigned Integers A Hardware Viewpoint

문제 : CPU 명령어는 부호가 있든 없든 같은 연산을 한다.

원인 : CPU는 부호가 있는지 없는지 모른다.

해결 : 각 명령에 맞는 자료형을 적절히 사용해야 한다.

 

3> Carry flag (CF) – unsigned value out of range.

(부호 없는 자료형이 범위를 벗어날 때)

- 예시 1 (자리를 넘어간 경우 & 0 이하의 값으로 연산되는 경우)

; 자리(범위)를 넘어간 경우
mov al,0FFh
add al,1 ; CF = 1, AL = 00

; 0 이하의 값으로 연산되는 경우
mov al,0
sub al,1 ; CF = 1, AL = FF

- 예시 2

mov ax,00FFh
add ax,1 		; AX=0100h 	SF=0 ZF=0 CF=0
sub ax,1 		; AX=00FFh 	SF=0 ZF=0 CF=0
add al,1 		; AL=00h 	SF=0 ZF=1 CF=1
mov bh,6Ch
add bh,95h 		; BH=01h 	SF=0 ZF=0 CF=1
mov al,2
sub al,3 		; AL=FFh 	SF=1 ZF=0 CF=1

 

4> Overflow flag – signed value out of range.

(부호 있는 자료형이 범위를 벗어날 때)

- 예시 1

mov al,+127
add al,1 	; OF = 1, AL = 80h

mov al,7Fh
add al,1 	; OF = 1, AL = 80h

- 예시 2

mov al,-128
neg al 			; CF = 1, OF = 1
mov ax,8000h
add ax,2 		; CF = 0, OF = 0
mov ax,0
sub ax,2 		; CF = 1, OF = 0