# Intel IA-32 Assembly Tutorial

#### Addition and Subtraction Instructions

There are five integer addition/subtraction instructions: `INC DEC ADD SUB NEG`.

`INC` and `DEC` increment and decrement by one.

``````	.data
var1 DWORD 1
.code
xor eax,eax     ;set eax to zero
inc eax         ;eax equals one
dec eax         ;eax equals zero again
dec var1        ;var1 equals zero
``````

`ADD` adds two operands. The first operand is the destination and the second operand is the source. One operand can be a memory variable or both can be registers.

``````	.data
var1 DWORD 9
.code
mov eax,1       ;set eax to one
add eax,var1    ;eax equals ten
``````

`SUB` subtracts two operands. The first operand is the destination and the second operand is the source. One operand can be a memory variable or both can be registers.

``````	.data
var1 DWORD 9
.code
mov eax,19       ;set eax to 19
sub eax,var1     ;eax equals ten
``````

`NEG` reverses the sign of a number in a registry or memory location.

The zero flag (ZF) is set when the destination operand of an arithmetic instruction is assigned a value of zero.

``````
mov eax,1
dec eax          ;eax = 0, ZF = 1
mov eax,FFFFFFFFh
inc eax          ;eax = 0, ZF = 1
inc eax          ;eax = 1, ZF = 0
``````

The sign flag (SF) is set when the result of an arithmetic instruction is negative.

``````	mov eax,0
sub eax,1        ;eax = -1, SF = 1
add eax,2        ;eax = 1, SF = 0
``````

Significant only when the CPU performs an unsigned arithmetic operation, the carry flag (CF) is set if the result of an unsigned addition operation is too large or too small for the destination operand.

``````	mov al,FFh
add al,1         ;AL = 0, CF = 1
;   1 1 1 1 1 1 1 1 <-- carry

;   1 1 1 1 1 1 1 1 <-- AL (FFh)
;+  0 0 0 0 0 0 0 1
;-- ------- -------
; 1 0 0 0 0 0 0 0 0
``````

The same applies to subtracting a larger unsigned value from a smaller one; the carry flag (CF) is set and the operand is invalid.

``````	mov al,1
sub al,2         ;AL = invalid, CF = 1
``````

`INC` and `DEC` do not affect the carry flag.

Performing signed arithmetic is the only time that the overflow flag (OF) is relevent. For example, a signed byte has a range of of -128 to +127.

``````	mov al,+127
add al,1         ;OF = 1
mov al,-128
sub al,1         ;OF = 1
``````

`NEG` produces an invalid result if, for example, moving -128 into AL, executing `NEG`, +128 can not be stored in AL and the overflow flag (OF) is set.

``````	mov al,-128
neg al           ;OF = 1
``````
<< < [Page 5 of 14] > >>