• Nenhum resultado encontrado

3. ESTUDO DA CPU. Programa: consiste numa seqüência de instruções. Instrução: executa uma ação particular. Cód. de Operação

N/A
N/A
Protected

Academic year: 2021

Share "3. ESTUDO DA CPU. Programa: consiste numa seqüência de instruções. Instrução: executa uma ação particular. Cód. de Operação"

Copied!
71
0
0

Texto

(1)

3. ESTUDO DA CPU

3.1. Formato de Instruções

Programa: consiste numa seqüência de instruções. Instrução: executa uma ação particular.

♦ Componentes de uma instrução:

Código de operação: especifica a ação a ser executada.

Operandos: contêm ou especificam a localização do dado utilizado pela instrução.

♦ Formatos típicos de uma instrução de máquina: Código de Operação

(a) Instrução sem endereço

Cód. de Operação Endereço

(b) Instrução com um endereço

Cód. de Operação Endereço 1 Endereço 2

(2)

♦ Relações possíveis entre o comprimento de uma instrução e o comprimento de uma palavra da máquina:

• Todas as instruções possuem o mesmo comprimento. • As instruções podem assumir dois ou três comprimentos

diferentes.

• As instruções podem ser mais curtas, ter o mesmo

tamanho ou ser mais compridas do que a palavra da máquina.

• Exemplos:

1 palavra 1 palavra

End. End.

0 Instrução 0 Instrução Instrução Instrução Instrução 1 Instrução 1 Instrução Instrução Instrução Instrução 2 Instrução 2 Instrução Instrução Instrução Instrução 3 Instrução 3 Instrução Instrução Instrução Instrução

(a) (b)

1 palavra 1 palavra

End. End.

0 Instrução 0 Instrução Instrução Instrução Instrução 1 Instrução 1 Instrução Instrução 2 2 Instrução Instrução Instrução 3 Instrução 3 Instrução Instrução Instrução 4 Instrução 4 Instrução Instrução Instrução

5 5 Instrução Instrução

(3)

Critérios de Projeto para Formatos de Instruções

♦ “Instruções curtas são melhores do que instruções longas”. • Um programa com n instruções de 16 bits consome a

metade do espaço de memória do que um de n instruções de 32 bits.

• Cada memória tem a sua taxa de transferência

determinada pela tecnologia de projeto.

∗ Número de bits por segundo que pode ser lido da memória.

∗ Para uma taxa de transferência de t bps e um comprimento médio de instrução de r bits, a

memória pode fornecer no máximo t/r instruções por segundo para o processador.

∗ A taxa de instruções executadas por segundo (velocidade do processador) depende do

comprimento da instrução.

∗ Este critério só não seria importante se o tempo para a execução das instruções fosse grande comparado ao tempo de busca da instrução.

♦ “Deve haver espaço suficiente na instrução para expressar todas as operações desejadas”.

• Uma máquina com 2n operações deve ter instruções com no mínimo n bits.

♦ “É desejável que o comprimento da palavra de máquina seja um múltiplo inteiro de seu comprimento de caractere”.

• Se o caractere tiver k bits, o comprimento da palavra deve ser k, 2k, 3k, ..., para não haver desperdício de espaço

(4)

• Ou uma instrução ocupa um número inteiro de bytes ou

palavras ou uma palavra abriga um número inteiro de instruções.

♦ “O número de bits no campo de endereços”.

• Considerando-se uma máquina com o caractere de 8 bits e uma memória principal com capacidade de armazenar 216 caracteres, temos diversas possibilidades, entre elas:

∗ Unidade básica (palavra) de 8 bits: ◊ Memória de 216 bytes, de 0 a 65535.

◊ Um endereço para cada caractere. ∗ Unidade básica (palavra) de 32 bits:

◊ Memória de 214 palavras, de 0 a 16383.

◊ Comparação entre dois caracteres na memória: busca

das palavras e extração dos caracteres dentro das palavras.

◊ Um endereço mais curto possibilita a existência de

instruções mais curtas.

◊ Permite o endereçamento de uma quantidade de memória

4 vezes maior com o mesmo número de bits de endereços do anterior.

• Quanto maior a resolução de endereçamento da memória,

maior o tamanho da instrução.

(5)

Expandindo os Códigos de Operação

♦ Considerando-se uma instrução de n + k bits, com o código de operação de k bits e endereçamento de memória de

n bits.

• Permite 2k operações diferentes.

• Permite 2n células endereçáveis de memória.

♦ Considerando-se uma instrução de n + k bits, com o código de operação de k - 1 bits e endereçamento de memória de

n + 1 bits.

• Permite 2k/2 operações diferentes.

• Permite 2*2n células endereçáveis de memória ou o mesmo número com o dobro da resolução.

♦ Considerando-se uma instrução de n + k bits, com o código de operação de k + 1 bits e endereçamento de memória de

n - 1 bits.

• Permite 2*2k operações diferentes.

• Permite 2n/2 células endereçáveis de memória ou o mesmo número com a metade da resolução.

(6)

♦ Expansão do código de operação: • Exemplo:

∗ Máquina com instruções de 16 bits e endereços de 4 bits.

◊ Permite 16 códigos de operação (4 bits) com 3 endereços

de 4 bits

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Código de Operação

Endereço 1 Endereço 2 Endereço 3 ∗ Alternativa possível:

◊ 15 instruções de 3 endereços.

• códigos de operação de 4 bits

◊ 14 instruções de 2 endereços.

• códigos de operação de 8 bits

◊ 31 instruções de 1 endereço.

• códigos de operação de 12 bits

◊ 16 instruções sem endereço.

• códigos de operação de 16 bits

(7)

∗ Código de operação expandido:

16 bits

Código de 0000 xxxx yyyy zzzz 15 instruções de Operação de 0001 xxxx yyyy zzzz 3 endereços 4 bits 0010 xxxx yyyy zzzz . . . . . . . . 1100 xxxx yyyy zzzz 1101 xxxx yyyy zzzz 1110 xxxx yyyy zzzz

Código de 1111 0000 yyyy zzzz 14 instruções de Operação de 1111 0001 yyyy zzzz 2 endereços 8 bits 1111 0010 yyyy zzzz . . . . . . . . 1111 1011 yyyy zzzz 1111 1100 yyyy zzzz 1111 1101 yyyy zzzz Código de 1111 1110 0000 zzzz 31 instruções de Operação de 1111 1110 0001 zzzz 1 endereço 12 bits . . . . . . . . 1111 1110 1110 zzzz 1111 1110 1111 zzzz 1111 1111 0000 zzzz 1111 1111 0001 zzzz . . . . . . . . 1111 1111 1101 zzzz 1111 1111 1110 zzzz Código de 1111 1111 1111 0000 16 instruções de Operação de 1111 1111 1111 0001 0 endereço 16 bits 1111 1111 1111 0010 . . . . . . . . 1111 1111 1111 1101 1111 1111 1111 1110 1111 1111 1111 1111 15 12 11 8 7 4 3 0

(8)

Exemplos de Formato de Instrução

PDP-11

♦ Instrução possui um código de operação de 4 bits e dois campos de endereçamento de 6 bits (total de 16 bits). ♦ Código de Operação:

• Primeiro bit indica se a instrução opera sobre um byte ou

