organização básica de computadores e linguagem de...

37
Organização Básica de computadores e linguagem de montagem 2 o Semestre de 2011 Prof. Edson Borin

Upload: duongthuy

Post on 06-Jan-2019

212 views

Category:

Documents


0 download

TRANSCRIPT

Organização Básica de computadores e linguagem de

montagem

2o Semestre de 2011

Prof. Edson Borin

Aula 4

Instruções do Faíska

Descritor de instruções na apostila

Capítulo 3

O processador Faíska

Neste capítulo iniciaremos o estudo mais detalhado do repertório de instruções do

processador Faíska, ilustrando com exemplos de trechos de programas o uso das

diversas instruções. As instruções serão apresentadas usando um descritor no for-

mato de uma tabela, como o mostrado na Figura 3, contendo o mnemônico da ins-

trução em destaque em uma aba (MNE na figura), o nome, a sintaxe do comando

correspondente em linguagem de montagem, a operação descrita de forma sucinta,

e a codificação. O descritor inclui também um campo Flags, cujo significado será

introduzido mais adiante, na Seção 3.2.1.

MNE

Nome da instrução

Sintaxe Operação Flags Codificação

31 0

Figura 3.1: Formato do descritor de instruções

As instruções serão apresentadas em grupos: transferência de dados, operações

aritméticas, instruções para controle de fluxo e operações lógicas.

3.1 Transferência de dados

Instruções de transferência de dados são as que permitem a transferência de dados

entre dois registradores do processador ou entre a memória e um registrador. Um

exemplo de instrução de transferência de dados é a instrução “carrega registrador

7

Tipos de Instruções

• Instruções para transferência de dados–Entre registradores e entre memória e registradores

• Instruções aritméticas• Instruções lógicas• Instruções de desvio• Entrada e Saída

Instruções para transferência de dados

Tranferência de dados entre registradores

8 CAPÍTULO 3. O PROCESSADOR FAÍSKA

com valor imediato”, que já foi introduzida no capítulo anterior. Nesta seção iremos

estudar as outras instruções para transferência de dados do repertório de instruções

do Faíska.

3.1.1 Transferência entre registradores

Os operandos para instruções de transferência entre registradores são sempre dois

registradores: o registrador destino (operando mais à esquerda) e o registrador fonte

(operando mais à direita). A operação executada é muito simples: o valor do regis-

trador fonte é copiado para o registrador destino.

MOV

Carrega registrador com registrador

Sintaxe Operação Flags Codificação

mov rdest, rfonte rdest ← rfonte –31 0

00 rdest rfonte

Qualquer dos registradores de propósito geral do Faíska (r0 a r15) pode ser

usado como registrador destino ou fonte.

Exemplo 1

1 ; exemplo de instrução que copia o valor de um2 ; registrador para outro34 mov r1, r5 ; essa instrução é codificada usando uma5 ; palavra: 00000105h6

Antes

00 00 01 05 00100h

000fch

00104h

ff ff ff ffr1Memória

11 11 11 11r5

00 00 01 00ip

Processador

Tranferência de dados entre registradores

• Exemplo

mov r1, r5 ; Em ling. de máquina: 00000105h

8 CAPÍTULO 3. O PROCESSADOR FAÍSKA

com valor imediato”, que já foi introduzida no capítulo anterior. Nesta seção iremos

estudar as outras instruções para transferência de dados do repertório de instruções

do Faíska.

3.1.1 Transferência entre registradores

Os operandos para instruções de transferência entre registradores são sempre dois

registradores: o registrador destino (operando mais à esquerda) e o registrador fonte

(operando mais à direita). A operação executada é muito simples: o valor do regis-

trador fonte é copiado para o registrador destino.

MOV

Carrega registrador com registrador

Sintaxe Operação Flags Codificação

mov rdest, rfonte rdest ← rfonte –31 0

00 rdest rfonte

Qualquer dos registradores de propósito geral do Faíska (r0 a r15) pode ser

usado como registrador destino ou fonte.

Exemplo 1

1 ; exemplo de instrução que copia o valor de um2 ; registrador para outro34 mov r1, r5 ; essa instrução é codificada usando uma5 ; palavra: 00000105h6

Antes

00 00 01 05 00100h

000fch

00104h

ff ff ff ffr1Memória

11 11 11 11r5

