Clique sobre os objetivos listados abaixo para navegar até o conteúdo desejado.

As instruções aritméticas aprensentadas nesta parte do tutorial são responáveis por realizar as operações de subtração: SUB, SUBA, SUBI, SUBQ E SUBX.

Todas as flags do CCR são sofrem alteração por essas instruções acima com algumas exceções.

Abaixo, a notação utilizada ao longo dos tópicos abordados nesta parte do tutorial:

Tab. 1: Notação utilizada
Símbolo Descrição
<-,->,= Atribuição
- Subtração
; Comentário
CCR
a Alterada de acordo com resultado
- Não sofre alteração
0 Sempre zero
1 Sempre um

Mais informações sobre registradores, visite Registradores e para mais informações sobre modos de endereçamento, visite Modos de Endereçamento.

Com a instrução SUB podemos realizar a operação aritmética de subtração com os registradores de dados e endereço. Quando trabalhamos com registradores de endereço, a operação com byte não é aceita.

Operação
destino <- destino - origem
Endereçamento Origem
Dx, Ax, (Ax), (Ax)+, ‑(Ax), n(Ax), n(Ax,Dx[.W|.L]|Ax[.W|.L]), absoluto.W, absoluto.L, n(PC), n(PC,Dx[.W|.L]|Ax[.W|.L]) e #imediato
Endereçamento Destino
Dx, (Ax), (Ax)+, ‑(Ax), n(Ax), n(Ax,Dx[.W|.L]|Ax[.W|.L]), absoluto.W, absoluto.L 
Tamanho do dado
Byte(Dx apenas), Word e Longword
CCR
X: C
N: a
Z: a 
V: a
C: a; 0 se houver "vai um", 1 caso contrário
Sintaxe
SUB.B Dx,Dy ; 
SUB.L  (Ax),Dx
SUB.W -(Ax),Dx
SUB.B (Ax)+,Dx
SUB.L $absoluto.L,Dx
Exemplo:
; D0 = 00000001 D1 = 00000001
SUB.B D0,D1;
; D0 = 00000001 D1 = 00000000
    
SUB.L  (A0),D2
SUB.W -(A1),D3
SUB.B (A3)+,D4
SUB.W  $FFFF,D5

A instrução SUBA funciona de forma semelhante à instrução SUB, porém trabalha apenas com registradores de endereço e não altera as flags contidas no CCR.

Operação
destino <- destino - origem
Endereçamento origem
Dx, Ax, (Ax), (Ax)+, ‑(Ax), n(Ax), n(Ax,Dx[.W|.L]|Ax[.W|.L]), absoluto.W, absoluto.L, n(PC), n(PC,Dx|Ax) e #imediato
Tamanho dos dados
Word e Longword
CCR
X: -
N: -
Z: -
V: -
C: -
Sintaxe
SUBA Ax, Ay ; 
SUBA.L  (Ax), Ay
SUBA.W -(Ax), Ay
SUBA.L $absoluto.L, Ay
Exemplo:
; A0 = 00000001 A1 = 00000001
SUBA A0,A1;
; A0 = 00000001 A1 = 00000000
    
SUBA.L  (A0),A2
SUBA.W -(A3),A4
SUBA.W  $FFFF,A5

A instrução SUBI é semelhante a instrução SUB, mas utiliza um valor imediato como operando origem da subtração.

Operação
destino <- destino - imediato
Endereçamento Origem
#imediato
Endereçamento Destino
Dx, (Ax), (Ax)+, ‑(Ax), n(Ax), n(Ax,Dx[.W|.L]|Ax[.W|.L]), absoluto.W, absoluto.L 
Tamanho do dado
Byte, Word e Longword
CCR
X: C
N: a
Z: a 
V: a
C: a; 1 se houver "vai um", 0 caso contrário
Sintaxe
SUBI.B #imediato,Dy ; 
SUBI.W #imediato,Dx
SUBI.L #imediato,(An)
SUBI.W #imediato,$FFFF00
Exemplo:
; D0 = 00000001 D1 = 00000001
SUBI.W #FFFE,D1;
; D0 = 00000001 D1 = 0000FFFF
    
SUBI.L #$00001234,D2
SUBI.W #$1234,D3
SUBI.B #12,D4
SUBI.W #$FFFF,D5

Com instrução SUBQ também é semelhante a instrução SUB, mas um valor imediato de 8-bits, entre 1 e 7 é utilizado como valor imediato como operando de origem.

Se um registrador de endereço é utilizado, as flags do CCR não sofrem alteração e utilizar o tipo de dado Byte não é aceito.

Operação
destino <- #imediato(1~7)
Endereçamento Origem
#imediato
Endereçamento Destino
Dx, Ax, (Ax), (Ax)+, ‑(Ax), n(Ax), n(Ax,Dx[.W|.L]|Ax[.W|.L]), absoluto.W, absoluto.L
Tamanho do dado
Byte, Word, Longword
CCR
X: C
N: a
Z: a
V: a
C: a ; 0 se "vem um" , 1 caso contrário
Sintaxe:
SUBQ.B #imediato,Dx
SUBQ.W #imediato,Ax
SUBQ.L #imediato,(Ax)
SUBQ.L #imediato,-(Ax)
SUBQ.L #imediato,(Ax)+
Exemplo:
; D0=FFFFFF07
SUBQ #$3,D0
; D0 = FFFFFF04

; D1 = 000000FF
SUBQ.W #$2,D1
; D1 = 000000FD

A instrução SUBX é semelhante a instrução SUB, mas inclui a flag Extend(X) na operação de subtração como operando. Todas as flags são alteradas e suporta apenas 2 modos de endereçamento como origem e destino.

Operação
destino <- destino - origem - X
Endereçamento Origem
Dx, ‑(Ax)
Endereçamento Destino
Dx, ‑(Ax) 
Tamanho do dado
Byte, Word e Longword
CCR
X: C
N: a
Z: a 
V: a
C: a; 0 se houver "vem um", 1 caso contrário
Sintaxe
SUBX.B Dx,Dy
SUBX.W Dx,Dy
SUBX.W -(Ax),-(Ax)
Exemplo:
;omitido
MOVE #3,D0 ; 4 bytes
;A1 = byte fim valor 1
;A2 = byte fim valor 2
loop:
    SUBX -(A1),-(A2)
DB D0, loop
  1. 05/09/2024 - Revisão 1 - Correção em erros gramaticais, descrição de SUBQ e título SUBI.
  2. 11/03/2024 - versão inicial