sobre uma palavra.

♦ Operando:

• 3 bits para modo

∗ Operando é registrador, ∗ Operando está na memória, ∗ Operando é uma constante, ... • 3 bits para registrador (8 registradores)

♦ Os modos são os mesmos para os operandos fonte e destino. ♦ Qualquer operação atua sobre qualquer operando fonte e

destino (código de operação é dito ortogonal).

Código de Operando Fonte Operando Destino

Byte/

(9)

♦ As instruções que endereçam memória possuem 1 ou 2

palavras adicionais de 16 bits para especificar os endereços.

A Família Intel 8088/80286/80386

♦ Instruções não são muito regulares.

• Geralmente, para uma instrução de dois operandos, se

um operando está na memória, o outro não pode estar na memória (código não ortogonal).

♦ 8088

• Todo código de operação é de 1 byte. ♦ 80386

• Novas instruções: o código de operação 15 (1111)

funciona como um escape para os códigos de operação de 2 bytes.

♦ O bit menos significativo do código de operação indica em algumas instruções se a operação é sobre um byte ou

palavra. O bit subseqüente indica se o endereço de memória (se for o caso) é fonte ou destino.

(10)

CPU Comprimento de campos (em bytes) 8088 0-3 1 0-1 0 0-2 0-2 80286 0-3 1 0-1 0 0-2 0-2 80386 0-5 1-2 0-1 0-1 0-4 0-4 Formato da Instrução Prefixo Código de Operaçã o

Modo SIB Desloca-mento

Imediato

Bits 6 1 1 2 3 3

INSTRUÇÃO Fonte B/P ESCALA ÍNDICE BASE

2 3 3

MOD REG R/M

♦ Na maioria das instruções, o byte após o código de operação indica onde se localizam os operandos:

• Modo (2)

∗ 4 maneiras de se endereçar um operando. • Registrador (3)

∗ AX, BX, CX, DX, SI, DI, BP ou SP. ou

∗ AH, BH, CH, DH, AL, BL, CL ou DL. • Registrador/Memória (3)

(11)

♦ Algumas instruções possuem mais 1, 2 ou 4 bytes adicionais para especificar um endereço de memória.

♦ Algumas instruções possuem mais 1, 2 ou 4 bytes adicionais para especificar um operando constante.

♦ Tamanho das instruções: • 8088/80286: 1 a 9 bytes. • 80386: 1 a 17 bytes.

(12)

A Família Motorola 68000/68020/68030

♦ Tem 3 comprimentos de dados (byte, palavra, palavra longa).

♦ Tentativa de construir todas as instruções em 16 bits. • 18 formatos diferentes de instruções (menos

ponto-flutuante).

• Existem palavras adicionais para prover endereços de

memória e constantes para a instrução.

• Existe um espaço maior para as instruções mais

importantes e mais utilizadas.

∗ Instrução

Move

: formato 1 (só dois bits

especificam esta

instrução).

• CÓD. OPERAÇÃO: 2, 4, 8, 9, 10, 11, 12, 16 bits. • TAM: 1-byte, 2-palavra longa, 3-palavra.

• OPERANDO: 6 bits. ∗ Modo: 3 bits.

∗ Registrador: 3 bits.

◊ 1 dos 8 registradores A ou 1 dos registradores D.

(13)

♦ Formatos de instrução utilizados no 68000 (primeira palavra):

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 OP TAM. OPERANDO OPERANDO MOVE

2 CÓD. OPER. REG MOD OPERANDO ADD, AND, CMP, SUB

3 CÓD. OPER. REG OP OPERANDO CHK, DIVS, LEA, MULS

4 CÓD. OPER. REG MOD OP REG MOVEP

5 CÓD. OPER. REG OP TAM OP REG ASL, ASR, ROL, ROR

6 CÓD. OPER. REG COD. OPER. REG ABCD, EXG, SBCD

7 CÓD. OPER. REG OP DADO MOVEQ

8 CÓD. OPER. CONT. OP OP TAM OP REG ASL, ASR, ROL, ROR

9 CÓD. OPER. DADO OP TAM OPERANDO ADDQ, SUBQ

10 CÓD. OPER. CONDIÇÃO OP OPERANDO Scc

11 CÓD. OPER. CONDIÇÃO DESLOCAMENTO Bcc

12 CÓD. OPER. CONDIÇÃO COD. OPER. REG DBcc

13 CÓDIGO DE OPERAÇÃO TAM OPERANDO ADDI, CMPI, NEG, TST

14 CÓDIGO DE OPERAÇÃO TAM OPERANDO MOVEM

15 CÓDIGO DE OPERAÇÃO OPERANDO JMP, JSR, NBCD, PEA

16 CÓDIGO DE OPERAÇÃO VETOR TRAP

17 CÓDIGO DE OPERAÇÃO REG EXT, LINK, SWAP, NLINK

(14)

♦ A diferenciação entre os formatos de instrução não se dá sempre pelos bits 12 a 15 para os formatos de 2 a 12:

ADDQ 0 1 0 1 DADO 0 TAM Modo Reg

SUBQ 0 1 0 1 DADO 1 TAM Modo Reg

Scc 0 1 0 1 CONDIÇÃO 1 1 Modo Reg

DBcc 0 1 0 1 CONDIÇÃO 1 1 0 0 1 REG

• Obs: Tamanho 11 é inválido.

♦ Nos microprocessadores 68020, 68030 o problema se agrava, devido a existência de instruções adicionais.

• Compiladores e montadores mais complexos. • Microprogramas mais complicados.

(15)

3.2. Endereçamento

♦ As instruções podem ser classificadas de acordo com o número de endereços que elas utilizam. Estes endereços podem ser:

• Número do registrador a ser utilizado.

∗ Os registradores da CPU constituem uma memória de alta velocidade e, portanto, um espaço de

endereçamento. • Posição de memória.

♦ Instruções comuns: especificam 1, 2 ou 3 endereços.

♦ Em muitas máquinas que fazem operações aritméticas com um endereço apenas, um registrador especial denominado

Acumulador provê um dos operandos.

Instruções de 1 endereço: em geral envolvem o Acumulador.

• Acumulador := Acumulador + Registrador 1 • Acumulador := Acumulador + Memória[ end1 ]

Instruções de 2 endereços: utilizam um dos endereços como fonte e o outro como destino ou fonte/destino.

• Fonte/Destino := Fonte/Destino + Fonte

Instruções de 3 endereços: utilizam dois endereços como fonte e o terceiro como destino.

• Destino := Fonte 1 + Fonte 2

(16)

instrução são interpretados para se encontrar um operando.

(17)

Endereçamento Imediato

♦ É a maneira mais simples de uma instrução especificar um operando, pois a parte da instrução relativa ao endereço contém o operando propriamente dito (valor), e não o local onde ele possa ser encontrado.

♦ Tal operando é dito operando imediato.

♦ O operando é buscado na memória ao mesmo tempo que a instrução é buscada.

♦ Vantagem: não requer um referência extra à memória para se buscar o operando.

♦ Desvantagem: restringe o operando a um valor que possa caber dentro do campo de endereçamento.

• Se o campo de endereço for de 3 bits, sua utilização fica

(18)

Família Intel:

♦ Não possui um modo de endereçamento para operandos imediatos.

♦ Possui instruções distintas nas quais um dos operandos é imediato.

Família Motorola:

♦ Possui um modo de endereçamento imediato; qualquer operando fonte pode ser uma constante.

• 68000: algumas instruções permitem constantes de 8 ou

16 bits.

• 68020, 68030: permitem constantes de 8, 16 ou 32 bits. • Existem instruções especiais (ADDI, ADDQ e CMPI)

que permitem uma codificação mais eficiente de instruções imediatas:

∗ Constantes imediatas pequenas são incluídas dentro da palavra da instrução, sem a necessidade de se acrescentar bytes adicionais ao final da instrução.

(19)

Endereçamento Direto

♦ A instrução fornece o endereço da palavra de memória onde o operando está contido.

♦ Exemplo:

• “Carga do registrador R1 com o conteúdo da posição de

memória de endereço 1000”. Endereço Código de Operação (*) R1 1000 (*) Campos que Especificam o Endereçamento Direto 1000 1510 1510 4 R1 1510

∗ Passo 1: O operando é buscado da posição 1000. ∗ Passo 2: O operando é carregado em R1.

(20)

Intel:

♦ Todas as CPUs possuem endereçamento direto. • 8088/80286:

∗ Endereços diretos de 16 bits. • 80386:

∗ Utiliza endereços diretos de 16 bits nos modos real e virtual, e segmentos de 16 bits no modo protegido. ∗ Utiliza endereços diretos de 32 bits no modo

protegido de 32 bits.

Motorola:

♦ Possui duas formas de endereçamento direto: • 16 bits

∗ Para endereçamento dos primeiros 64 Kbytes de memória.

• 32bits

∗ Para endereçamento acima dos 64 Kbytes.

♦ As formas de endereçamento direto são indicadas no campo MODO de 3 bits e se aplicam a todos os operandos da

(21)

Endereçamento de Registrador

♦ Conceitualmente é semelhante ao endereçamento direto. O campo de endereço da instrução contém o número do registrador no qual o operando está armazenado.

♦ O endereçamento da máquina deve ter duas partes: • Um bit para indicar se será utilizada uma posição de

memória (endereçamento direto) ou um registrador (endereçamento de registrador) na instrução.

• Um campo de endereço com o número do registrador

(endereçamento de registrador) ou endereço de uma palavra na memória (endereçamento de direto).

♦ O número de registradores é muito menor do que o número de palavras de memória: logo, os formatos freqüentemente são diferentes (para garantir instruções menores).

♦ Fica mais claro quando o bit que diferencia estes dois tipos de endereçamento se encontra no campo de endereçamento e não no código de operação.

♦ Motivos para a utilização de registradores:

• O acesso aos registradores é mais rápido do que o acesso

a palavras na memória.

• O endereçamento dos registradores requer apenas alguns

bits, pois estes são em pequeno número.

♦ “Problema”: complica a programação, pois sendo em pequeno número, o programador (ou o compilador) deve decidir quais operandos e resultados intermediários devem permanecer em registrador.

(22)
(23)

Endereçamento Indireto

♦ O campo de endereçamento da instrução especifica qual a palavra de memória ou registrador contém o endereço do operando.

♦ Exemplo:

• “Carga do registrador R1 de forma indireta a partir da

posição de memória de endereço 1000”.

Endereço Código de Operação (*) R1 1000 (*) Campos que Especificam o Endereçamento Indireto Apontador 1000 1510 1510 4 R1 4

• Passo 1: O apontador para o operando é buscado da posição 1000.

• Passo 2: O operando é buscado na posição 1510. • Passo 3: O operando é carregado em R1.

(24)

Intel:

♦ Os processadores Intel possuem endereçamento indireto via registrador, mas não permitem um endereçamente indireto na memória.

♦ 8088/80286:

• Registradores utilizados para endereçamento indireto:

BX, SI e DI.

♦ 80386:

• Todos os registradores podem ser utilizados.

Motorola:

♦ 68000:

• Permite somente o endereçamento indireto via

registrador.

♦ 68020 e 68030:

• Permitem também o endereçamento indireto via memória.

♦ Existem processadores que permitem endereçamento indireto de múltiplos níveis na memória.

(25)

Endereçamento Indexado

♦ Muitos algoritmos necessitam da execução de alguma operação sobre uma seqüência de dados armazenados em posições consecutivas de memória.

♦ Exemplo:

• Bloco de n palavras ocupando as posições: A, A+1, A+2,..., A+n-1

que devem ser copiadas para as posições:

B, B+1, B+2,..., B+n-1

• Uma solução possível: se a máquina possuir uma

instrução

MOVE A, B

que copia o conteúdo da posição A para a posição B e modifica a própria instrução para:

MOVE A+1, B+1

e a executa novamente, e assim sucessivamente, até completar as n interações.

Problema: os programas ficam difíceis de se depurar (programa altera a si próprio).

♦ Outra solução: utilizar o endereçamento indireto. A cada movimentação são alterados os apontadores, que são dados. ♦ No endereçamento indexado é utilizado um ou mais

registradores de índice. Neste caso, os endereços possuem duas partes:

(26)

♦ O endereço do operando é a soma da constante com o conteúdo do registrador de índice.

♦ No exemplo anterior, se o registrador de índice possuir o valor k, a instrução MOVE A,B copiará o conteúdo da posição de memória A+k para B+k. Basta o registrador de índice ser inicialmente carregado com o valor 0, e ser

incrementado do tamanho da palavra de memória a cada palavra copiada.

♦ Algumas máquinas incrementam ou decrementam o

conteúdo do registrador de índice antes ou depois de cada utilização: auto-indexação.

(27)

Endereçamento de Pilha

♦ É desejável a existência de instruções de máquina tão curtas quanto possível.

• Economia de memória e tempo de CPU.

♦ Instruções sem endereço possuem apenas o código de operação.

♦ Pode-se ter uma arquitetura baseada em instruções sem endereço, que se utilizam de uma estrutura de dados denominada pilha. Estas máquinas são denominadas de

stack machines.

Pilha: consiste em itens de dados (palavras, caracteres, bits) armazenados em ordem consecutiva na memória.

Base (fundo) da pilha: é o primeiro item colocado na pilha.

Ponteiro da Pilha: registrador ou palavra na memória que contém o endereço do topo da pilha (último dado armazenado).

(28)

♦ Exemplo de funcionamento da pilha: Apontador da pilha 1001 1002 1003 1002 Endereço Fundo da pilha 1000 100 100 100 100 1001 40 40 40 40 1002 6 6 6 1003 Topo da 75 1004 Pilha 1005 1006 (a) (b) (c) (d) ♦ Os computadores orientados para pilha possuem instruções

para:

• Inserir o conteúdo de um registrador ou posição de

memória na pilha, incrementando o ponteiro da pilha após armazenar o dado.

∗ Exemplo: PUSH.

• Copiar o conteúdo do topo da pilha para um registrador

(29)

♦ Instruções sem endereço utilizam como operandos dados existentes na pilha.

• Exemplo:

∗ Uma instrução de adição obtém os dois operandos retirando-os consecutivamente do topo da pilha e armazena o resultado na pilha. Os operandos são retirados da pilha após o uso.