00 00 01 00ip

Processador

Tranferência de dados entre registradores

• Exemplo

mov r1, r5 ; Em ling. de máquina: 00000105h

8 CAPÍTULO 3. O PROCESSADOR FAÍSKA

com valor imediato”, que já foi introduzida no capítulo anterior. Nesta seção iremos

estudar as outras instruções para transferência de dados do repertório de instruções

do Faíska.

3.1.1 Transferência entre registradores

Os operandos para instruções de transferência entre registradores são sempre dois

registradores: o registrador destino (operando mais à esquerda) e o registrador fonte

(operando mais à direita). A operação executada é muito simples: o valor do regis-

trador fonte é copiado para o registrador destino.

MOV

Carrega registrador com registrador

Sintaxe Operação Flags Codificação

mov rdest, rfonte rdest ← rfonte –31 0

00 rdest rfonte

Qualquer dos registradores de propósito geral do Faíska (r0 a r15) pode ser

usado como registrador destino ou fonte.

Exemplo 1

1 ; exemplo de instrução que copia o valor de um2 ; registrador para outro34 mov r1, r5 ; essa instrução é codificada usando uma5 ; palavra: 00000105h6

Antes

00 00 01 05 00100h

000fch

00104h

ff ff ff ffr1Memória

11 11 11 11r5

00 00 01 00ip

Processador

3.1. TRANSFERÊNCIA DE DADOS 9

Depois

00 00 01 05 00100h

000fch

00104h

11 11 11 11r1Memória

11 11 11 11r5

00 00 01 04ip

Processador

No exemplo acima são mostrados o estado antes e após a execução do trecho

de programa em linguagem de montagem, tanto do processador como da memória.

Em todos os exemplos seguintes o mesmo esquema será utilizado. No processador

são mostrados apenas os registradores importantes para entender a execução do

trecho de programa; os registradores e posições de memória que tiveram seus valores

alterados são mostrados em tom cinza após a execução.

3.1.2 Transferência da Memória para um registrador

O Faíska possui diferentes instruções para transferência de valores da memória para

um registrador, cada uma com modos de endereçamento distintos. As instruções de

transferência da memória para registrador no Faíska utilizam três modos de endere-

çamento: endereçamento imediato, endereçamento direto e endereçamento indireto

por registrador.

Carrega registrador com endereçamento imediato

No endereçamento imediato, o valor do operando faz parte do próprio código da ins-

trução. Na instrução “carrega registrador com endereçamento imediato” o registra-

dor destino é carregado com o valor do operando. E como o valor do operando é

codificado na própria instrução, o valor carregado no registrador é sempre o mesmo.

Em outras palavras, sempre que uma particular instrução desse tipo for executada,

o registrador destino será carregado sempre com o mesmo valor. Dessa forma, essa

instrução é utilizada para carregar um valor constante no registrador destino. Com-

pare o efeito dessa instrução com a instrução “carrega registrador com endereça-

mento direto”, introduzida no capítulo anterior. No endereçamento direto, o valor

carregado no registrador é o valor corrente de uma posição de memória. Como esse

valor pode ser alterado pelo programa, uma mesma instrução “carrega registrador

com endereçamento direto” pode carregar diferentes valores no registrador destino

a cada vez que é executada.

O Faíska possui duas instruções de carga de registrador com endereçamento

imediato: uma em que a constante é codificada em apenas um byte e uma em que

Tranferência de dados entre Mem. e Reg.

• Leitura: copiar dados da memória para registradores. Instruções de carga, ou load

• Escrita: copiar dados de registradores para memória. Instruções de armazenamento, ou store

• A instrução de load ou store tem que especificicar o registrador e a posição de memória:–Registrador vai em rd ou rf.–E a posição de memória vai em...

Tranferência de dados entre Mem. e Reg.

• E a posição de memória vai em... –Depende do modo de endereçamento.

• Modo de endereçamento imediato• Modo de endereçamento direto• Modo de endereçamento indireto por

registrador–Modo de endereçamento indireto por registrador com deslocamento

Tranferência de dados entre Mem. e Reg.

• Endereçamento imediato

• O valor está codificado na própria instrução. –É uma constante

• Duas codificações distintas–Valor pode ser representado em uma palavra–Valor pode ser representado em um byte

Tranferência de dados entre Mem. e Reg.

