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 dest, src : 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