Apontador da pilha 1003 1002 1001 Endereço 1000 4 4 4 1001 20 20 50 1002 6 30 1003 5 1004 Topo da Pilha (a) (b) (c) ♦ Tipos de notação para uma operação envolvendo dois

operandos:

• Notação Infixada: o operador é colocado entre os operandos.

∗ Exemplo: x + y.

• Notação Polonesa Reversa ou Notação Pós-Fixada: o operador é colocado após os operandos.

(30)

Exemplos de Endereçamento

♦ Maneiras de se implementar as diversas formas de endereçamento:

• Utilizar um código de operação para cada modo: ∗ Exemplos:

◊ ADDim - ADD imediato ◊ ADDd - ADD direto ◊ ADDin - ADD indireto

• Fazer o modo de endereçamento como parte do endereço

(31)

Endereçamento no PDP-11

♦ Os modos de endereçamento são implementados de forma elegante, clara e simples.

♦ Os endereços são especificados por um campo de 6 bits. • Instruções de dois endereços possuem dois destes campos. ♦ Existem 8 registradores: R0 a R7.

• R6 - Ponteiro da Pilha

• R7 - Contador do Programa

∗ O Contador do Programa avança de 2

imediatamente após uma palavra de instrução ser buscada (2 bytes) e antes de ser executada.

♦ Todas as instruções têm 16 bits, sendo que as vezes são

necessárias 1 ou 2 palavras adicionais após a instrução, que são utilizadas pela instrução (valor, endereço de memória) e podem ser consideradas como parte dela.

♦ Formato de uma instrução de dois endereços no PDP-11.

Palavra de 16 bits

End. Fonte Destino

N Código de Operação Modo Fonte RegistradorFonte Destino Modo RegistradorDestino

4 3 3 3 3

N+2 (Próxima Palavra 1)

(32)

♦ Descrição dos modos de endereçamento do PDP-11, onde R

é o registrador especificado em Fonte ou Destino.

Modo Nome Como o operando é localizado

0 Endereçamento Registrador

O operando está em R. 1 Indireto Via

Registrador

O R contém um apontador para o operando. 2

Auto-Incremento

O conteúdo de R é buscado e usado como um apontador para o operando.

Após esse passo, mas antes de a instrução seguinte ser executada, R é incrementado de 1 (instruções de byte) ou 2 (instruções de palavra).

3 Auto-Incremento Indireto

O endereço de uma palavra na memória que contém um apontador para o operando é buscado em R. Então R é incrementado de 1 ou 2 antes de a instrução ser executada. 4

Auto-Decremento

R é primeiro decrementado de 1 ou 2. O novo valor de R é então usado como apontador para o operando.

5

Auto-Decremento Indireto

R é primeiro decrementado de 1 ou 2. O novo valor de R é então usado como endereço de uma posição de memória que contém um apontador para o operando.

6 Indexação O operando está no endereço igual à soma de R (registrador de índice) e o deslocamento de 16 bits em complemento de 2 na próxima palavra.

O contador de programa (R7) é incrementado de 2 imediatamente após a próxima palavra ser buscada. 7 Indexação +

Endereçamento Indireto

A posição da memória que contém um apontador para o operando é encontrada somando o conteúdo de R e o deslocamento de 16 bits em complemento de 2 na próxima palavra.

O contador de programa (R7) é incrementado de 2 imediatamente após a próxima palavra ser buscada.

(33)

♦ Exemplo: possibilidades da instrução MOV R, R4.

Palavra de 16 bits

End. Fonte Destino

1000 MOV (*) Modo Fonte

M Registrador Fonte R 0 4 4 3 3 3 3 1002 (Próxima Palavra) K

(*) Considerando as instruções que manipulam palavras, com o primeiro bit igual a 1.

• Nomenclatura:

∗ R - registrador;

∗ $ - operando imediato; ∗ * - indica indireção.

• Um único código de operação produz um grande número

de instruções diferentes, já que os modos de

endereçamento fonte e destinos são especificados independentemente.

(34)

Modo

Fonte (M) R = 0 - 5 R = 6 R = 7

0 Move R para R4. Ex: MOV R3, R4

Move o apontador de pilha para R4. Ex: MOV SP, R4

Move o contador de programa para R4. Ex: MOV PC, R4

1 Move a palavra de memória apontada por R para R4.

Ex: MOV *R3, R4

Move o topo da pilha para R4, mas não o remove da pilha.

Ex: MOV *SP, R4

Move K para R4; o contador de programa não é incrementado, assim K será executado como a próxima instrução.

Ex: MOV *PC. R4

2 Move a palavra de memória apontada por R para R4 e soma 2 a R.

Ex: MOV (R3)+, R4

Remove uma palavra da pilha e a coloca em R4 (instrução de desempilhamento). Ex: MOV (SP)+, R4

Move K para R4 (endereçamento imediato). Ex: MOV $24, R4

3 Move para R4 a palavra da memória endereçada pela palavra que R aponta e soma 2 a R.

Ex: MOV *(R3)+, R4

Desempilha o endereço do operando fonte e move o próprio operando fonte para R4.

Ex: MOV *(SP)+, R4

Carrega R4 a partir do endereço de memória K (endereçamento direto).

Ex: MOV *$24, R4

4 Decrementa R de 2 e então carrega R4 a partir do endereço apontado por R. Ex: MOV -(R3), R4

M=4 e R=6 não é fonte útil; entretanto, é usado como destino em instruções para empilhar.

Ex. de empilhamento.: MOV $6, -(SP)

Não é usado.

(causa um loop infinito).

5 Decrementa R de 2 e então carrega R4

(35)
(36)

Endereçamento na Família Intel: 8088/80286/80386

♦ Os endereçamentos no 8088, 80286 e 80386 (considerando segmentos de 16 bits) são iguais.

♦ O byte MODO controla os modos de endereçamento. Um

dos operandos é especificado pela combinação dos campos MOD (2 bits) e R/M (3 bits).

♦ O outro operando é sempre um registrador e é controlado pelo campo REG.

♦ Para MOD=00 e R/M=000, a soma BX+SI representa um ponteiro para a memória de onde será obtida a palavra ou byte, de acordo com bit menos significativo do código de operação.

MOD

00 01 10 11

000 M[BX + SI] M[BX + SI + DISP8] M[BX + SI + DISP16] AX ou AL

001 M[BX + DI] M[BX + DI + DISP8] M[BX + DI + DISP16] CX ou CL

010 M[BP + SI] M[BP + SI + DISP8] M[BP + SI + DISP16] DX ou DL

R/M 011 M[BP + DI] M[BP + DI + DISP8] M[BP + DI + DISP16] BX ou BL

100 M[SI] M[SI + DISP8] M[SI + DISP16] SP ou AH

101 M[DI] M[DI + DISP8] M[DI + DISP16] BP ou CH

110 Endereçamento Direto M[BP + DISP8] M[BP + DISP16] SI ou DH

111 M[BX] M[BX + DISP8] M[BX + DISP16] DI ou BH

(37)

♦ Somente algumas combinações de somas de registradores são permitidas para formar apontadores.

♦ Não existe nenhum modo imediato, que é implementado através de códigos de operações adicionais.