• Endereçamento imediato: set10 CAPÍTULO 3. O PROCESSADOR FAÍSKA

SET

Carrega registrador com endereçamento imediato

Sintaxe Operação Flags Codificação

set rdest, expr8 rdest ← ext(imd8) –31 0

01 imd8 rdest

set rdest, expr32 rdest ← imd32 –

31 0

02 rdest

31 0

imd32

a constante é codificada em 32 bits. No caso em que a constante é codificada em 32

bits, a instrução ocupa duas palavras. Para constantes que podem ser representadas

em 8 bits, a instrução utiliza o campo imd8 para armazenar a constante como um

inteiro com sinal em complemento de dois. Assim, esta forma só permite carregar

constantes entre−128 e 127. Como veremos, na programação em linguagem de mon-

tagem muitas vezes utilizamos constantes dentro desse intervalo, o que nos permite

utilizar a forma mais econômica com bastante freqüência. É importante notar que

todos os 32 bits do registrador destino são carregados pela instrução set, mesmo na

sua forma mais curta. Nesse caso, quando um valor imd8 positivo é carregado em

um registrador, os 24 bits mais significativos do registrador são zerados. Quando o

campo imd8 tem um valor negativo, os 24 bits mais significativos do registrador des-

tino recebem o valor 1, de forma a fazer com que o registrador tenha o valor negativo

correto. Ou seja, o bit de sinal do operando imd8 é estendido para os bits mais signi-

ficativos do registrador destino. O fato de que o bit de sinal de imd8 é estendido para

compor o valor de 32 bits é mostrado no campo operação do descritor pela expressão

ext(imd8).

Note que na descrição da sintaxe do comando em linguagem de montagem apa-

rece o termo expr8, que representa uma expressão inteira, que quando avaliada deve

resultar em um inteiro de 8 bits com sinal.

Exemplo 2

1 ; exemplo de instrução de carga de registrador com valor2 ; constante (endereçamento imediato)34 set r3, -1 ; instrução é codificada em uma5 ; palavra: 01ff0300h6

Tranferência de dados entre Mem. e Reg.

• Endereçamento imediato: set • Exemplo

; Se a constante cabe em 1 byte, a ; instrução é codificada em uma palavraset r3, -1 ; Em ling. de máq.: 01ff0300h

3.1. TRANSFERÊNCIA DE DADOS 11

Antes

22 22 22 22r3

Memória

00 00 10 00ip01000h

01004h

01 ff 03 00

Processador

Depois

ff ff ff ffr3

Memória

00 00 10 04ip01000h

01004h

01 ff 03 00

Processador

Exemplo 3

1 ; outros exemplos de instrução de carga de registrador com2 ; endereçamento imediato, com uma constante que não pode ser3 ; representada em 8 bits.45 set r9, 400h ; um valor que não pode ser6 ; representado em 8 bits7 ; código da instrução ocupa8 ; duas palavras:9 ; primeira palavra 02000900h

10 ; segunda palavra 00000400h11 set r12, var1 ; carrega endereço de var112 ; código da instrução ocupa13 ; duas palavras:14 ; primeira palavra 02000c00h15 ; segunda palavra 00070000h16 ...1718 org 70000h1920 var1: ds 4 ; uma variável qualquer21 ; montada no endereço 70000h

Tranferência de dados entre Mem. e Reg.

• Endereçamento imediato: set • Exemplo

; Se a constante não cabe em 1 byte, a ; instrução é codificada em duas palavrasset r3, 400h ; Em ling. de máq.: 02000300h ; 00000400h

Memória

10ch

108h

00 00 04 00h

Processador

22 22 22 22

ip

r3 02 00 03 00h

00 00 01 08

Tranferência de dados entre Mem. e Reg.

• Endereçamento direto

• A instrução contém o endereço do operando. –A instrução sempre lê do mesmo endereço de memória.•O endereço é sempre o mesmo (constante)•O dado na memória pode ser modificado.

Tranferência de dados entre Mem. e Reg.

• Endereçamento direto: ld (leitura)

3.1. TRANSFERÊNCIA DE DADOS 13

representada na codificação como imd32. No entanto, na maioria dos casos expr32 é

na realidade apenas um rótulo, associado a uma variável. O montador monta na

segunda palavra da instrução o endereço associado ao rótulo.

