As instruções aritméticas são utilizadas para realizar as operações básicas de adição, subtração, multiplicação, divisão e incremento/decremento de registradores ou valores em memória. As flags O, Z, S, P, Cy Ac são afetadas por essas instruções.

Os registradores CS, DS, SS e ES não podem ser utilizados como operandos de instrução de soma, subtração, nultiplicação e divisão.

Para trabalhar com valores BCD, as instruções de conversão/BCD, que podem ser vistas em Conversão, devem ser utilizadas.

Mais informações sobre registradores e flags podem ser vistas em Registradores e Flags.

Notação utilizada
; Comentário
REG Registrador de uso geral
SREG Registrador de segmento
MEM Endereço de memória
IME Valor imediato
Flags
a Alterada de acordo com resultado
- Não sofre alteração
0 Sempre zero
1 Sempre um
? Indefinido

Essa instrução INC, incrementa em 1 um valor contido em registrador ou memória. Todas as flags de status são alteradas, exceto Cy.

Operação
operando <- operando + 1
Operando:
REG
MEM
F(Flags)
O: a
S: a
Z: a 
Ac:a
P: a
Cy:-
Ex:
MOV AL,1
INC AL
;AL = 2

A instrução DEC, de forma oposta à INC, decrementa em 1 um valor contido em registrador ou memória. Todas as flags de status são alteradas, exceto Cy.

Operação
operando <- operando - 1
Operando:
REG
MEM
F(Flags)
O: a
S: a
Z: a 
Ac:a
P: a
Cy:-
Ex:
MOV AL,2
DEC AL
;AL = 1

Com a instrução ADD podemos realiza a operação aritmética de adição entre registradores, valor imediato ou um valor contido em um endereço de memória. Todas as flags são alteradas por essa instrução.

Operação:
operando1 <- operando1 + operando2
Operandos:
REG, MEM
MEM, REG
REG, REG
MEM, IME
REG, IME
F(Flags)
O: a
S: a
Z: a 
Ac:a
P: a
Cy:a
Ex:
MOV AL, 1
ADD AL, 1
;AL = 2

A instrução ADC é semelhante a ADD, porém a ADC utiliza o flag Carry(Cy) como um terceiro operando ao realiza a operação de adição. Todas as flags são alteradas por essa instrução.

Operação
operando1 <- operand1 + operand2 + Cy
Operandos
REG, MEM
MEM, REG
REG, REG
MEM, IME
REG, IME
F(Flags)
O: a
S: a
Z: a 
Ac:a
P: a
Cy:a
Ex:
STC  ;Cy <- 1
MOV AL, 1  
ADC AL, 1  
;AL = 3

Usando a instrução SUB podemos realizar a operação aritmética de subtração entre registradores, valor imediato ou um valor contido em um endereço de memória. Todas as flags são alteradas por essa instrução.

Operação
operando1 <- operand1 - operand2
Operandos
REG, MEM
MEM, REG
REG, REG
MEM, IME
REG, IME
F(Flags)
O: a
S: a
Z: a 
Ac:a
P: a
Cy:a
Ex:
MOV AL, 2  
SUB AL, 1  
;AL = 2

A instrução SBB é semelhante a SUB, porém a SBB utiliza o flag Carry como "vem-um" como terceiro operando ao realiza a operação de subtração. Todas as flags são alteradas por essa instrução.

Operação
operando1 <- operand1 - operand2 - Cy
Operandos
REG, MEM
MEM, REG
REG, REG
MEM, IME
REG, IME
F(Flags)
O: a
S: a
Z: a 
Ac:a
P: a
Cy:a
Ex:
STC
MOV AL, 3  
SBC AL, 1  
;AL = 2

Com as instrução MUL e IMUL podemos realizar a operação aritmética de multiplicação de um valor, byte ou word, em um registrador ou valor em memória via AX ou AL apenas. A primeira instrução trabalha com valor não-sinalizado e a segunda trabalha com valor sinalizado que é estendido no resultado.

Operação
Para valor Byte:
AX <- AL * operando

Para valor Word:
DXAX <- AX * operando
Operandos
REG
MEM
F(Flags)
O: a
S: ?
Z: ? 
Ac:?
P: ?
Cy:a
Ex:
MOV AL, 2
MOV BL, 2
MUL BL
; AX <- 0004h

Com as instrução DIV e IDIV podemos realizar a operação aritmética de divisão de um valor, byte ou word, em um registrador ou valor em memória tendo o resultado. A primeira instrução, DIV, trabalha com valor não-sinalizado, enquanto IDIV trabalha com valor sinalizado.

Operação
Para operando Byte:
AL <- AX/operando
AH <- resto

Para operando Word:
AX <- DXAX/operando
DX <- resto
Operandos
REG
MEM
F(Flags)
O: ?
S: ?
Z: ? 
Ac:?
P: ?
Cy:?
Ex:
MOV AL, 4
MOV BL, 2
MUL BL
; AL <- 02h
; AH <- 00h
  1. 18/02/2025 - revisão 1 - ajustes pontuais
  2. 05/12/2024 - versão inicial