♦ Não é permitida a auto-indexação.

♦ O MOD=11 indica um segundo operando registrador. O bit 1 do código de operação indica qual o operando fonte e destino.

♦ 80386:

• Possui um novo esquema de endereçamento para os

segmentos de 32 bits, que permite o endereçamento indireto através de mais registradores.

MODO

00 01 10 11

000 M[EAX] M[EAX + DISP8] M[EAX + DISP32] EAX ou AL

001 M[ECX] M[ECX + DISP8] M[ECX + DISP32] ECX ou CL

010 M[EDX] M[EDX + DISP8] M[EDX + DISP32] EDX ou DL

R/M 011 M[EBX] M[EBX + DISP8] M[EBX + DISP32] EBX ou BL

100 SIB (*) SIB com DISP8 SIB com DISP32 ESP ou AH

101 Endereçamento Direto M[EBP + DISP8] M[EBP + DISP32] EBP ou CH

110 M[ESI] M[ESI + DISP8] M[ESI + DISP32] ESI ou DH

111 M[EDI] M[EDI + DISP8] M[EDI + DISP32] EDI ou BH (*) SIB - Escala, Índice, Base

• Quando o SIB (Escala, Índice, Base) está presente,

tem-se:

∗ Endereço do operando é calculado pela soma do Registrador de Base ao Registrador de Índice

(38)

Pode-∗ Exemplo de utilização do SIB: arranjos, como para o seguinte comando em Pascal:

for i:=0 to n do a[i]:=0;

onde a é um arranjo de 4 bytes locais ao procedimento corrente.

Pode-se armazenar a[i] numa única instrução, enquanto no 8088 seriam necessárias 4 instruções.

EBP Estrutura de Pilha Outras variáveis locais i em EAX

a [ 0 ] EBP + 8 M[4 * EAX + EBP + 8]

a [ 1 ] EBP + 12

(39)

Endereçamento na Família Motorola: 68000/68020/68030

♦ Cada operando é especificado por um campo de 6 bits: • 3 bits para especificar o modo de endereçamento. • 3 bits para especificar o registrador.

♦ O ponteiro da pilha é endereçável (A7), sendo que todos os modos de endereçamento de pilha se aplicam.

Modo Reg Palavras

Extras

Descrição

0 D 0 Operando no registrador D. 1 A 0 Operando no registrador A.

2 A 0 Apontador para o operando no registrador A. 3 A 0 Apontador em A; auto-incrementa A após o uso. 4 A 0 Auto-incrementa A; então usa-o como

apontador.

5 A 1 Modo indexado com deslocamento de 16 bits. 6 A 1 A + registrador de índice + deslocamento de 8

bits produz o endereço

7 0 1 Endereçamento direto com endereço de 16 bits. 7 1 2 Endereçamento direto com endereço de 32 bits. 7 2 1 O endereço do operando é PC + deslocamento de

16 bits.

7 3 1 O endereço do operando é PC + índice + deslocamento de 8 bits.

7 4 1 ou 2 Dado imediato.

♦ Novos modos de endereçamento foram adicionados para permitir o acesso a arranjos e outras estruturas a partir de uma única instrução, a partir do 68020.

(40)

♦ Exemplo de instrução do 680x0:

a) Instrução de um operando no 680x0. b) Palavra de extensão no 68000.

c) Formato curto da palavra de extensão no 68020 e 68030. d) Formato completo de palavras de extensão no 68020 e

68030.

Bits 10 3 3

(a) CÓDIGO DE OPERAÇÃO MODO REG

(b) D/A REG W/L 00 0 DESLOCAMENTO

(c) D/A REG W/L ESCALA 0 DESLOCAMENTO

D/A REG W/L ESCALA 1 BS IS TAM. DE DB 0 I/IS

(d) DESLOCAMENTO BASE (0, 1 ou 2 palavras) DESLOCAMENTO EXTERNO (0, 1 ou 2 palavras)

Legenda:

D/A - 0 seleciona um registrador D; 1 seleciona um registrador A. REG - seleciona um registrador (0-7) ou um índice.

W/L - 0 indica palavra; 1 indica palavra longa. ESCALA - 0-3 indica fatores de escala 1, 2, 4 ou 8. BS - suprime registrador de base.

(41)

Discussão Acerca dos Modos de Endereçamento

♦ Os modos de endereçamento geralmente utilizados pelos compiladores de linguagens de alto nível são:

• Auto-indexação

∗ Empilhamento e desempilhamento de parâmetros de procedimentos.

• Direto

∗ Acesso a variáveis globais. • Imediato

∗ Transferência de constantes. • Indexado

∗ Acesso a variáveis locais. • Registrador

∗ Armazenamento de variáveis locais. • Registrador indireto

(42)

PDP-11:

♦ Possui 8 modos de endereçamento, sendo os modos 1, 3, 5, 7 iguais aos modos 0, 2, 4, 6 adicionando-se uma indireção. ♦ Esquema simples, fácil de ser entendido e implementado a

nível de micro-código, e engloba todas as formas de endereçamento importantes.

Motorola 68000:

♦ Tentou-se copiar o esquema do PDP-11, mas existiam 16 registradores ao invés de 8. Logo, sobrariam 2 bits para o campo modo.

♦ Optou-se por ter um modo de endereçamento para os registradores D e a maioria funcionando somente para os registradores A.

♦ Difere do PDP-11 por não permitir modos de

endereçamento envolvendo o contador do programa. ♦ Os modos de endereçamento mais importantes estão

presentes.

♦ Modos de endereçamento quase ortogonal para os códigos de operação.

(43)

Intel 8088 e 80286:

♦ Possuem apenas 2 bits de modo de endereçamento. ♦ Todos os 8 registradores de uso geral são diferentes.

♦ Somente 3 registradores permitem endereçamento indireto (SI, DI e BX) e somente 4 registradores permitem

indexação (SI, DI, BX e BP).

♦ O modo de endereçamento imediato é suprido pela existência de códigos de operação específicos para isso. ♦ Não permitem a auto-indexação (existem instruções

específicas para a manipulação de cadeia de caracteres que implementam a auto-indexação).

♦ Não possui endereçamento de pilha, permitindo o acesso a pilha através das instruções PUSH e POP. O PUSP não permite o armazenamento de valores imediatos na pilha. ♦ O 80386 possui um modo de endereçamento melhor com a

criação do byte SIB.

DEC VAX:

♦ Solução para se utilizar mais registradores e manter a ortogonalidade: 4 bits para o modo e 4 bits para o registrador.

♦ Cada operando necessita de 1 byte.

♦ Uma instrução de dois operandos necessita de no mínimo 3 bytes.

(44)

3.3. Tipos de Instrução

Instruções de Transferência de Dados

Transferência de dados significa a cópia de dados de um lugar para outro, e é a mais fundamental de todas as operações.

♦ A transferência neste contexto significa a criação de um novo objeto com o mesmo padrão de bits do original, deixando a cópia original intacta.

♦ Locais possíveis de armazenamento de dados: • palavra na memória

• registrador

• pilha (pode ser implementada em registradores ou na

memória, mas a forma de acessá-la é particular).

♦ Devem especificar implicitamente ou explicitamente o operando fonte (original) e destino (onde será guardada a cópia).