LD

Carrega registrador com endereçamento direto

Sintaxe Operação Flags Codificação

ld rdest, expr32 rdest ← mem[imd32] –

31 0

03 rdest

31 0

imd32

Note que para executar uma instrução ld o processador faz três acessos à me-

mória: um acesso no endereço do ip corrente, para a busca da primeira palavra da

instrução; outro acesso no endereço do ip corrente mais quatro, para a busca do en-

dereço do operando (imd32, segunda palavra da instrução); e ainda outro acesso para

a busca do valor operando (no endereço retirado no segundo acesso).

Exemplo 4

1 ; exemplo de instrução carrega registrador com2 ; endereçamento direto34 ld r10, cont ; exemplo de instrução ld5 ; código da instrução ocupa6 ; duas palavras:7 ; primeira palavra 03000a00h8 ; segunda palavra 00002000h9 ...

1011 org 2000h12 cont: ds 4 ; uma variável qualquer13 ; montada no endereço 2000h

Tranferência de dados entre Mem. e Reg.

• Endereçamento direto: ld (leitura) • Exemplo

...  ld  r10, cont... org 2000hcont: ds 4

Memória

00 00 20 00h

Processador

55 55 55 55

ip

r10 03 00 0a 00h

00 00 01 00

2000h22 22 22 22

104h

100h

Tranferência de dados entre Mem. e Reg.

• Endereçamento indireto por registrador: ld

• A instrução indica um registrador que contém o endereço de memória a ser lido. –A instrução pode ler de posições distintas da memória.

–A posição é determinada pelo conteúdo do registrador.

Tranferência de dados entre Mem. e Reg.

• Endereçamento indireto por registrador: ld

3.1. TRANSFERÊNCIA DE DADOS 15

LD

Carrega registrador com endereçamento indireto por registrador

Sintaxe Operação Flags Codificação

ld rdest, (rfonte) rdest ← mem[rfonte] –31 0

04 rdest rfonte

1 ; instrução carrega registrador com endereçamento2 ; indireto por registrador34 ld r6, (r5) ; código da instrução ocupa uma5 ; uma palavra: 04000605h

Antes

00 00 00 01 0300ch

03008h

03010h

00 00 30 0cr5

Memória

ff ff ff f0r6

00 00 01 acip

001ach

001b0h

04 00 06 05

Processador

Depois

00 00 00 01 0300ch

03008h

03010h

00 00 30 0cr5

Memória

00 00 00 01r6

00 00 01 b0ip

001ach

001b0h

04 00 06 05

Processador

Tranferência de dados entre Mem. e Reg.

• Endereçamento indireto por registrador: ld• Exemplo

...  ld  r6, (r5)...

Memória

...

Processador

00 00 30 0c

ip

r5

04 00 06 05h

00 00 01 ac

300ch00 00 00 01

1b0h

1achff ff ff f0r6

Tranferência de dados entre Mem. e Reg.

• Endereçamento indireto por registrador mais constante: ld

• A instrução indica um registrador rfonte e um deslocamento imd8. O valor de rfonte é adicionado ao deslocamento imd8 (com sinal) para definir o endereço a ser acessado.

Tranferência de dados entre Mem. e Reg.

• Endereçamento indireto por registrador mais constante: ld

16 CAPÍTULO 3. O PROCESSADOR FAÍSKA

Carrega registrador com endereçamento indireto por registrador mais uma

constante

A instrução “carrega registrador com endereçamento indireto por registrador mais

uma constante” é na verdade a mesma instrução que “carrega registrador com en-

dereçamento indireto por registrador”. Apresentamos as duas instruções separa-

damente apenas como forma mais didática de introduzir o modo de endereçamento

“indireto por registrador mais constante”. Nesse novo modo de endereçamento o ope-

rando fonte é uma expressão de adição, entre parênteses, em que um termo é o nome

de um registrador e o outro termo é uma expressão constante com valor entre −128

e 127. O termo constante é codificado no campo imd8; o endereço efetivo é calculado

efetuando a adição do valor do registrador com o valor de imd8 com o sinal esten-

dido. O fato de que o bit de sinal de imd8 é estendido para compor o valor de 32 bits

é mostrado no campo Operação do descritor pela expressão ext(imd8).

LD

Carrega registrador com endereçamento indireto por registrador mais

