Organização Básica de computadores e linguagem de...
Transcript of Organização Básica de computadores e linguagem de...
Organização Básica de computadores e linguagem de
montagem
2o Semestre de 2011
Prof. Edson Borin
Entrada e Saída
Entrada e Saída
• Dispositivos de E/S (Entrada/Saída) ou I/O (Input/Output) permitem a entrada e saída de dados do processador.
• Ex: Teclado, Mouse, Monitor, Impressora, Placa de rede, disco rígido, unidade de CD-ROM.
• Como funciona?
Saída6 CAPÍTULO 2. ORGANIZAÇÃO BÁSICA DE COMPUTADORES
Barramento de dados
Barramento de controle
Barramento de endereço
Processador Memória
Entradae
Saída
Figura 2.1: Esquema simplificado de um computador
os dados podem trafegar nas duas direções, enquanto que no barramento de
endereços a informação trafega em uma única direção. O barramento de en-
dereços contém tantos fios (bits) quantos forem necessários para endereçar
todas as palavras da memória. O número de fios (bits) do barramento de
dados é igual ao tamanho de cada palavra na memória. Assim, para comu-
nicação com uma memória organizada como 2 MB palavras de 32 bits (total
de 8 MB), o processador deve dispor de um barramento de dados com 32 fios
(largura da palavra), e um barramento de endereço com pelo menos 21 fios
(para endereçar 2 MB palavras).
A comunicação entre o processador e a memória é feita da seguinte ma-
neira. Quando o processador necessita de um dado na memória, ele especifica
pelo barramento de endereços qual o endereço de memória da palavra que
contém o dado. Feito isto, o processador especifica pelo barramento de con-
trole que a operação é de leitura em memória (note que isto pode ser realizado
com apenas um fio do barramento). A memória coloca então o valor da palavra
especificada no barramento de dados, que é finalmente lido pelo processador.
A operação de escrita na memória é similar. O processador coloca no
barramento de endereços o endereço da palavra que deve ser modificada, e no
barramento de dados o valor a ser escrito. O processador indica pelo barra-
Escrever em um dispositivode Saída.
Saída
• Como o programa realiza uma saída?• Escreve em uma porta, que está associada a um
dispositivo de saída.• 2 opções comuns:
–Instrução especial para saída. Ex:out 10h, r1
–Instrução de store em uma faixa de endereços reservada. Ex:
st 10h, r1Como o processador sabe se é uma saída ou acesso à memória?
Entrada6 CAPÍTULO 2. ORGANIZAÇÃO BÁSICA DE COMPUTADORES
Barramento de dados
Barramento de controle
Barramento de endereço
Processador Memória
Entradae
Saída
Figura 2.1: Esquema simplificado de um computador
os dados podem trafegar nas duas direções, enquanto que no barramento de
endereços a informação trafega em uma única direção. O barramento de en-
dereços contém tantos fios (bits) quantos forem necessários para endereçar
todas as palavras da memória. O número de fios (bits) do barramento de
dados é igual ao tamanho de cada palavra na memória. Assim, para comu-
nicação com uma memória organizada como 2 MB palavras de 32 bits (total
de 8 MB), o processador deve dispor de um barramento de dados com 32 fios
(largura da palavra), e um barramento de endereço com pelo menos 21 fios
(para endereçar 2 MB palavras).
A comunicação entre o processador e a memória é feita da seguinte ma-
neira. Quando o processador necessita de um dado na memória, ele especifica
pelo barramento de endereços qual o endereço de memória da palavra que
contém o dado. Feito isto, o processador especifica pelo barramento de con-
trole que a operação é de leitura em memória (note que isto pode ser realizado
com apenas um fio do barramento). A memória coloca então o valor da palavra
especificada no barramento de dados, que é finalmente lido pelo processador.
A operação de escrita na memória é similar. O processador coloca no
barramento de endereços o endereço da palavra que deve ser modificada, e no
barramento de dados o valor a ser escrito. O processador indica pelo barra-
Ler de um dispositivode Entrada.
Entrada
• Como o programa realiza uma entrada?• Lê de uma porta, que está associada a um
dispositivo de entrada.• 2 opções comuns:
–Instrução especial para entrada. Ex:in r1, 10h
–Instrução de load em uma faixa de endereços reservada. Ex:
ld r1, 10hComo o processador sabe se é uma entrada ou acesso à memória?
No Faíska
• Entrada–in rdest, expr8–in rdest, rfonte–inb rdest, expr8–inb rdest, rfonte
• Saída–out expr8, rdest–out rfonte, rdest–outb expr8, rdest–outb rfonte, rdest
Exemplo - Elevador
• Dois dispositivos. 1 de entrada e 1 de saída
• Entrada:–sensor de andar. Conectado à porta 20h.–quando acessado, responde com um byte indicando o andar atual (de 0 a 9)
Exemplo - Elevador
• Saída–mostrador digital: Conectado à porta 30h–dispositivo com 7 segmentos (a,b,...,g) luminosos que
ficam ligados ou desligados de acordo com o dado no registrador de controle.
–a saída corresponde em escrever um byte no registrador de controle.
4 CAPÍTULO 5. ENTRADA E SAÍDA
elevador:
1 SENSOR_DATA equ 20h ; porta do sensor
23 inb r0,SENSOR_DATA ; le valor do andar corrente
O mostrador é um dispositivo apenas de saída, com um único dígito, conforme a
Figura 5.1 (a). Os segmentos do mostrador, mais o ponto decimal, podem ser indivi-
dualmente ligados ou desligados. Cada segmento corresponde a um bit em um byte,
mostrado na Figura 5.1 (b). O mostrador está conectado à porta 30h, chamada de porta
de dados do mostrador. A operação de escrita de um byte nessa porta controla quais
segmentos são acesos e quais são apagados. Se um determinado bit tem o valor 1, o
segmento correspondente é aceso, caso contrário o segmento correspondente é apagado.
Assim, por exemplo, se um byte com o valor 7eh for escrito na porta do mostrador, o
dígito ‘0’ será mostrado (apenas os segmentos p e g apagados) e se um byte com o valor
30h for escrito na porta do mostrador o dígito ‘1’ será mostrado (apenas os segmentos be c ligados).
a
b
c
d
e
fg
p
bp gca e fd
6 0157 3 24
(a) (b)
Figura 5.1: Mostrador de sete segmentos (a) e os bits correspondentes no byte de controle
(b).
Exercício 5.1 Escrever um procedimento que atualize o valor do mostrador do elevador
com o valor lido do sensor.
Exemplo - Elevador5.2. SINCRONIZAÇÃO 5
1 ; *************
2 ; AtualizaAndar
3 ; *************
4 ; Lê andar corrente do sensor e atualiza valor do mostrador
5 ; Destrói: r0 e r2
67 ; definição das portas usadas
8 SENSOR_DATA equ 20h ; porta do sensor
9 DISPLAY_DATA equ 30h ; porta do mostrador
1011 AtualizaAndar:
12 inb r0,SENSOR_DATA ; lê valor do andar corrente
13 set r2,tab_digitos ; prepara para determinar codificação
14 add r2,r0 ; do digito lido
15 ldb r2,(r2) ; carrega a codificação correspondente
16 outb DISPLAY_DATA,r2; escreve no mostrador
17 ret
1819 ; tabela de codificação de dígitos
20 tab_digitos:
21 db 7eh,30h,6dh,79h,33h,5bh,5fh,70h,7fh,7bh
O procedimento AtualizaAndar simplesmente lê o valor do andar corrente e atualiza
o mostrador com o valor correspondente. A codificação dos dígitos é armazenada no
vetor de bytes tab_digitos. O valor lido do sensor é usado como índice nesse vetor
para determinar a codificação do dígito a ser mostrado.
5.2 Sincronização
Os exemplos vistos acima são muito simples, e não ilustram a principal diferença entre
acessos à memória e a dispositivos de E/S, que é a sincronização no acesso. No caso de
acessos de leitura à memória, como vimos, o processador espera apenas um tempo fixo
(chamado tempo de resposta, que é o tempo com que a memória responde a um acesso
de leitura mais o tempo necessário para que os barramentos se estabilizem), e executa
a leitura, tendo a certeza de que, se a memória estiver especificada corretamente para
atender a esse tempo de resposta, o dado estará disponível no barramento de dados.
Considere agora um dispositivo de entrada bastante utilizado, um teclado. Nos nossos
exemplos vamos utilizar um teclado similar aos utilizados em telefones, mostrado na
figura abaixo.
Considere que o teclado possa ser acessado através da porta 40h: uma leitura nessa
porta, chamada de porta de dados do teclado, recebe um valor correspondente à última
tecla pressionada. No entanto, como saber se uma tecla foi realmente pressionada (e
ainda não foi lida)? Para resolver esse problema, o teclado possui mais uma porta, cha-
mada de porta de estado do teclado, que pode ser consultada para saber o estado do
teclado. O estado do teclado é indicado por um byte em que os dois bits menos signifi-
cativos representam condições de operação do teclado:
Problemas com a abordagem anterior
• Suponha que o elevador suba 8 andares.
• Quando devemos chamar o procedimento AtualizaAndar?
Outro Exemplo - Teclado
• Teclado:–Dispositivo de Entrada–Duas portas: dados (40h) e estado (41h)–Dado lido representa caractere
inb r1, 40h ; lê dadoinb r2, 41h ; lê estado
Teclado simples
1 2 3
4 5 6
7 8 9
* 0 #
• E se o teclado for apertado múltiplas vezes?
• Como saber se o dado que está lá já foi lido?
Outro Exemplo - Teclado
• Teclado:–um bit de estado indica se o dado atual não foi lido pelo processador ainda (READY).
–outro bit de estado indica se mais de um botão já foi apertado antes do processador ler o dado, ou seja, houve dado perdido (OVRN)
Teclado simples
1 2 3
4 5 6
7 8 9
* 0 #
Outro Exemplo - Teclado (Busy waiting)
5.2. SINCRONIZAÇÃO 7
1 ; *******
2 ; LeTecla
3 ; *******
4 ; Le valor de tecla no teclado
5 ; Destroi: r0, r1, flags
6 ; Retorna: r0 com valor da tecla lida (de 0 a 11)
78 ; enderecos de portas
9 KEYBD_DATA equ 40h ; porta de dados
10 KEYBD_STAT equ 41h ; porta de estado
1112 ; bits de estado
13 KEYBD_READY equ 1 ; bit READY
14 KEYBD_OVRN equ 2 ; bit OVRN
1516 LeTecla:
17 inb r0,KEYBD_STAT ; lê porta de estado
18 set r1,KEYBD_READY
19 test r0,r1 ; dado pronto para ser lido?
20 jz LeTecla ; espera que dado esteja pronto
21 set r1,KEYBD_READY
22 test r0,r1 ; houve erro?
23 jnz Erro ;
24 inb r0,KEYBD_DATA ; le porta de dados
25 ret
26 ; aqui trata erro (não mostrado)
27 Erro:
O procedimento LeTecla espera até que uma tecla tenha sido pressionada e re-
torna o valor da tecla no registrador r0. O problema com esse procedimento é que,
como não é possível rever quando uma tecla será pressionada, o processador pode fi-
car muito tempo no laço das linhas 15 18. Esse é um problema típico de sincronização
da comunicação processador – E/S, e a solução adotada pelo procedimento LeTecla é
chamada de “espera forçada”.
Uma maneira de amenizar o problema é modificar o procedimento LeTecla para
retornar imediatamente se nenhuma tecla foi pressionada desde a última leitura:
Problemas com a abordagem anterior
• Suponha que o usuário demore para apertar algo.
• O que o processador faz?
Problemas com a abordagem anterior
• Suponha que o usuário demore para apertar algo.
• O que o processador faz?
• Como melhorar?
–Verifique o teclado de tempos em tempos e faça algum trabalho útil no entre as verificações.
•Ainda há o risco do usuário pressionar a tecla múltiplas vezes antes do programa verificar se alguma tecla foi pressionada.
•Talvez o usuário não seja tão rápido para causar este problema, mas e se for uma placa de rede.
Problemas com a abordagem anterior
• Suponha que o usuário demore para apertar algo.
• O que o processador faz?
• Como melhorar?
–Verifique o teclado de tempos em tempos e faça algum trabalho útil no entre as verificações.
•Ainda há o risco do usuário pressionar a tecla múltiplas vezes antes do programa verificar se alguma tecla foi pressionada.
•Talvez o usuário não seja tão rápido para causar este problema, mas e se for uma placa de rede.
Interrupção: O dispositivo
avisa o processador quando
acondeceu alguma coisa!
Interrupção
• Iniciativa de comunicação é do periférico• Exemplo:
–Quando o dado está disponível, o teclado “interrompe” o processador.
–O processador pára o que está fazendo para atender o teclado
–Após o processamento da leitura, o processador continua com o que estava fazendo.
Interrupção
• O processador pára o que está fazendo para atender o teclado.
• O que acontece com o programa que o processador estava executando???
Interrupção
• O processador pára o que está fazendo para atender o teclado.
• O que acontece com o programa que o processador estava executando???–Antes de tratar a interrupção, é importante salvar
todo o “contexto” do programa que está executando•Registradores,•flags,•Manter a pilha consistente...
Exemplo: Interrupção
set r1, 1000loop: call algo_util sub r1, 1h cmp r1, 0 jnz loop sys 20h
6 CAPÍTULO 2. ORGANIZAÇÃO BÁSICA DE COMPUTADORES
Barramento de dados
Barramento de controle
Barramento de endereço
Processador Memória
Entradae
Saída
Figura 2.1: Esquema simplificado de um computador
os dados podem trafegar nas duas direções, enquanto que no barramento de
endereços a informação trafega em uma única direção. O barramento de en-
dereços contém tantos fios (bits) quantos forem necessários para endereçar
todas as palavras da memória. O número de fios (bits) do barramento de
dados é igual ao tamanho de cada palavra na memória. Assim, para comu-
nicação com uma memória organizada como 2 MB palavras de 32 bits (total
de 8 MB), o processador deve dispor de um barramento de dados com 32 fios
(largura da palavra), e um barramento de endereço com pelo menos 21 fios
(para endereçar 2 MB palavras).
A comunicação entre o processador e a memória é feita da seguinte ma-
neira. Quando o processador necessita de um dado na memória, ele especifica
pelo barramento de endereços qual o endereço de memória da palavra que
contém o dado. Feito isto, o processador especifica pelo barramento de con-
trole que a operação é de leitura em memória (note que isto pode ser realizado
com apenas um fio do barramento). A memória coloca então o valor da palavra
especificada no barramento de dados, que é finalmente lido pelo processador.
A operação de escrita na memória é similar. O processador coloca no
barramento de endereços o endereço da palavra que deve ser modificada, e no
barramento de dados o valor a ser escrito. O processador indica pelo barra-
Teclado simples
1 2 3
4 5 6
7 8 9
* 0 #
Exemplo: Interrupçãoset r1, 1000loop: call algo_util sub r1, 1h cmp r1, 0 jnz loop sys 20h
trata_teclado: push r0 inb r0, 40h ... ; faça algo pop r0 iret
6 CAPÍTULO 2. ORGANIZAÇÃO BÁSICA DE COMPUTADORES
Barramento de dados
Barramento de controle
Barramento de endereço
Processador Memória
Entradae
Saída
Figura 2.1: Esquema simplificado de um computador
os dados podem trafegar nas duas direções, enquanto que no barramento de
endereços a informação trafega em uma única direção. O barramento de en-
dereços contém tantos fios (bits) quantos forem necessários para endereçar
todas as palavras da memória. O número de fios (bits) do barramento de
dados é igual ao tamanho de cada palavra na memória. Assim, para comu-
nicação com uma memória organizada como 2 MB palavras de 32 bits (total
de 8 MB), o processador deve dispor de um barramento de dados com 32 fios
(largura da palavra), e um barramento de endereço com pelo menos 21 fios
(para endereçar 2 MB palavras).
A comunicação entre o processador e a memória é feita da seguinte ma-
neira. Quando o processador necessita de um dado na memória, ele especifica
pelo barramento de endereços qual o endereço de memória da palavra que
contém o dado. Feito isto, o processador especifica pelo barramento de con-
trole que a operação é de leitura em memória (note que isto pode ser realizado
com apenas um fio do barramento). A memória coloca então o valor da palavra
especificada no barramento de dados, que é finalmente lido pelo processador.
A operação de escrita na memória é similar. O processador coloca no
barramento de endereços o endereço da palavra que deve ser modificada, e no
barramento de dados o valor a ser escrito. O processador indica pelo barra-
Teclado simples
1 2 3
4 5 6
7 8 9
* 0 #
Interrupção
• Diversos dispositivos de E/S.
• Como chamar o tradador de interrupção correto?
• Diversas opções:
–a) Um único tratador que verifica qual dispositivo interrompeu e chama o procedimento adequada.
–b) Múltiplos tratadores, um para cada dispositivo.
•Vetor de interrupções!
–Armazena o endereço das rotinas de tratamento.
Exemplo: Interrupçõesorg 0004hdw trata_teclado
org 0404hset r1, 1000loop: call algo_util sub r1, 1h cmp r1, 0 jnz loop sys 20h
org 0500htrata_teclado: push r0 inb r0, 40h ... ; faça algo pop r0 iret
0000 ...
0004 0500
.... ...
0404 set r1,1000
040c call algo_util
0414 sub r1, 1h
0418 cmp r1, 0
041c jnz 040c
0420 sys 20
.... ...
0500 push r0
0504 inb r0, 40h
.... ...
0520 pop r0
0524 iret
Vetor de Interrupções
Memória
Principal
0x15000x14FC0x14F80x14F40x14F00x14EC0x14E8
0x0000
Pilh
a
Interrupções no Faíska• Vetor de interrupções com 256 entradas• Endereço 0 ao 1023• Ao receber uma interrupção, o processador:
– termina a execução da instrução atual
– empilha o endereço da instrução atual (próxima)
– empilha o registrador de bits de estado– consulta o controlador de interrupções para determinar o tipo
de interrupção (T) mais prioritária
– Acessa a memória para determinar o endereço do tratador da interrupção. O acesso é no endereço 4 * T. O vetor de interrupções começa no endereço 0 da memória e cada entrada possui 4 bytes, logo a T-ésima entrada está no endereço 4 * T.
– desvia a execução para a rotina de tratamento: IP <= endereço do tratador
Interrupções no Faíska• Rotinas de interrupção retornam à execução do programa com a
instrução “iret”. Esta instrução:– Desempilha o registrador de bits de estado,
– Desmpilha o endereço da próxima instrução a ser executada, e
– Desvia a execução para a próxima instrução.
Interrupções
• E se ocorrer outra interrupção enquanto o processador estiver tratando uma interrupção???
Interrupções
• E se ocorrer outra interrupção enquanto o processador estiver tratando uma interrupção???–Se a nova interrupção for de maior prioridade, é
melhor interromper o tratamento atual e tratar a nova interrupção.
• Mas e se a rotina estiver “conversando” com um dispositivo que não pode esperar?
Interrupções
• E se ocorrer outra interrupção enquanto o processador estiver tratando uma interrupção???–Se a nova interrupção for de maior prioridade, é
melhor interromper o tratamento atual e tratar a nova interrupção.
• Mas e se a rotina estiver “conversando” com um dispositivo que não pode esperar?–Neste caso, podemos inibir interrupções!
•cli: clear interrupts•sti: set interrupts
Exemplo: relógioorg 12h * 4dw timer ; Interrupção do timerorg 400htempo_seg: ds 4 ; Variavel para guardar o tempo e seg....set r0, 1000 ; Programar o timer paraout TIMER_DATA, r0 ; interromper a cada 1000 ms
loop: ; laço principal. call mostra_tempo ; jmp loop
timer: ; tratador de interrupção push r0 ; incrementa o tempo em segundos. ld r0, tempo_seg add r0, 1 st tempo_seg, r0 pop r0 iret
Exemplo: relógioorg 12h * 4dw timer ; Interrupção do timerorg 400htempo_seg: ds 4 ; Variavel para guardar o tempo e seg....set r0, 1000 ; Programar o timer paraout TIMER_DATA, r0 ; interromper a cada 1000 ms
loop: ; laço principal. call mostra_tempo ; wait ; Dorme!!! jmp loop
timer: ; tratador de interrupção push r0 ; incrementa o tempo em segundos. ld r0, tempo_seg add r0, 1 st tempo_seg, r0 pop r0 iret