♦ Exemplos:

• Motorola (680x0):

(45)

Operações Diádicas

Operações diádicas são aquelas que combinam dois operandos para produzir um resultado.

♦ Encontramos neste grupo as operações aritméticas e lógicas.

♦ Instruções Aritméticas:

• Adição, subtração, multiplicação e divisão. ♦ Instruções Lógicas:

• AND, OR, XOR.

AND: calcula o produto booleano bit a bit de dois argumentos de uma palavra cada, gerando como resultado também uma palavra.

∗ Uso importante: extração de bits de uma palavra, através de uma máscara. A operação AND tende a remover os bits iguais a 1.

∗ Exemplo: extração do segundo caractere de uma palavra de 4 bytes para ser imprimido.

◊ Solução: isolá-lo dos demais bytes e justificá-lo à direita. ◊ Extração:

10110111 10111100 11011011 10001011 A

00000000 11111111 00000000 00000000 B (máscara)

00000000 10111100 00000000 00000000 A AND B

OR: calcula a operação booleana OR bit a bit de dois argumentos de uma palavra cada, gerando como

(46)

∗ Uso importante: empacotamento de bits em uma palavra, que significa o inverso da extração. A operação OR tende a inserir bits 1 no resultado. ∗ Exemplo: trocar os 8 bits mais à direita de uma

palavra de 4 bytes, sem alterar os demais bits. ◊ Solução: limpar o byte a ser alterado, mantendo os

demais, e incluir o novo byte.

◊ Empacotamento: 10110111 10111100 11011011 10001011 A 11111111 11111111 11111111 00000000 B (máscara) 10110111 10111100 11011011 00000000 A AND B 00000000 00000000 00000000 01010111 C 10110111 10111100 11011011 01010111 (A AND B) OR C

XOR: calcula a operação booleana XOR bit a bit de dois argumentos de uma palavra cada, gerando como

resultado também uma palavra.

∗ Uso importante: permite a inversão de

determinados bits de uma palavra, aplicando a operação XOR com um operando que possua 1s nestes bits. A operação XOR com um bits iguais a 0 não altera o resultado.

(47)

∗ Exemplo: inverter os 8 bits do segundo caractere de uma palavra de 4 bytes, sem alterar os demais bits.

◊ Inversão de bits:

10110111 10111100 11011011 10001011 A

00000000 11111111 00000000 00000000 B (máscara)

10110111 01000011 11011011 10001011 A XOR B

♦ Operações aritméticas em ponto-flutuante:

• Antigamente eram implemantada via software.

• Atualmente muitas máquinas possuem instruções de

máquina que implementam operações em ponto-flutuante diretamente por hardware (maior velocidade).

∗ Tamanho menor dos operandos: maior velocidade. ∗ Tamanho maior dos operandos: maior precisão. • Em muitos casos estas operações são realizadas por

processadores numéricos, também chamados de co-processadores. Tais processadores realizam também outras operações que não sejam de ponto-flutuante.

(48)

Operações Monádicas

Operações monádicas são aquelas que têm um operando e produzem um resultado.

♦ Em geral são mais curtas que as operações diádicas, pois só necessitam da especificação de um operando.

♦ Encontramos neste grupo as operações para deslocar e rodar o conteúdo de uma palavra.

Deslocamentos: são operações nas quais os bits do operando são movidos para a esquerda ou direita, perdendo os bits deslocados para fora da palavra, formando o resultado.

• As posições vagas são preenchidas com 0.

• Um deslocamento para a direita de k bits significa uma divisão do operando por 2k.

• Um deslocamento para a esquerda de k bits significa uma multiplicação do operando por 2k.

• Exemplo: deslocamento de 2 bits de uma palavra para a

direita.

00000000 00000000 00000000 01110011 A

(49)

Rotações: são operações nas quais os bits do operando são movidos para a esquerda ou direita, sendo que os bits que saem da palavra reaparecem do outro lado, formando o resultado.

• Exemplo: rotação de 2 bits de uma palavra para a direita. 00000000 00000000 00000000 01110011 A

11000000 00000000 00000000 00011100 A rodado de 2 bits para a direita

• Propriedade: “Se uma palavra de n bits é rodada k bits para um lado, o resultado é o mesmo caso tivesse sido rodada n-k bits para o outro lado”.

Deslocamentos com sinal: são operações de deslocamentos para a direita que mantêm o sinal do operando para gerar o resultado.

• Na prática, isso significa que as posições vagas do lado

esquerdo são preenchidas com o bit de sinal original, 0 ou 1. Logo, um número negativo permanecerá negativo.

(50)

• Exemplo: deslocamento de 2 bits de uma palavra para a

direita, sem a extensão do sinal e com a extensão do sinal. 11111111 11111111 11111111 11110000 A

00111111 11111111 11111111 11111100 A deslocado de 2 bits para a direita sem

extensão do sinal

11111111 11111111 11111111 11111100 A deslocado de 2 bits para a direita com

extensão do sinal

♦ Certas operações diádicas muito utilizadas com operandos específicos podem ser fornecidas na forma monoádica.

• Exemplos:

∗ Mover o valor 0 para uma palavra de memória ou registrador:

◊ Instrução CLEAR.

∗ Somar/subtrair 1 a/de uma palavra de memória ou registrador:

◊ Instrução INC/DEC.

∗ Negar o valor de X (significa fazer a operação

0 - X):

◊ Instrução NEGATE.

(51)

Comparações e Desvios Condicionais

♦ Praticamente todos os programas precisam da capacidade de testar seus dados e alterar a seqüência de instruções a serem executadas.

• Exemplo: x

∗ Se x é negativo, retorna mensagem de erro; caso contrário, calcular a raiz quadrada de x.

♦ Solução: a máquina deve possuir instruções de salto condicional (desvio condicional).

♦ As instruções de desvio condicional testam alguma condição e saltam para um determinado endereço se a condição é satisfeita, e continuam a seqüência normal do programa caso contrário.

• O desvio pode ocorrer se uma determinada condição for

satisfeita ou então se uma determinada condição não for satisfeita, de acordo com algum bit da instrução.

♦ A condição mais comum a ser testada é se um bit específico na máquina é 0 ou 1.

(52)

• Exemplo: teste do bit de sinal de um resultado.

∗ Se o bit de sinal é 1 (número negativo), o programa continua a partir do endereço Rótulo. Se o bit de sinal é 0, o programa continua a partir da instrução seguinte a instrução de salto.

JNEG REG1, Rótulo ; desvia se o registrador REG1 for negativo.

INSTR 1

; próxima instrução caso REG1 seja positivo.

INSTR 2 . . Rótulo: INSTR 3

; próxima instrução caso REG1 seja negativo.

INSTR 4

. .

♦ Muitas máquinas possuem bits que são utilizados para indicar condições específicas, denominados flags de

máquina. Os flags, de certa forma, indicam o estado atual do processador, e em geral refletem o ocorrido na ULA após a última operação lógica ou aritmética executada.

• Exemplo: vai-um do bit mais a esquerda de uma

operação, indicando o estouro numa operação aritmética.

(53)

Comparação entre duas palavras: permite avaliar se elas são iguais ou qual é a maior.

• Instrução que a princípio precisa de três endereços: dois