uma constante

Sintaxe Operação Flags Codificação

ld rdest, (rfonte + expr8)rdest ←

mem[rfonte + ext(imd8)]–

31 0

04 imd8 rdest rfonte

Exemplo 6

1 ; instrução carrega registrador com endereçamento2 ; indireto por registrador mais uma constante34 ld r2, (r3+8) ; código da instrução ocupa uma5 ; uma palavra: 04080605h6 ld r6, (r5-4) ; código da instrução ocupa uma7 ; uma palavra: 04fc02h

Tranferência de dados entre Mem. e Reg.

• Endereçamento indireto por registrador mais constante: ld

• Exemplo

...  ld  r6, (r5+4)...

Memória

...

Processador

00 00 30 0c

ip

r5

04 04 06 05h

00 00 01 b0

300ch00 00 00 01

1b4h

1b0hff ff ff f0r6

00 00 00 02 304ch

Tranferência de dados entre Mem. e Reg.

• Todas as instruções de leitura da memória tem uma versão de 1 byte: ldb

18 CAPÍTULO 3. O PROCESSADOR FAÍSKA

Transferência de bytes entre a memória e um registrador

Como é muito comum a necessidade de manipular valores de 8 bits (especialmente

caracteres), o Faíska inclui também instruções para carregar um byte da memória

em um registrador. Na instrução “Carrega registrador com byte da memória”, ape-

nas um byte é carregado da memória para o registrador destino. O byte carregado

é colocado nos 8 bits menos significativos do registrador destino; os 24 bits mais

significativos do registrador são zerados.

O mnemônico utilizado pelo montador é ldb; como no caso da instrução ld, há

dois modos de endereçamento possíveis: direto e indireto por registrador mais uma

constante.

LDB

Carrega registrador com byte da memória

Sintaxe Operação Flags Codificação

ldb rdest, expr32 rdest ← mem8[imd32] –

31 0

07 rdest

31 0

imd32

ldb rdest, (rfonte + expr8)rdest ←

mem8[rfonte + ext(imd8)]–

31 0

08 imd8 rdest rfonte

LDB

Carrega registrador com byte da memória

Sintaxe Operação Flags Codificação

ldb rdest, expr32 rdest ← mem8[imd32] –

31 0

07 rdest

31 0

imd32

ldb rdest, (rfonte + expr8)rdest ←

mem8[rfonte + ext(imd8)]–

31 0

08 imd8 rdest rfonte

Novamente, é interessante notar que os modos de endereçamento “indireto por

registrador” e “indireto por registrador mais uma constante” são implementados

Tranferência de dados entre Mem. e Reg.

• Para cada instrução de leitura de palavras da memória ld há uma instrução para escrita de palavras na memória st.

3.1. TRANSFERÊNCIA DE DADOS 21

ST

Armazena de registrador na memória

Sintaxe Operação Flags Codificação

st (rdest + expr8), rfontemem[rdest+ext(imd8)]←

rfonte–

31 0

05 rdest rfonte

st (rdest), expr32 mem[imd32]← rfonte –

31 0

06 rfonte

31 0

imd32

Armazena registrador em memória

Exemplo 8

1 ; exemplo de instrução armazena registrador na memória23 st var, r7 ; carrega byte cujo endereço4 ; é var5 ; código da instrução ocupa6 ; duas palavras:7 ; primeira palavra 05000007h8 ; segunda palavra 00001000h9 st (r4), r3 ; r5 tem endereço do byte que

10 ; queremos armazenar; código da11 ; instrução ocupa uma12 ; palavra: 06000403h1314 ...1516 org 1000h1718 var: ds 4 ; uma variável qualquer montada no19 ; endereço 1000h

Tranferência de dados entre Mem. e Reg.

• Para cada instrução de leitura de byte da memória ldb há uma instrução para escrita de byte na memória stb.3.1. TRANSFERÊNCIA DE DADOS 23

STB

Armazena byte de registrador na memória

Sintaxe Operação Flags Codificação

stb (rdest), rfonte rdest ← mem8[rfonte] –31 0

0a rdest rfonte

stb (rdest), expr32 mem8[imd32]← rfonte –

31 0

0a rdest

31 0

imd32