para os operandos e um para o endereço de desvio.

• Se a máquina não permite instruções de três endereços,

uma solução é disponibilizar dois tipos de instruções:

∗ Instrução de comparação, que armazena alguns bits de condição a respeito do resultado.

∗ Instrução de desvio condicional, que consulta os bits de condição e eventualmente faz o desvio.

∗ Este tipo de solução é adotada pelas famílias Motorola e Intel.

♦ O resultado de uma comparação depende dos sinais dos operandos. Em geral, faz-se a comparação entre dois valores de mesmo sinal, ou precisa-se ter instruções

específicas para números sem sinal e números com sinal.

Sem sinal Com sinal

0 000 100 -4 1 001 101 -3 2 010 110 -2 3 011 111 -1 4 100 000 0 5 101 001 1 6 110 010 2 7 111 011 3 ♦ Outra forma de desvio condicional: pular a próxima

instrução.

(54)

Instruções de Chamada de Procedimentos

Procedimento ou sub-rotina ou simplesmente rotina: é um grupo de instruções que realiza uma tarefa e que pode ser chamado de diversas partes do programa.

♦ Um procedimento, após ser executado, deve retornar para o comando após a sua chamada.

• O procedimento deve receber de alguma forma o endereço

para onde ele deve retornar após realizar a sua tarefa (endereço de retorno).

• Formas de se armazenar o endereço de retorno: ∗ Memória:

◊ Posição Fixa: não permite encadeamentos de

sub-rotinas.

◊ Primeira palavra da sub-rotina: cada sub-rotina sabe

onde buscar o endereço de retorno. Não permite recursão

direta ou indireta.

∗ Registrador:

◊ A instrução de chamada de sub-rotina armazena o

endereço de retorno num registrador, deixando a cargo da sub-rotina armazenar o endereço num local seguro.

∗ Pilha:

(55)

Controle de Loop

♦ Um programa em geral necessita executar um grupo de instruções um número fixo de vezes - loop.

♦ O controle de loop pode ser implementado através das instruções elementares, devendo:

• Ter um contador, que é decrementado ou incrementado de

uma constante a cada interação.

• Testar o contador a cada interação, terminando o loop se

uma condição for atingida.

♦ Tipos de loop:

• Loop com teste no final

∗ Sempre será executado ao menos uma vez. Falha para n igual a zero.

• Loop com teste no início ♦ Exemplos de controles de loops:

i:=1; i:=1;

1: {primeiro comando} 1: if i > n then goto 2;

{segundo comando} {primeiro comando}

. {segundo comando}

. .

{último comando} .

i := i + 1; {último comando}

if i <= n then goto 1; i := i + 1;

2: {primeiro comando após o loop} goto 1;

2: {primeiro comando após o loop}

(a) teste no final (b) teste no início

(56)

♦ Algumas máquinas podem disponibilizar instruções

especiais que fazem o controle de contagem de interações, teste de condição e desvio numa única instrução.

• Intel:

∗ 8088/80286: Instrução LOOP, que decrementa o registrador CX de 1 e salta para um dado rótulo se o resultado não for 0. Se for 0, a execução continua a partir da próxima instrução.

∗ 80386: Idem para o registrador ECX. • Motorola:

∗ Instrução para uma solução mais geral:

◊ Primeiro testa uma determinada condição, que se não

satisfeita, encerra o loop.

◊ Decrementa um registrador D, que se resultar num valor

maior ou igual a 0, repete o loop; caso contrário, encerra o loop.

(57)

Entrada e Saída

♦ Apresentam grande variação de máquina para máquina. ♦ Se o espaço de endereçamento de entrada e saída (E/S) não

estiver mapeado em memória (ou seja, os dispositivos de E/S também possuem endereços, da mesma forma que a memória), devem existir instruções especiais (mapeamento em E/S) que permitam:

• A leitura de um dado num dispositivo de entrada. ∗ Instrução: IN.

• A escrita de um dado num dispositivo saída. ∗ Instrução: OUT.

♦ Intel:

• Instruções específicas para E/S: IN e OUT:

∗ Especificam o endereço da porta de E/S de forma direta ou indireta via registrador DX.

∗ Utilizam o registrador AX / EAX como elemento de transferência entre o dispositivo e a CPU.

♦ Motorola:

• Registradores dos dispositivos são endereçados via

(58)

3.4. Fluxo de Controle

♦ O Fluxo de controle corresponde à seqüência na qual as instruções são executadas.

♦ As instruções executadas sucessivamente são buscadas de posições de memória consecutivas.

♦ As alterações do fluxo normal de controle do programa podem ocorrer através de:

Chamadas de Procedimentos.

Co-rotinas.

Armadilhas (Traps).

(59)

Fluxo de Controle Seqüencial e Desvios

♦ Após a execução de cada instrução:

• O contador de programa é incrementado do número de posições de memória da instrução (comprimento da instrução).

• A próxima instrução é buscada na memória e executada. ♦ Ao longo do tempo, o contador do programa é

aproximadamente uma função linear crescente em função do tempo (as instruções são executadas na ordem em que aparecem numa listagem).

• Se não houver desvio (a), o contador avança linearmente. • Se houver desvio (b), o contador avança linearmente por

partes, entre os desvios.

Desvios Tempo Tempo C O N T A D O R D O P R O G R A M A C O N T A D O R D O P R O G R A M A

(60)

Procedimentos

♦ A utilização de procedimentos é a técnica mais importante para se estruturar programas.

♦ A chamada de um procedimento altera o fluxo de controle do programa, como ocorre com um desvio, mas permite o retorno para a instrução seguinte à instrução de chamada. ♦ A instrução de chamada de um procedimento pode ser

entendida como uma instrução de alto nível. O que importa é o que o procedimento faz, não como ele faz.

Procedimento recursivo: é um procedimento que chama a si mesmo.

• Exemplos de problemas solucionados através de

procedimentos recursivos:

∗ Torre de Hanói.

(61)

♦ Chamada de um procedimento B a partir de um procedimento A: (A) (B) Procedimento que chama Procedimento chamado A chamado pelo programa principal A retorna ao programa principal

♦ O procedimento B sempre começa do seu início. ♦ Sistema de chamada e retorno de um procedimento:

• O procedimento A utiliza uma instrução de chamada de

sub-rotina (p.ex. CALL), que armazena o endereço de retorno, por exemplo, no topo da pilha, e carrega o

contador do programa com o endereço do procedimento B.

• Para retornar, o procedimento B executa uma instrução

de retorno (p.ex. RET), que retira do topo da pilha o endereço de retorno e o transfere para o contador do programa.

(62)

Co-rotinas

♦ Co-rotinas são procedimentos que chamam uns aos outros, sendo que a cada nova chamada o procedimento continua do ponto onde parou na última vez, ou seja, a partir do comando seguinte ao último retorno.

(A) (B) A chamado pelo programa principal A retorna ao programa principal

♦ Este esquema pode ser implementado se existir alguma instrução que permita trocar o topo da pilha com o contador do programa. Inicialmente é necessário a

(63)

Armadilhas (Traps)

♦ Uma armadilha ou trap é um tipo de chamada automática de procedimento disparada por alguma condição causada pelo programa; em geral, uma condição importante ou rara.