1 stb carac+2, r4 ; carrega byte cujo endereço2 ; é carac+23 ; código da instrução ocupa4 ; duas palavras:5 ; primeira palavra 09000004h6 ; segunda palavra 00002002h7 stb (r5), r2 ; r5 tem endereço do byte que8 ; queremos armazenar; código9 ; da instrução ocupa uma

10 ; palavra: 0a000502h1112 ...1314 org 2000h1516 carac:17 ds 8 ; uma variável qualquer que18 ; representa uma sequência de19 ; 8 bytes montada a partir do20 ; endereço 2000h

Exemplo// Trecho de programa em C

#define TAMANHO 256

int a, b;char c;

a = TAMANHO;b = a;c = ‘a’;

Exemplo// Trecho de programa em C

#define TAMANHO 256

int a, b;char c;

a = TAMANHO;b = a;c = ‘a’;

; Tradução para linguagem de ; montagem

TAMANHO equ 256

; reserva espaço para as variáveis org 20ha: ds 4b: ds 4c: ds 1 org 100h set r0, TAMANHO st a, r0 st b, r0 set r1, ‘a’ stb c, r1

Instruções Aritméticas

Instruções Aritméticas: Add

26 CAPÍTULO 3. O PROCESSADOR FAÍSKA

ADD

Soma

Sintaxe Operação Flags Codificação

add rdest, expr8 rdest ← rdest + ext(imd8) CSZO

31 0

10 imd8 rdest

add rdest, rfonte rdest ← rdest + rfonte CSZO

31 0

11 rdest rfonte

3.2.1 Soma

Bits de estado

Note que na instrução add pela primeira vez o campo Flag do descritor de instrução

não está vazio, e contém quatro letras. Essas letras representam bits de estado (em

inglês, flags). No Faíska os bits de estado são:

• C: carry (vai-um). Ligado se operação causou vai-um (carry-out) ou vem-um

(carry-in), desligado caso contrário.

• Z: zero. Ligado se o resultado foi zero, desligado caso contrário.

• S: sinal. Cópia do bit mais significativo do resultado; considerando aritmética

com sinal, se S igual a zero, o número é maior ou igual a zero. Se S igual a 1,

resultado é negativo.

• O: overflow. Ligado se ocorreu estouro de campo; calculado como o ou-exclusivo

entre o vem-um e o vai-um do bit mais significativo do resultado.

No descritor de instruções o campo Flag indica quais os bits de estado são afe-

tados pela instrução; no caso da instrução add, todos os bits são afetados. Um bit

de estado guarda a informação do resultado da última instrução executada que o

afetou. Isto é, se uma instrução não afeta um determinado bit de estado, este per-

manece com o mesmo valor anterior à execução da instrução. Bits de estado não são

alterados por operações de transferência de dados.

Os bits de estado são armazenados em um registrador especial no Faíska, que

não é acessível através de instruções de carga. Nas figuras dos exemplos, esse regis-

trador especial é mostrado com o nome flags. Veremos mais adiante como os bits de

estado são utilizados para controlar o fluxo de execução de um programa.

Instruções Aritméticas: Add

• FLAGS (bits de estado): CZSO–C: carry (vai-um). Ligado somente se a operação causou vai-um (carry-out) ou vem-um (carry-in).

–Z: zero. Ligado somente se o resultado da operação foi zero.

–S: sinal. Cópia do bit mais significativo do resultado. Indica o sinal do resultado em operações de números com sinal.

–O: overflow. Ligado se ocorreu estouro de campo (sobrecarga)

Instruções Aritméticas: Add

• Exemplo... add r4, 1 add r1, r2...

3.2. INSTRUÇÕES ARITMÉTICAS 27

Exemplo 11 soma com endereçamento imediato e entre registradores.

1 add r4, 1 ; soma com valor imediato2 ; código da instrução ocupa3 ; uma palavra: 10010400h4 add r1, r2 ; soma dois registradores5 ; código da instrução ocupa6 ; uma palavra: 11000102h

00 03 00 00ip

Antes

80 00 11 11r1 Memória

80 00 00 abr2

00 ff ff ffr4 30000h

30004h

10 01 04 00

11 00 01 02

Processador

30008h

... 0 0 0 0flags

C S Z O

00 03 00 08ip

Depois

00 00 11 bcr1 Memória

80 00 00 abr2

01 00 00 00r4 30000h

30004h

10 01 04 00