♦ Exemplo: estouro numa operação aritmética (overflow). • Numa operação aritmética, ao ocorrer um resultado que

excede o maior número que puder ser representado, ocorre um trap, o que significa que o fluxo de controle será transferido para alguma posição fixa na memória em vez de continuar seqüencialmente.

• A partir desta posição fixa, existe um salto para um

procedimento denominado rotina de tratamento de trap, que toma alguma ação apropriada (quem faz esta rotina de tratamento do trap coloca esta instrução de desvio).

♦ O trap pode ser considerado uma interrupção de caráter síncrono, pois ocorre sincronamente com a execução da instrução.

♦ Exemplos de Traps:

• Overflow e Underflow em ponto-flutuante. • Overflow em inteiro.

• Violação de proteção.

• Código de operação indefinido. • Estouro da pilha.

(64)

Interrupções

♦ Uma interrupção ou conjunto de interrupções é um mecanismo que permite suspender temporariamente a execução de um programa, para tratar um evento, de forma a possibilitar o seu posterior prosseguimento de execução.

♦ As interrupções podem ser classificadas em:

Interrupções Síncronas ou Traps: são interrupções cujo evento está diretamente sincronizado com a execução de uma determinada instrução.

∗ Exemplos: overflow, divisão por zero.

Interrupções Assíncronas: são interrupções relacionadas a eventos externos.

∗ Exemplos: o pressionar de uma tecla num computador.

♦ Uma interrupção pára o programa em execução e transfere o controle do programa para uma sub-rotina de tratamento de interrupção, que executa alguma ação apropriada. Ao terminar de tratar o evento, a sub-rotina de tratamento de interrupção retorna o controle para o programa

interrompido.

(65)

♦ Problemas: o programa interrompido deve voltar a ser executado no mesmo estado em que estava antes de ocorrer a interrupção.

♦ As interrupções assíncronas podem ser implementadas num determinado hardware de duas formas:

Interrupções diretas por hardware: são aquelas

interrupções que vêm diretamente dos dispositivos de E/S para a CPU que sabe, a partir do sinal de interrupção em particular, em que local da memória (fixo) buscar o

endereço da sub-rotina de tratamento da interrupção.

Interrupções vetoradas: são interrupções que fornecem, além do sinal de pedido de interrupção, o vetor de

interrupção (número inteiro que identifica o dispositivo) pela via de dados do sistema.

∗ Permite a canalização de diversos pedidos de interrupção através de um único sinal.

∗ O gerenciamento dos diversos pedidos é feito

externamente por um controlador de interrupção.

`

Controlador

do

Dispositivo

de

E/S

CPU

♦ Considerando a ocorrência de uma interrupção vetorada, DADOS

INTA INT

Vetor de Interrupção

(66)

procedimentos a serem realizados pelo software, que em conjunto, devem garantir o tratamento do evento e o

posterior prosseguimento do programa interrompido, como se nada tivesse ocorrido.

• Tarefas do Hardware:

1. O controlador do dispositivo gera um pedido de interrupção (INT - Interrupt Request).

2. Quando a CPU puder atender ao pedido de interrupção (por exemplo, ao terminar de executar a instrução

corrente), ela envia um sinal de reconhecimento de interrupção (INTA - Interrupt Acknoledge).

3. Recebendo o reconhecimento da interrupção, o

controlador do dispositivo envia pela via de dados o seu número de identificação (vetor de interrupção).

4. A CPU obtém o vetor de interrupção e o armazena internamente.

5. A CPU salva o seu status mínimo, (PSW - Processor Status Word), na pilha, como o Contador do Programa, o Acumulador e os Flags de Máquina.

6. A CPU carrega o Contador do Programa com o endereço da sub-rotina de tratamento daquela interrupção, obtido da memória (tabela de vetores de interrupção), a partir do vetor de interrupção recebido.

(67)

Memória

0000h Endereço do vetor 0

Tabela 0002h Endereço do vetor 1

de 0004h Endereço do vetor 2

Vetores 0006h Endereço do vetor 3

de 0008h Endereço do vetor 4

Interrupção

000Ah Endereço do vetor 5

000Ch Endereço do vetor 6

000Eh Endereço do vetor 7

• Tarefas do Software:

1. A sub-rotina de tratamento da interrupção salva o

conteúdo dos registradores da CPU que irá utilizar, por exemplo, na pilha.

2. A sub-rotina realiza a sua tarefa propriamente dita: a operação de E/S (por exemplo, lê o código da tecla pressionada e o armazena num buffer).

3. A sub-rotina restaura o conteúdo dos registradores salvos.

4. A sub-rotina executa uma instrução de retorno da interrupção, permitindo a CPU recuperar o seu status mínimo (PSW).

5. O programa interrompido prossegue então como se a interrupção não tivesse ocorrido.

♦ Conceito relativos a interrupção:

Transparência: uma sub-rotina de interrupção é dita transparente quando após o retorno da sub-rotina o

programa interrompido volta para o estado exato em que estava anteriormente a chegada da interrupção.

(68)

Simultaneidade de Interrupções: se duas interrupções ocorrem ao mesmo instante, a de maior prioridade será atendida.

(69)

• Uma interrupção pode ocorrer enquanto outra está sendo

tratada pela sua sub-rotina de tratamento. Soluções possíveis:

Inibição: todas as sub-rotinas de tratamento de

interrupção inibem interrupções subseqüentes antes de tomar qualquer outra atitude.

◊ Problema: pode-se perder outras interrupções.

Prioridade: cada interrupção tem uma prioridade diferente, definida na PSW, por exemplo. Eventos mais prioritários são atribuídos a interrupções de maior prioridade. Quando uma interrupção de prioridade n estiver sendo tratada, somente eventos mais prioritários podem interrompê-la; eventos menos prioritários devem aguardar.

Referências

Documentos relacionados

O Banco Alfa de Investimento S.A., instituição líder do Conglomerado Prudencial Alfa elaborou um conjunto de demonstrações contábeis para fins gerais referentes ao semes- tre findo

II - A expressão “Peramanca” ou “Pêra-manca” está usada nas marcas “Vinho Pera-Manca Tinto” e “Vinho Pera-Manca” de forma fantasiosa (e não para designar a

Uma  vez  que  a  correção  de  fenótipos  diminui  a  contribuição do parentesco para a análise, pressupõe- se que a metodologia RR-Blup foi a mais penalizada,

A garantia não cobre também peças sujeitas ao desgaste natural tais como: botões de comando, teclas de controle, puxadores e peças móveis, cabo de força, cabos de conexão

No adensamento manual, a primeira camada deve ser atravessada em toda a sua espessura, quando adensada com a haste, evitando-se golpear a base do molde. Os golpes devem

O acelerômetro Biotrainer II não identifica atividades realizadas sentadas ou deitadas, logo, para que as comparações entre os dados obtidos pelo acelerômetro com o R24AF

Passo 4: Passe uma lima fina em bombas, corpos de válvulas e carcaças.. Apenas algumas passadas com a lima para remover ressaltos, amassamentos e rebarbas, bem como marcas de

A adaptação com a sociedade paulistana foi um processo que costumou levar pouco tempo segundo os entrevistados, tanto que foi observada a intenção de seguir mantendo