11 00 01 02

Processador

30008h

... 1 0 0 1flags

C S Z O

3.2.2 Subtração

Exemplo 12 subtração com endereçamento imediato e entre registradores.

3.2. INSTRUÇÕES ARITMÉTICAS 27

Exemplo 11 soma com endereçamento imediato e entre registradores.

1 add r4, 1 ; soma com valor imediato2 ; código da instrução ocupa3 ; uma palavra: 10010400h4 add r1, r2 ; soma dois registradores5 ; código da instrução ocupa6 ; uma palavra: 11000102h

00 03 00 00ip

Antes

80 00 11 11r1 Memória

80 00 00 abr2

00 ff ff ffr4 30000h

30004h

10 01 04 00

11 00 01 02

Processador

30008h

... 0 0 0 0flags

C S Z O

00 03 00 08ip

Depois

00 00 11 bcr1 Memória

80 00 00 abr2

01 00 00 00r4 30000h

30004h

10 01 04 00

11 00 01 02

Processador

30008h

... 1 0 0 1flags

C S Z O

3.2.2 Subtração

Exemplo 12 subtração com endereçamento imediato e entre registradores.

Instruções Aritméticas: Sub

28 CAPÍTULO 3. O PROCESSADOR FAÍSKA

SUB

Subtração

Sintaxe Operação Flags Codificação

sub rdest, expr8 rdest ← rdest − ext(imd8) CSZO

31 0

12 imd8 rdest

sub rdest, rfonte rdest ← rdest − rfonte CSZO

31 0

13 rdest rfonte

1 sub r6, 1 ; soma com valor imediato2 ; código da instrução ocupa3 ; uma palavra: 12010600h4 sub r8, r7 ; soma registrador com registrador5 ; código da instrução ocupa6 ; uma palavra: 13000807h

00 05 00 00ip

Antes

10 00 00 00r6 Memória

ff ff ff ffr7

ff ff ff ffr8 50000h

50004h

12 01 06 00

13 00 08 07

Processador

50008h

... 0 0 0 0flags

C S Z O

Instruções Aritméticas: Sub

• Exemplo... sub r6, 1 sub r8, r7...

28 CAPÍTULO 3. O PROCESSADOR FAÍSKA

SUB

Subtração

Sintaxe Operação Flags Codificação

sub rdest, expr8 rdest ← rdest − ext(imd8) CSZO

31 0

12 imd8 rdest

sub rdest, rfonte rdest ← rdest − rfonte CSZO

31 0

13 rdest rfonte

1 sub r6, 1 ; soma com valor imediato2 ; código da instrução ocupa3 ; uma palavra: 12010600h4 sub r8, r7 ; soma registrador com registrador5 ; código da instrução ocupa6 ; uma palavra: 13000807h

00 05 00 00ip

Antes

10 00 00 00r6 Memória

ff ff ff ffr7

ff ff ff ffr8 50000h

50004h

12 01 06 00

13 00 08 07

Processador

50008h

... 0 0 0 0flags

C S Z O

28 CAPÍTULO 3. O PROCESSADOR FAÍSKA

SUB

Subtração

Sintaxe Operação Flags Codificação

sub rdest, expr8 rdest ← rdest − ext(imd8) CSZO

31 0

12 imd8 rdest

sub rdest, rfonte rdest ← rdest − rfonte CSZO

31 0

13 rdest rfonte

1 sub r6, 1 ; soma com valor imediato2 ; código da instrução ocupa3 ; uma palavra: 12010600h4 sub r8, r7 ; soma registrador com registrador5 ; código da instrução ocupa6 ; uma palavra: 13000807h

00 05 00 00ip

Antes

10 00 00 00r6 Memória

ff ff ff ffr7

ff ff ff ffr8 50000h

50004h

12 01 06 00

13 00 08 07

Processador

50008h

... 0 0 0 0flags

C S Z O

Exemplo// Trecho de programa em C

int a, b, c;

...a = b + c - 2;c = b + 512;...

Exemplo// Trecho de programa em C

int a, b, c;

...a = b + c - 2;c = b + 512;...

; Em linguagem de montagem

a: ds 4b: ds 4c: ds 4

... ld r0, b ld r1, c add r0, r1 sub r0, 2 st a, r0 ld r0, b set r1, 512 add r0, r1 st c, r0...