Escolar Documentos
Profissional Documentos
Cultura Documentos
x86
MICROPROCESSADORES MICROPROCESSADORES
Machine Translated by Google
—Robert Frost
Machine Translated by Google
x86
MICROPROCESSADORES MICROPROCESSADORES
LYLA B DAS
professor associado
Departamento de Engenharia Eletrônica e de Comunicação
Instituto Nacional de Tecnologia Calicute
Kozhikode
Kerala
Machine Translated by Google
Design da capa: Rahul Sharma Composição: White Lotus Infotech Unip. Ltda., Pondicherry
Design de Interiores: Syed Dilshad Ali Impressora: Chennai Micro Print, Chennai
Os diagramas de pinos, diagramas de temporização e arquitetura interna dos processadores x86 são reproduzidos neste
livro a partir dos manuais da Intel com a permissão da Intel Corporation, Califórnia.
Este livro é vendido sob a condição de que não seja, por meio de troca ou de outra forma, emprestado, revendido, alugado
ou distribuído de outra forma sem o consentimento prévio por escrito do editor em qualquer forma de encadernação ou capa
diferente daquela em que foi é publicado e sem uma condição semelhante, incluindo esta condição sendo imposta ao
comprador subsequente e sem limitar os direitos sob os direitos autorais reservados acima, nenhuma parte desta publicação
pode ser reproduzida, armazenada ou introduzida em um sistema de recuperação, ou transmitida de qualquer forma ou por
qualquer meio (eletrônico, mecânico, fotocópia, gravação ou outro), sem a permissão prévia por escrito do proprietário dos
direitos autorais e do editor deste livro.
ISBN: 978-81-317-3246-5
10 9 8 7 6 5 4 3 2 1
Publicado por Dorling Kindersley (Índia) Unip. Ltd., licenciados da Pearson Education no sul da Ásia.
Sede: 7th Floor, Knoweldge Boulevard, A-8 (A), Setor 62, Noida 201309, UP, Índia.
Sede: 11 Community Centre, Panchsheel Park, Nova Delhi 110 017, Índia.
Machine Translated by Google
conteúdo
Prefácio xv
Sobre o autor xix
Capítulo Questões 47
Exercício 48
1 A Arquitetura de 8086 51
1.1 Diagrama de Blocos Internos do 8086 1.2 A 51
Unidade de Execução 51
1.3 Unidade de Interface de Barramento 58
Questões 69
Exercício 69
2 Conceitos de Programação – I 71
2.1 O Processo de Montagem 2.2 71
Montadores para x86 73
vii
Machine Translated by Google
viii CONTEÚDO
deste Capítulo 93
Exercício 94
3 Conceitos de Programação – II 95
3.1 Abordagens de Programação 3.2 95
Perguntas 137
Exercício 137
Procedimentos 145
176
177
Exercício 177
CONTEÚDO ix
Perguntas 193
Exercício 193
Exercício 224
246
Exercício 246
264
277
Machine Translated by Google
x CONTEÚDO
Perguntas 287
Exercício 287
296
9,9 Interface com um Conversor Digital para Analógico 9.10 Interface de 317
Displays de Cristal Líquido com o 8086 9.11 Interface de um Motor de Passo 322
com o 8086 9.12 Interface de Teclado Hex 9.13 Interface de Displays de Led 327
341
347
348
Exercício 348
390
Perguntas 393
Exercício 394
CONTEÚDO XI
Perguntas 429
Exercício 429
(SDRAM) 440
Perguntas 484
Exercício 484
xii CONTEÚDO
Perguntas 502
Exercício 502
CONTEÚDO xiii
580
Questões 586
Exercício 586
Apêndice A 587
Apêndice B 599
apêndice C 607
Apêndice D 617
Apêndice E 625
Bibliografia 635
Índice 637
Machine Translated by Google
Machine Translated by Google
prefácio
Preâmbulo
Em meus vinte e cinco anos de experiência de ensino (quase), lecionei disciplinas tão variadas quanto eletrônica básica,
circuitos eletrônicos, processamento digital de sinais, comunicações, teoria da informação, processamento digital de imagens,
arquitetura de computadores, programação de computadores e microprocessadores, para citar apenas alguns. No entanto,
microprocessadores, microcontroladores, programação em linguagem assembly e interface de hardware chamaram minha
atenção e interesse, em algum momento. Este livro é resultado de meu interesse contínuo por esses tópicos.
Embora eu tenha usado vários livros didáticos para ensinar microprocessadores, senti que algo está faltando na maioria
deles – ou eles não abordam bem os conceitos de programação ou sua abordagem à série x86 de microprocessadores cria
uma impressão de que é difícil entender e gerenciar, e que a programação em linguagem assembly é hostil e difícil de
dominar. Neste livro, tentei eliminar essas deficiências delineando os conceitos em uma abordagem passo a passo, visando
manter a simplicidade das ideias, a lucidez das explicações e a clareza na apresentação como meus princípios norteadores.
Este livro oferece um estudo detalhado da família x86 de microprocessadores. A família x86 compreende os
processadores Intel 8086, 80186, 80286, 80386, 80486 e 80586 (Pentium). A abordagem é estudar a arquitetura da família
x86 baseada na arquitetura do processador elementar, ou seja, o 8086. Os processadores de ordem superior são discutidos
com base nas melhorias, melhorias e diferenças em relação ao 8086 básico.
Esta é a melhor abordagem para aprender a arquitetura familiar e é seguida por estudantes em todo o mundo. A maioria dos
PCs em todo o mundo usa a arquitetura x86. Portanto, é um assunto importante que é ensinado e aprendido no nível
acadêmico e profissional.
Pré-requisito
Abordagem
O tema do livro é centrado na arquitetura do microprocessador x86 e um estudo detalhado da programação em linguagem
assembly e interface com chips externos. Ao longo do livro, a ênfase está em garantir que o leitor possa compreender
conceitos e ideias com facilidade. Para isso, foram incluídos exemplos resolvidos, problemas resolvidos, programas testados
e diagramas explicativos.
Organização do livro
Os alunos que começam a aprender microprocessadores já aprenderam binários e outros sistemas numéricos.
No entanto, anos de ensino me convenceram de que um novo olhar sobre esses conceitos seria necessário para entender a
programação em linguagem assembly. É por isso que um tratamento elaborado foi dado a
xv
Machine Translated by Google
xvi PREFÁCIO
esses conceitos no Capítulo 0. É importante ser claro sobre tópicos como extensão de sinais, aritmética
com sinais e aritmética BCD. Os leitores fariam bem em se familiarizar com os conceitos apresentados
no Capítulo 0. A discussão sobre os elementos da arquitetura de computador neste capítulo destina-se
àqueles que não estudaram este tópico anteriormente. Da mesma forma, o capítulo também fornece
uma visão geral do processador 8085 para benefício daqueles que precisam aprender sobre o 8085
como parte de seus requisitos curriculares. Um estudo do processador 8085 não é necessário para
entender a família de processadores x86.
O Capítulo 1 explica a arquitetura básica do processador 8086. Este capítulo, fundamental para a
compreensão dos tópicos abordados no livro, é repleto de problemas numéricos que explicam conceitos
importantes.
Os Capítulos 6 e 7 são dedicados ao hardware. O Capítulo 6 fala sobre os pinos do processador 8086 e
como esses pinos são usados nas configurações de modo mínimo e máximo. Diagramas de tempo são
apresentados aqui. O Capítulo 7 elabora as técnicas de decodificação de endereços e é importante para
a compreensão dos capítulos de interface de hardware a seguir.
Os capítulos 9 a 11 tratam da interface do processador 8086 com vários periféricos. Vários chips de
interface são introduzidos aqui. Um estudo detalhado de alguns desses chips ajudaria o aluno. Por
exemplo, entender o chip 8255 nos ajudaria a aprender sobre outros chips periféricos com facilidade.
Esses capítulos foram elaborados para atender às necessidades de alunos de graduação que utilizam
esses chips para seus trabalhos de laboratório.
PREFÁCIO xvii
No Capítulo 16, a família de processadores Pentium e seus recursos aprimorados foram listados. A idéia
de processamento 'multi core' também foi abordada.
O livro vem com cinco apêndices e relaciona-se, em ordem, com o manual Intel do processador 8086, o
uso dos comandos DOS e debug, o conjunto de instruções e tempo de instrução do processador 8086,
lista de interrupção do DOS e BIOS e a instrução conjunto do processador 8087. Além disso, há um
apêndice sobre a instalação do MASM 32 e MASM 6.14 disponibilizado no site que acompanha o livro,
www.pearsoned.co.in/ lylabdas. Suplementos ao livro na forma de slides em PowerPoint podem ser
acessados no site associado. Os apêndices e slides do PowerPoint agregam valor ao livro, disseminando
informações adicionais sobre tópicos selecionados para o aluno perspicaz.
Espero ter abordado efetivamente o aprendizado da família x86 de microprocessadores. Sugiro que
todos os professores desta disciplina enfatizem o uso de um montador e programação prática para
tornar os tópicos mais interessantes.
Contato
Seus comentários e sugestões para a melhoria deste livro são bem-vindos. Embora todas as tentativas
tenham sido feitas para eliminar erros neste livro, alguns ainda podem ter conseguido se infiltrar. Por
favor, aponte-os para mim – meu ID de e-mail é lbd@nitc.ac.in.
RECONHECIMENTOS
Ao terminar de escrever este livro, percebo, com um sentimento de profunda humildade, que tenho
muitas pessoas a agradecer. Agradeço primeiramente a Sojan Jose, editor da Pearson Education, que
descobriu o autor em mim. Foi apenas o seu entusiasmo, encorajamento e apoio que me deu coragem
para embarcar neste empreendimento. Ramesh, Thomas e outros membros da equipe deste projeto da
Pearson Education me impressionaram com seu profissionalismo e agradeço-lhes de todo o coração por
todo o trabalho que fizeram para concluir este livro.
Depois que terminei de escrever os primeiros capítulos, usei o material para ministrar um curso
para os alunos do quarto semestre (lote B070EC). Lembro que muitos alunos participaram ativamente
do processo de ensino-aprendizagem, o que, de fato, me deu dicas e sugestões de como deveria ser
este livro. Agradeço a todos e deixo registrado meu apreço pela curiosidade e determinação em
aprofundar o assunto para além da mera superficialidade.
Muitos dos meus colegas foram fundamentais para me ajudar neste empreendimento. As
discussões que tive com Jagandand, EED e Saidalvi, CSED, foram frutíferas e ajudaram a desenvolver
alguns dos tópicos discutidos neste livro. Sou grato a Anand, mecânico sênior do laboratório de Sistemas
Embarcados, que me auxiliou na execução do trabalho de hardware associado à interface, e sua
experiência de fato facilitou o trabalho para mim. Agradeço ao Dr. Lillykutty Jacob,
Machine Translated by Google
xviii PREFÁCIO
ex-chefe do departamento de engenharia eletrônica e de comunicações, que reduziu o quantum de tópicos que eu
tinha que lecionar por um semestre e me permitiu acelerar a escrita deste livro. Estou em dívida com Kishore, que
compartilhou minhas tarefas no laboratório de microprocessadores para que eu pudesse encontrar tempo para
completar os últimos capítulos conforme programado. Sou grato aos meus alunos de M.Tech, Shiny e Shaeen, por
sua ajuda na leitura de alguns dos capítulos, e a Sneha, Nitin, Venkat e Divya por sua assistência em alguns
experimentos de hardware que foram conduzidos durante a escrita. este livro.
Foi o Dr. Mohamed Rafi quzzaman (Professor, California State Polytechnic University, Pomona, EUA) quem me
apresentou ao montador MASM32 e ao depurador Olly que foram discutidos no Capítulo 15. Sou grato a ele. Agradeço
também ao Dr. Krishna Vedula que foi o principal organizador do workshop da IUCEE, onde tive a oportunidade de
conhecer o Prof. Rafi.
Este livro contém muitos diagramas, e tive a sorte de encontrar algumas pessoas que podiam desenhar
muito bem. Agradeço a Shelitha, Beljith e Ranjusha pela ajuda com as ilustrações.
O último capítulo deste livro contém informações sobre como o PC moderno funciona. Agradeço a Sajth, da Dot
Computers, Calicut, por esclarecer minhas dúvidas e questionamentos sobre este tema e também por me emprestar
a placa-mãe e os componentes que utilizei para gerar as imagens apresentadas naquele capítulo. Agradeço a
contribuição de Rajesh do Raja Studio, Kattangal, que fotografou os chips, placas e outros componentes que aparecem
nas páginas iniciais de cada capítulo.
Agradeço o apoio de meus amigos Dr. Elizabeth Elias, Dr. Sally George, Dr. Jeevamma Jacob, Dr. Sathidevi,
Dr. E. Gopinathan, Dr. Suresh Babu, Dr. Sreelekha e Dr. Deepthi, cuja companhia sempre foi uma fonte de grande
encorajamento para mim.
Meus colegas de departamento sempre foram prestativos e acho que tenho sorte de fazer parte desse grupo de
indivíduos motivados. Sou profundamente grato à minha instituição por me nutrir nos últimos vinte e cinco anos (quase)
e me dar a liberdade de crescer.
Estou feliz que minha família sempre foi uma fonte de consolo para mim.
Por último, mas não menos importante, agradeço aos meus alunos. Todos esses anos, eu fui inspirado por eles.
Eu queria aprender e saber mais, apenas por causa de sua 'demanda'. Espero continuar a ter esses alunos no futuro
também.
LYLA B.THE _
Machine Translated by Google
Sobre o autor
Lyla B. Das é Professora Associada, Departamento de Engenharia Eletrônica, Instituto Nacional de Tecnologia de Calicut
(NITC), Kerala. Ela tem uma mistura diversificada de experiência industrial, ensino e pesquisa abrangendo cerca de 30
anos. Como uma jovem graduada especializada em Eletrônica e Comunicações da Faculdade de Engenharia de
Trivandrum, Lyla B. Das ingressou na Keltron Controls como Engenheira Adjunta em 1981. Quatro anos depois, ela
ingressou no NITC (então Regional Engineering College, Calicut) como palestrante e passou a concluir seu mestrado
em comunicação digital pela mesma faculdade. Ao longo dos anos, foi sucessivamente elevada a Professora Auxiliar e
depois a Professora Associada, cargo que ocupa atualmente.
Ansiosa por buscar e transmitir conhecimento ativamente, Lyla B. Das atualmente ministra cursos sobre
microprocessadores, microcontroladores, projeto de sistemas digitais usando VHDL e projeto de sistemas usando
processadores embarcados em nível de graduação e pós-graduação. Ela apresentou trabalhos de pesquisa em
conferências de estatura nacional e internacional e trabalhou em vários projetos baseados em microprocessadores e
microcontroladores, como máquinas de votação baseadas em microprocessador e sistema de comutação de trilhos
baseado em microcontrolador. Leitora ávida de material de pesquisa contemporâneo, ela se mantém a par das
tendências atuais em seu campo escolhido e orienta os alunos em seu M. Tech. teses de pesquisa.
Lyla B. Das trabalhou em vários projetos financiados pelo Ministério do Desenvolvimento de Recursos Humanos
(MHRD) em áreas de crescimento, incluindo a criação de um laboratório de sistemas embarcados em 2005–2008.
Ela deu palestras especializadas sobre compressão de imagem usando wavelets, microprocessadores e
microcontroladores avançados, sistemas baseados em FPGA e sistemas embarcados em várias faculdades de
engenharia em Kerala. Ela também participou de vários tutoriais e workshops conduzidos pelo Indian Institute of
Technology (IIT) e pelo Indian Institute of Science (IISc). Ela foi Fellow na conferência nacional sobre 'VLSI Design and
Embedded Systems' realizada no IISc Bangalore (2003) e IIT Mumbai (2004). Ela é membro vitalício da System Society
of India e membro da Indian Society for Technical Education e da Computer Society of India.
xix
Machine Translated by Google
Machine Translated by Google
fundamentos de
0 sistemas de computador
A primeira grande ruptura veio com a introdução do 8080 (novamente, pela Intel) em 1974. A Intel se colocou de volta
no mapa com o 8080, que usava o mesmo conjunto de instruções do 8008 anterior, mas o 8080 é geralmente considerado
para ser o primeiro microprocessador verdadeiramente utilizável. O 8080 teve um
2 OS MICROPROCESSADORES x86
barramento de endereço de 16 bits e um barramento de dados de 8 bits, um ponteiro de pilha de 16 bits para a memória que
substituiu a pilha interna de 8 níveis do 8008 e um contador de programa de 16 bits. Ele também continha 256 portas de E/S,
para que os dispositivos de E/S pudessem ser conectados sem tirar ou interferir no espaço de endereçamento. Ele também
possuía um pino de sinal que permitia que a pilha ocupasse um banco de memória separado.
Esses recursos são o que fizeram deste um microprocessador verdadeiramente moderno.
Tudo isso não significa que não houvesse outras empresas no campo dos microprocessadores – havia, e cada uma delas tinha
contribuições a fazer. Estamos falando mais sobre o papel da Intel, porque nos levará ao advento e desenvolvimento da família
de microprocessadores x86 da Intel, a classe de microprocessadores sobre a qual discutimos neste livro.
A Motorola (agora Freescale) é outra empresa que criou seu próprio design original de microprocessadores. Começou com
o chip 6800, que foi seguido por versões mais avançadas desse chip básico. Em termos de capacidade computacional, os
processadores da Motorola são tão bons (ou, de certa forma, melhores) quanto qualquer processador Intel. Os segmentos de
mercado de ambas as empresas estão separados e distintos agora.
Em contraste, a AMD é uma empresa que não optou pelo design original, mas trabalhou na melhoria do design do 8080
sob contratos de licença. Havia também este microprocessador muito popular Z-80 desenvolvido pela Zilog Corporation. Este
microprocessador de 8 bits era compatível com o binário do 8080 e, surpreendentemente, ainda é amplamente utilizado hoje em
muitas aplicações embarcadas. Era para ser superior ao 8080. Embora a Zilog tenha feito versões aprimoradas desse
microprocessador, a empresa não decolou tão bem quanto deveria porque não aguentou a concorrência de grandes players do
mercado.
Em 1976, a Intel atualizou o design do 8080 com o 8085 e tornou-se muito popular como um microprocessador simples e
bem projetado, embora nunca tenha sido usado em um PC. No entanto, ainda é muito popular e usado em várias aplicações,
assim como o processador Z-80 da Zilog.
Em 1978, a Intel introduziu o 8086 de 16 bits, um processador de 16 bits que deu origem à arquitetura x86. Em 1979, a
Intel também lançou o 8088, um microprocessador semelhante em todos os aspectos ao 8086, exceto que seu barramento de
dados externo tinha 8 bits de largura, sendo um microprocessador de 16 bits internamente.
O 80186 nunca foi usado em PCs, mas encontrou aplicações no campo da computação embarcada. O 80286, foi o
próximo processador x86 usado em PCs. Também era uma arquitetura de 16 bits, mas também tinha um barramento de dados
externo de 16 bits. Ele marcou um passo à frente na arquitetura do PC, pois trouxe para os PCs o conceito de memória virtual e
operações de modo protegido. Todos os PCs posteriores têm esses recursos. O próximo grande passo veio com o 80386, que
era um processador de 32 bits
Machine Translated by Google
8086 1978
8088 1979
80186 1982
80286 1982
89386 1985
80486 1989
Pentium 1993
Pentium-2 1997
Pentium-3 1999
Pentium-M 2002
Pentium-4 2004
Pentium-D 2005
Núcleo-2 2006
processador interno e externo. Todos os processadores x86 ainda são de 32 bits internamente, mas o Pentium tem um
barramento de dados externo de 64 bits.
4 OS MICROPROCESSADORES x86
as empresas também fabricavam PCs usando vários outros processadores. No entanto, quando o IBM PC se
tornou um grande sucesso, muitos fabricantes começaram a fabricar PCs semelhantes e as empresas de software
também tiveram a tendência de desenvolver software para PCs compatíveis com IBM PC. Foi assim que surgiu a
revolução dos PCs – e sabemos agora que não é a IBM que fabrica a maioria dos PCs do mundo agora – vários
outros fabricantes fazem, mas o processador x86 ainda forma o núcleo de todos esses PCs. Com mais e mais
pessoas usando PCs, a padronização de software e hardware surgiu lentamente. Isso tornou o mundo da
computação mais organizado e confortável, e os problemas de compatibilidade de hardware e software são muito,
muito menores do que nos primeiros dias.
Atualmente falamos do PC Pentium, que possui muitas versões e diferentes velocidades de clock e a
tendência é indicar a velocidade de clock para especificar o modelo 'Pentium' que queremos para nosso
processador. Por exemplo, o modelo 'Pentium-4 2.2' significa um processador Pentium-4 com uma velocidade de
clock de 2,2 GHz. De fato, a tecnologia percorreu um longo caminho desde o advento do primeiro uso do
processador x86 na frequência de 4,77 MHz !
Nota Neste livro, sempre que usamos a palavra PC, queremos dizer o PC compatível com IBM. Há o outro grande
PC, o Apple Mac, que apesar de ter poucos números, é uma classe de elite de computadores. 'Nosso objetivo não
é construir a maioria dos computadores. É construir o melhor' – de acordo com o CEO da Apple Inc. A Apple tem
uma participação de mercado mundial de apenas 10% do mercado de PCs, mas tem mais de 90% do mercado de
computadores premium.
Neste livro, estudaremos a arquitetura x86 desenvolvida pela Intel. Passaremos pelas ideias de programação em
linguagem assembly e também estudaremos a interface dos processadores x86 com diversos dispositivos.
Freqüentemente, veremos também como uma determinada interface é usada no PC padrão. Embora tenhamos
começado definindo um microprocessador como um computador de chip único, sabemos que um PC não pode
ser feito com apenas um chip. Quando usamos a frase 'computador de chip único', queremos dizer apenas que
todo o poder de computação e processamento está contido nesse único chip que chamamos de microprocessador
- mas para fazer com que esse chip se comunique com o mundo externo e o torne confortável para nós usarmos,
requer muito mais suporte de hardware e software. Faremos uma viagem para entender os conceitos por trás de
como o computador pessoal se tornou parte integrante de nossas vidas.
6 OS MICROPROCESSADORES x86
CPU
Memória E/S
pela CPU, que gera os sinais de controle necessários para ativar as unidades aritméticas e lógicas da CPU. Como
tal, a CPU contém a unidade lógica aritmética e a unidade de controle. Todas essas atividades são cronometradas e
sincronizadas por um trem de pulsos de frequência fixa. Este é o sinal de clock, e também tem a função de sincronizar
a atividade da CPU com a atividade no barramento.
Um barramento é uma coleção de fios de sinal que se conectam entre os componentes dos sistemas do computador
– a figura mostra que a CPU está conectada à memória assim como a E/S através do barramento do sistema, mas
apenas um de cada vez – se a memória e E/S quiser usar o barramento ao mesmo tempo, há um confl ito, pois há
apenas um barramento do sistema. O barramento do sistema é composto pelo barramento de endereços, barramento
de dados e barramento de controle.
O Barramento de Dados O conjunto de linhas usado para transferir dados é chamado de barramento de dados. É
um barramento bidirecional, pois os dados devem ser enviados da CPU para a memória e E/S, e também devem ser
recebidos pela CPU. A largura do barramento de dados determina a taxa de transferência de dados, o tamanho dos
registradores internos da CPU e a capacidade de processamento da CPU. Em suma, é um reflexo da complexidade
do processador. Como vemos, o 8086 tem uma largura de barramento de dados de 16 bits, enquanto o 80486 tem
uma largura de barramento de 32 bits. Assim, o 80486 pode processar dados de 32 bits por vez, enquanto o 8086
pode lidar apenas com 16 bits.
O Barramento de Endereço A largura do barramento de endereço determina o tamanho máximo da memória física
que a CPU pode acessar. Com uma largura de barramento de endereço de 20 bits, o 8086 pode endereçar 220
locais diferentes. Ele pode usar um tamanho de memória de 220 bytes ou 1 MB. Para Pentium com largura de
barramento de endereço de 32 bits, os números correspondentes são 232 bytes, ou seja, 4 GB. Quando um
determinado local de memória deve ser acessado, o endereço correspondente é colocado no barramento de endereços pela CP
Dispositivos de E/S também possuem endereços. Em ambos os casos, é a CPU que fornece o endereço e, como
tal, o barramento de endereços é unidirecional.
O Barramento de Controle O barramento de controle é um conjunto de sinais de controle que precisa ser ativado
para atividades como escrita/leitura para/da memória/E/S, ou atividades especiais da CPU como interrupções e
DMA. Assim, vemos sinais como Memory Read, I/O Read, Memory Write e Interrupt Acknowledge como parte do
barramento de controle. Esses sinais de controle ditam as ações que ocorrem no barramento do sistema que
envolvem comunicações com dispositivos como memória ou E/S.
Por exemplo, o sinal Memory Read será ativado para leitura da memória. Ele é enviado para
Machine Translated by Google
Processador Memória
Barramento de endereços
Dispositivo de E/S
Barramento de dados
E/S
Interface
Dispositivo de E/S
Barramento de Controle
Dispositivo de E/S
memória do processador. Um sinal como 'Interrupt' é recebido pelo processador de um dispositivo de E/S.
Portanto, no barramento de controle, temos sinais viajando em qualquer direção. Algumas linhas de controle
também podem ser bidirecionais.
Agora que discutimos um sistema de computador em geral, vamos nos aprofundar um pouco mais em
seus componentes individuais.
0.2.3 | O Processador
O processador ou microprocessador, como poderíamos chamar, é o componente responsável por controlar
toda a atividade do sistema. Ele executa as três ações a seguir continuamente.
i) Busca uma instrução da memória.
ii) Decodifique a instrução.
iii) Executar a instrução.
Quando escrevemos um programa, ele é armazenado na memória. Nosso código deve ser levado ao
processador para que a ação necessária seja executada. O primeiro passo, obviamente, é 'buscá-lo' da memória.
O próximo passo, ou seja, a decodificação, envolve a interpretação do código sobre qual ação deve ser
realizada. Após a decodificação, a ação necessária é executada. Isso é denominado 'execução de instruções'.
A sequência dessas três ações é chamada de 'ciclo de execução'. Para fazer tudo isso, o processador tem
'circuitos de controle' para buscar e decodificar instruções. A parte ALU do processador executa as operações
aritméticas/lógicas necessárias. A sequência de busca-decodificação-execução é feita continuamente e
infinitamente pelo processador. Uma implicação importante deste ciclo é que a execução da instrução é
'sequencial' por natureza – somente após a primeira instrução ser tratada, a segunda será retomada. No
entanto, haverá situações em que a natureza sequencial da execução do programa é perturbada. É quando
uma instrução 'ramificação' aparece na sequência, e uma nova sequência de instruções será retomada a partir
de um novo local.
Machine Translated by Google
8 OS MICROPROCESSADORES x86
FDE FDE F
F - Buscar
D-Decodificar
E-Executar
RELÓGIO
CICLO
TEMPO
0.2.5 | Memória
A memória associada a um sistema de computador inclui a memória primária e a memória secundária. No entanto,
por enquanto, vamos pensar na memória como constituindo apenas a memória primária ou principal, que geralmente
é RAM (Random Access Memory). A memória é organizada em bytes e a capacidade de um chip de memória é
indicada em termos do número de bytes que ele pode armazenar. Assim, podemos ter chips de tamanho 256 bytes,
1KB, 1MB e assim por diante. Se um computador tiver um espaço total de memória de 20 MB, ele pode usar chips de
RAM com a capacidade disponível para obter essa quantidade de memória.
Existem duas operações básicas associadas à memória – ler e escrever. A leitura faz com que um dado
armazenado em um local de memória seja transferido para a CPU, sem apagar o conteúdo da memória.
A escrita faz com que um novo dado seja colocado em um local de memória (ela substitui o valor anterior).
Há uma certa quantidade de tempo necessária para essas operações e isso é denominado como 'tempo de acesso'.
Machine Translated by Google
Endereço
Escreva
i) Colocar no barramento de endereços, o endereço da posição de memória cujo conteúdo deve ser lido.
Essa ação é executada pelo processador.
ii) Afirme o sinal de leitura de memória que faz parte do barramento de controle.
iii) Aguarde até que o conteúdo do local endereçado apareça no barramento de dados.
v) Desative o sinal de leitura da memória. A operação de leitura de memória terminou e o endereço no barramento de
endereços não é mais relevante.
Ciclo de gravação de memória Como continuação, vamos também examinar as etapas em um ciclo de gravação típico.
i) Colocar no barramento de endereços, o endereço do local onde os dados devem ser gravados.
iii) Ativar o sinal de escrita de memória que faz parte do barramento de controle.
Nesta etapa, devemos lembrar que essas operações são sincronizadas com o relógio do sistema. Um processador 8086
leva pelo menos quatro ciclos de clock para leitura/gravação. Esses quatro ciclos constituem os ciclos de 'leitura de
memória' e 'gravação de memória' para o processador. Outros processadores podem exigir mais/menos ciclos de clock
para as mesmas operações.
10 OS MICROPROCESSADORES x86
Barramento de endereços
Dados
Status
Dispositivo de E/S
Barramento de dados
Comando
Barramento de Controle
Interface de E/S
periféricos – como o chip de interface de tela do teclado, chip de interface de porta paralela e chip de
comunicação serial. Todos esses chips são programáveis – possuem registradores para comandos, dados
e status. Ao programar adequadamente esses chips, podemos fazer com que o processador se comunique
corretamente com qualquer periférico. A Fig 0.8 mostra o uso de uma interface de E/S entre um dispositivo
de E/S e um processador. O processador não é mostrado na figura, mas o barramento do sistema que
vem do processador é mostrado.
Na análise final, podemos pensar em um computador que costumamos usar, como um conglomerado
de componentes que inclui memória e dispositivos de E/S de vários tipos, aplicações e especificações.
Como isso ajuda? Um usuário não precisa se lembrar de códigos binários ou inserir código binário para programação.
Ele só precisa lembrar os códigos simbólicos e a sintaxe associada. Dizemos que a codificação de montagem está em um
nível mais alto do que a codificação de máquina. No entanto, o computador entende os mnemônicos? Não, o que significa
que deve ser uma interface entre linguagem assembly e linguagem de máquina. Esta interface converte os códigos simbólicos
alimentados pelo usuário em códigos de máquina. O software que faz isso é chamado de 'assembler'.
Como a linguagem de máquina é nativa de um processador, cada processador terá sua própria linguagem de máquina
e, portanto, também terá sua própria linguagem assembly. A tradução de linguagem assembly para linguagem de máquina e
vice-versa é um processo de um para um – um opcode é traduzido em um código de máquina exclusivo para um processador
específico.
No entanto, nós, seres humanos, sempre procuramos maneiras mais fáceis de fazer as coisas. Portanto, existem
'línguas de nível superior' que possuem vocabulário e gramática semelhantes à língua falada por nós. Esses idiomas são
muito fáceis de usar porque o processo de comunicação é semelhante ao inglês. Já ouvimos falar de linguagens como C,
FORTRAN, COBOL e muitas, muitas dessas 'linguagens de alto nível'. As características de tais linguagens são que elas são
Assim, se escrevermos um programa em C, podemos usá-lo para rodar em qualquer processador – desde que o 'compilador'
para a linguagem esteja disponível. O compilador é o software que 'traduz as instruções de linguagem de alto nível' para
instruções em uma linguagem de nível inferior. O nível inferior pode ser assembly ou linguagem de máquina. No entanto,
finalmente o processador precisa do código de máquina.
O programa que escrevemos em assembly ou linguagem de alto nível é chamado de programa-fonte ou código-fonte.
Um compilador ou montador converte isso em um código objeto que é 'executável' no sentido de que o processador entende
o código e executa as tarefas indicadas.
0.3.2 | Comparação
Programar em linguagem de máquina é muito complicado e, portanto, descartado no mundo atual.
No entanto, a programação em linguagem assembly é feita com frequência, então vamos agora fazer uma comparação entre
a programação em linguagem assembly e a programação em linguagem de alto nível.
O código de montagem é específico para um processador – o que significa que o código de montagem de 8086 não faz
sentido para 8085 (embora ambos sejam fabricados pela Intel). Os programas assembly precisam que o programador conheça
intimamente a arquitetura do processador. Ele deve conhecer os registradores e sinalizadores e a forma como cada instrução
trata os dados. Portanto, fazer codificação de montagem envolve o estudo do processador em questão. No entanto, uma vez
feita esta parte, a codificação é muito eficiente, compacta e de execução muito rápida. Vantagem de velocidade de cem vezes
ou mais, é bastante comum. A programação em linguagem assembly também dá acesso direto aos principais recursos da
máquina essenciais para a implementação de certos tipos de rotinas de baixo nível, como um kernel ou microkernel do sistema
operacional, drivers de dispositivo e controle de máquina.
A programação em linguagem de alto nível, por outro lado, não é específica do processador. É fácil de aprender e
dominar. No entanto, linguagens de alto nível são abstratas. Normalmente, uma única instrução de alto nível é traduzida em
várias (às vezes dezenas ou em casos raros até centenas) instruções executáveis em linguagem de máquina. O código objeto
gerado por um compilador geralmente não é compacto. No entanto, a vantagem das linguagens de alto nível é que, como são
fáceis de aprender, designers semiqualificados podem ser empregados para atividades de desenvolvimento e, portanto, os
tempos de desenvolvimento e manutenção são muito menores.
Este livro se concentra na arquitetura x86 e na programação em linguagem assembly. O objetivo é transmitir boas
habilidades em linguagem assembly e um conhecimento profundo da arquitetura x86.
Machine Translated by Google
12 OS MICROPROCESSADORES x86
sistema – sabemos que eles usam o sistema binário de números e todos os cálculos são feitos no formato binário.
Assim, temos um problema quando usamos computadores para realizar cálculos para nós. Então, vamos começar esta
discussão primeiro entendendo as complexidades de cada um dos sistemas numéricos comumente usados. Discutiremos
os que mais frequentemente podemos ter que usar no contexto dos computadores.
Isso significa que, associado a cada posição, existe um peso. Aqui o peso é uma potência de 10. Assim
E os números fracionários? As posições do lado direito do número decimal também têm pesos, mas as potências (de
10) são negativas.
6,785 = 6 × 100 + 7 × 10ÿ1 + 8 × 10ÿ2 + 5 × 10ÿ3
= 6 × 1 + 7 × 0,1 + 8 × 0,01 + 5 × 0,001
= 6 + 0,7 + 0,08 + 0,005
Estas são coisas que conhecemos muito bem. Eles foram revisados aqui para mostrar que o mesmo conceito se aplica
a outros sistemas numéricos também.
2: Peso: 25 +16 +8 0 +4 1 +2 1 +1
Número: Valor: 32 1 0
1 1 × 32 +1 × 16 +0 × 8 +1 × 4 +1 × 2 +0 × 1
Somando os valores em todas as posições de bit dá 32 + 16 + 0 + 4 + 2 + 0 = 54. Este é o valor equivalente no sistema
decimal. Não podemos deixar de colocar tudo de volta no sistema decimal, porque este é o sistema numérico com o
qual estamos mais familiarizados e confortáveis.
Nota Às vezes, os números binários são sufixados com B para indicar que são números binários, por exemplo,
110110B, 1010110B. Às vezes, a notação 1101102 também é usada.
14 OS MICROPROCESSADORES x86
Exemplo 0.1
Encontre os valores decimais do número binário 1001.011 B
Solução
Potência de 2: 23 20 8 1 122
1 8 + 0 + 021+ 1 = 9,375 2-2 2-3
Portanto, calculamos o valor decimal equivalente do número hexadecimal fornecido usando o conceito de
pesos posicionais.
Exemplo 0,2
Encontre o valor decimal do número hexadecimal 25.1H
Solução
Há também um sistema octal cuja base é 8. Os cálculos equivalentes envolvidos são deixados como exercício
para o aluno interessado. Em todos os itens acima, fizemos a conversão para a forma decimal de outros
sistemas numéricos. Agora veremos como converteremos um número decimal para outros sistemas de
numeração.
Machine Translated by Google
Nota i) Na maioria dos computadores, o sistema numérico padrão para escrever números é decimal. Quando nos
referimos a números decimais, simplesmente escrevemos como está – como 35, 687 e 234 e assim
por diante. Um número em forma hexadecimal é sufixado com a letra H, por exemplo, 56H, 8FH, 0AH
e assim por diante.
ii) Os números de 0 a 9 são os mesmos no sistema decimal e hexadecimal. Assim, nos
próximos capítulos, você verá que nenhum 'H' é adicionado ao escrever números de 0
a 9, embora não haja nada de errado em escrever 7H, 8H, 01H e assim por diante.
Exemplo 0,3
Encontre o valor binário de 13.
Solução
Exemplo 0,4
Converta o número 213 para a forma binária.
Solução
2)213 resto = 1
2)106 resto = 0
2)53 resto = 1
2)26 resto = 0
2)13 resto = 1
2)6 resto = 0
2)3 resto = 1
2)1 resto = 1
0
Agora escreva os restos de baixo para cima em uma linha, da esquerda para a direita. O número é
11010101.
Machine Translated by Google
16 OS MICROPROCESSADORES x86
16)225 resto = 1
16)14 resto = E
0
Resultado = E1
O método para isso é óbvio, ou seja, divida repetidamente o número decimal por 16, mantendo os restos. Faça isso até
que o quociente seja 0.
Exemplo 0,5
Converta o número decimal 4152 em hexadecimal.
Solução
16)4152 resto = 8
16)259 resto = 3
16)16 resto = 0
16)1 resto = 1
0
Pegue os restos de baixo para cima e escreva em uma única linha da esquerda para a direita. O
número é 1038H.
1 1 0001 9 9 1001
3 3 0011 11 B 1011
4 4 0100 12 C 1100
5 5 0101 13 D 1101
6 6 0110 14 E 1110
7 7 0111 15 F 1111
Machine Translated by Google
O valor binário de 4C57FH é 01001100010101111111. Observar ambas as representações nos mostra o maior
problema com números binários – eles são longos e difíceis de manusear.
Colocá-los em uma forma hexadecimal torna a representação curta e concisa – concluímos que a representação
binária é uma forma expandida da representação hexadecimal onde cada dígito hexadecimal é expandido para sua
forma binária de 4 bits.
Se tivermos um número binário longo, o que podemos fazer para convertê-lo em formato hexadecimal é dividi-lo
em grupos de 4 bits (começando da direita, ou seja, o LSB). Em seguida, escreva a representação hexadecimal de
cada grupo binário de 4 bits. Tente esta técnica com o seguinte número binário: 11100101010100011101.
Exemplo 0,6
Converta o seguinte número binário para o formato hexadecimal.
10111110000111110001.
Solução
É a prática de escrever binários como grupos de quatro com um espaço entre os grupos. Isso aumenta a legibilidade
do número binário.
1011 0001 1111
1110
A1F 0001
E 1
Exemplo 0,7
Converta o seguinte número hexadecimal para a forma binária.
3AF24H
Solução
Pegue cada dígito hexadecimal e escreva seu valor binário equivalente de quatro bits.
F 2 4
3 0011 Um 1010 1111 0010 0100
De tudo isso, devemos perceber que a notação hexadecimal é uma forma contraída de representação de números
rebinários. Os computadores fazem todo o seu processamento usando números binários, mas é mais fácil para nós
representar esse número binário na forma hexadecimal. Então, quando pedimos ao computador para adicionar 34H e
5DH, ele na verdade os expande em forma binária e faz a adição.
Os números decimais são representados por 10 símbolos de 0 a 9, cada um deles sendo chamado de dígito.
Conhecemos o código binário para cada um desses números decimais. Suponha que representemos um
Machine Translated by Google
18 OS MICROPROCESSADORES x86
dígito decimal como um byte, é chamado de 'BCD descompactado'. Considere a representação de 9 – está escrito
como 00001001. Agora, se quisermos escrever 98 em BCD descompactado, ele será escrito como dois bytes:
8
9 00001001 00001000.
BCD empacotado O que, então, é 'BCD empacotado'? Quando cada dígito é empacotado em 4 bits binários, ele é
empacotado em BCD. Assim, 98 é
8
9 1001 1000.
Cada dígito precisa de um nibble (quatro bits) para representá-lo. O formato BCD compactado de 675 é 0110 0111
0101. O ponto importante a ser lembrado é que, como não há dígito maior que 9, nenhum nibble BCD pode ter
um código maior que '1001'. Os computadores processam números BCD, mas o usuário deve estar ciente da
representação numérica que está sendo usada.
Podemos escrever números BCD em hexadecimal? Sim, porque a representação hexadecimal é apenas uma
representação concisa de números binários. O número decimal 675 quando escrito como 675H representa o BCD
compactado, na forma hexadecimal. Não há necessidade de ficar confuso sobre isso, porque as etapas envolvidas são:
Passe alguns momentos pensando, para deixar claro. Um ponto importante a ter em mente é que quando
representamos BCD na forma hexadecimal, nenhum dígito jamais terá o valor de A a F, uma vez que o decimal
dig está limitado a 9. Portanto, nunca haverá um número BCD como 8F5H ou 56DH ou A34H.
Exemplo 0,8
Encontre a representação binária, hexadecimal e BCD compactada dos números decimais 126 e 245. Escreva também
o BCD compactado no formato hexadecimal.
Solução
126 245 0111 1110 7EH 0001 0010 0110 0010 126H
1111 0101 F5H 0100 0101 245H
Exemplo 0,9
Encontre o valor BCD compactado do número decimal 2347654 e represente o BCD em formato hexadecimal.
Solução
Para encontrar o BCD, cada dígito deve ser codificado em binário de 4 bits.
Portanto, 2347659 é
0010 0011 0100 0111 0110 0101 1001 ou seja, 2347659H é a representação hexadecimal do número BCD.
Machine Translated by Google
É muito importante ter isso em mente quando fazemos programas usando aritmética BCD.
Sempre que tiver dúvidas, volte a este capítulo.
ASCII é um código de sete bits, que é escrito como um byte. Ele tem representações para
^
números, alfabetos maiúsculos e minúsculos, caracteres especiais (como # . &) e caracteres, decontrole.
Por exemplo, existem códigos ASCII para 'nova linha', retorno de carro e barra de espaço. Vários
caracteres estão relacionados à impressão. Quando digitamos um caractere no teclado, é o valor ASCII
da chave que é lido. O computador deve convertê-lo dessa forma para a forma binária, para
processamento. A lista de códigos ASCII é mostrada na Tabela 0.3. Observe que o valor ASCII dos
números de 0 a 9 é de 30H a 39H. O ASCII de letras maiúsculas começa em 41H e o de letras minúsculas
começa em 61H. Esta tabela será necessária como referência rápida para vários cálculos que faremos
nos capítulos de programação.
i) O intervalo de números que podem ser representados por 4 bits é -8 a +7. Para um número de n bits,
esse intervalo é de (ÿ2nÿ1 ) a (+2nÿ1 ÿ1).
ii) Nesta notação, o bit mais significativo (MSB) é considerado o bit de sinal. O MSB para números
positivos é '0' e para números negativos é 1.
iii) Existe uma representação única para 0.
Como vamos lidar principalmente com bytes e palavras (16 bits), vamos ter uma ideia da representação de números
negativos de 8 bits.
Machine Translated by Google
20 OS MICROPROCESSADORES x86
SOH 1 DC1 11 ! 21 1 31
“
STX 2 DC2 12 22 2 32
ETC 3 DC3 13 # 23 3 33
EOT 4 DC4 14 $ 24 4 34
ENQ 5 QUERER 15 % 25 5 35
BEL 7 ETB 17 . 27 7 37
BS 8 POSSO 18 28 8 38
Aba 9 EM 19 () 29 9 39
*
LF UMA SUB 1A 2A : 3A
VT B ESC 1B + 2B ; 3B
FF C FS 1C , 2C < 3C
CR D GS 1D -
2D = 3D
ASSIM E RS 1E . 2E > 3E
E F NÓS 1F / 2º andar ? 3F
`
@ 40 P 50 60 P 70
UMA 41 Q 51 uma 61 q 71
B 42 R 52 b 62 r 72
C 43 S 53 c 63 s 73
D 44 T 54 d 64 t 74
E 45 DENTRO 55 e 65 dentro 75
F 46 DENTRO 56 f 66 dentro 76
G 47 Dentro 57 g 67 dentro 77
H 48 X 58 h 68 x 78
EU 49 S 59 eu 69 S 79
J 4A A PARTIR DE 5A j 6A Com 7A
K 4B [ 5B k 6B { 7B
eu 4C / 5C eu 6C 7C
M 4D ] 5D m 6D } 7D
N 4E ^ 5E n 6E ~ 7E
O 4F – 5F o 6F 7F
Machine Translated by Google
ÿ7 1001 9 +7 0111 7
ÿ5 1011 B +5 0101 5
ÿ4 1100 C +4 0100 4
ÿ3 1101 D +3 0011 3
ÿ2 1110 E +2 0010 2
ÿ1 1111 F +1 0001 1
ÿ0 0000 0 +0 0000 0
Exemplo 0,10
Encontre o número do complemento de dois correspondente a -6 quando 6 é representado em 8 bits como 0000 0110.
Solução
Assim -6 é FAH na forma de 8 bits, enquanto é AH na forma de 4 bits (da Tabela 0.4)
Nota H é a notação para 'hexadecimal'.
Um ponto muito importante que precisamos observar e ter em mente é que, quando um número de 4 bits é expandido para
um formato de 8 bits, seu bit de sinal deve ser estendido para os 8 bits. O bit de sinal na representação de 4 bits de -6 é '1'.
Ao expandir o número para preencher 8 bits, o 1 é replicado mais 4 vezes para preencher todo o byte. Assim ÿ6 que é AH
em formato de 4 bits, torna-se FAH em formato de byte, e será FFFAH em formato de 16 bits, e FFFF FFFAH em formato
de 32 bits. Precisamos entender isso para números negativos. Para números positivos, fazemos isso sem pensar muito.
Portanto, +6 é 0110, que se expande para 0000 0110 (byte) ou 06H, e 0006H no formato de 16 bits e 0000 0006 H no
formato de 32 bits. Observe que para números positivos, o bit de sinal é 0; efetivamente estamos fazendo extensão de sinal
aqui também. Este conceito de 'extensão sígnica' é importante e trataremos dele com mais detalhes posteriormente.
Conversão da Forma do Complemento de Dois Dada a representação em complemento de dois de um número decimal,
como encontramos o número decimal que ele representa? A resposta é – dois complementam novamente.
Pegue FA
1111 1010 ...o número
0000 0101 + 1 0000 ...inverter cada bit
0110 ...adicionar 1
...seu complemento de 2
Th é 6. Assim, FA é a representação em complemento de dois de ÿ6.
Machine Translated by Google
22 OS MICROPROCESSADORES x86
Exemplo 0,11
Encontre o número decimal cuja representação em complemento de dois é dada.
e) FFF2H
ii) F9H
Solução
e) FFF2H
Pergunta Olhando para o resultado de várias operações aritméticas em números binários, como sabemos
se é um número positivo ou negativo? Qual é a sua observação em relação aos números assinados?
Resposta Devemos saber quantos bits são usados para a representação de um número com sinal no
sistema. Então, se o MSB for '1', é um número negativo, se o MSB for '0', é um número positivo.
A adição binária é feita adicionando bits na coluna. Vamos considerar dados de tamanho de byte.
Caso 1
A adição dos mesmos números nos formatos binário, decimal e hexadecimal é mostrada. Como a soma
está dentro de um valor de 255, não há problema especial neste caso.
Caso 2
0111 1000 120 + 78H +
1001 1001 153 273 99H
10001 0001 111H
Machine Translated by Google
Nesse caso, a soma é maior que o número de bits alocados para o operando, e o bit extra, além dos 8 bits
da soma, é chamado de 'carry'. Sempre que aparece um carry, indica a insuficiência do espaço alocado
para o resultado. Nos microprocessadores, existe uma bandeira que indica esta condição.
Considere o caso de dois bytes BCD compactados que devem ser adicionados, digamos 45 e 22.
BCD embalado BCD embalado em formato hexadecimal Decimal
0100 0101 + 45H + 45 +
0010 0010 0110 22H 22
0111 67H 67
Nesse caso, o nibble superior e o nibble inferior estão dentro de 0 a 9. Portanto, a adição procede
exatamente como a adição decimal normal.
Caso 2
Considere o caso de dois bytes BCD compactados que devem ser adicionados, digamos 45 e 27. Na forma
BCD, a resposta correta deve ser 72. No entanto, isso não é obtido diretamente.
BCD embalado BCD embalado em formato hexadecimal Decimal
0100 0101 + 45H + 45 +
0010 0111 0110 27H 27
1100 6CH 72
Ao adicionar em forma binária, o nibble inferior da soma é maior que 9. Como nenhum dígito BCD pode ter
um valor maior que 9, uma correção precisa ser aplicada aqui. A correção para obter a soma de volta ao
formato BCD é adicionar 6 (0110) apenas ao nibble inferior.
Correção
0110 1100 +
0000 0110
0111 0010
Isso é quando o nibble superior da soma é maior que 9. A correção é adicionar 6 apenas ao nibble superior.
No entanto, observe que o tamanho dos dados excede 99, que é o número máximo de s que 8 bits podem
acomodar para um número BCD compactado. Assim, há um 'carry' gerado a partir da operação de adição.
No entanto, se o carry também estiver incluído na resposta, a soma de 138 está correta. No entanto, mais
de 8 bits são necessários para a soma.
Machine Translated by Google
24 OS MICROPROCESSADORES x86
Caso 4
Quando os nibbles superior e inferior da soma forem maiores que 9, adicione 6 a ambos os nibbles.
Adicione BCD 89 e 72.
1000 1001 + 89H +
0111 0010 1111 72H
1011 0110 0110 FBH adiciona 06 a ambos os petiscos
1 0110 0001 66H
1 61H
A resposta certa de 161 é obtida. No entanto, a soma precisa de mais de um espaço de byte.
Exemplo 0,12
Realize a adição dos seguintes números, após converter para as formas decimal e hexadecimal.
e) 39 e 99
ii) 117 e 156
Solução
Na segunda adição, os dados excederam o tamanho que pode ser acomodado em 8 bits. Assim, um carry
será gerado. Nos microprocessadores, existe uma bandeira que indica esta condição.
Exemplo 0,13
Adicione -43 e -56
Solução
Converta os dois números na forma de complemento de dois, pois ambos são números negativos.
ÿ43 + 1101 0101 +
ÿ56 ÿ99 1100 1000
1 1001 1101
Estamos adicionando dois números de 8 bits. Se a soma exceder 8 bits, um bit extra é gerado a partir da
adição. Ignore esse carry e observe os oito bits da soma. (Esta é a regra para a adição de complemento
de dois.)
Machine Translated by Google
É 1001 1101. O MSB é '1'. Então sabemos que é um número negativo. Para encontrar o número decimal
cuja representação em complemento de dois é essa, pegue o complemento de dois da soma. Este passa
a ser 0110 0011 ou seja, 99. Assim, verificamos a correção de nosso procedimento de adição.
Exemplo 0,14
Adicione +90 e -26.
Solução
Ignore o final ao redor do carry. A soma é 0100 0000. Como o MSB do número é '0', entendemos que a
soma é positiva. Então converta para decimal. O resultado é 64.
Exemplo 0,15
Adicione -120 e +45
Solução
Olhe para a soma – o MSB da soma é '1'. Portanto, é um número negativo. O complemento de dois é
0100 1011, ou seja, 75. Assim, o resultado do cálculo é -75.
Nota Em todos os cálculos acima, usamos dados de 8 bits. O resultado dos cálculos ficou na faixa de
-128 a +127. Assim, as respostas estão corretas. Se a soma for além disso (para dados de oito bits), as
respostas estarão erradas e o caos será criado se alguém não estiver ciente disso. Os computadores têm
'bandeiras' para nos informar sobre isso. Isso será discutido em seções posteriores.
0.7.4 | Subtração
Números não assinados
e) Números binários
ii) Números hexadecimais
iii) Números BCD
O procedimento aqui é semelhante à adição, ou seja, subtração bit a bit, coluna por coluna. Algumas
vezes, são necessários empréstimos das colunas à esquerda.
Machine Translated by Google
26 OS MICROPROCESSADORES x86
Exemplo 0,16
Subtraia 56 de 230. Faça essa subtração após converter os números em binário e hexadecimal.
Solução
Na subtração acima, estamos subtraindo um número menor de um número maior. No entanto, ao subtrair
coluna, às vezes há o problema de ter que subtrair um número maior de um número menor. Conhecemos a
ideia de 'emprestar' da coluna da esquerda. No entanto, para o empréstimo com o qual anexamos o número,
depende da base do sistema numérico. Para o sistema decimal, emprestamos 10, para binário 2 e para
hexadecimal, emprestamos 16.
Verifique esta subtração hexadecimal:
E6H -
38H
morto
Começando pela coluna mais à direita, vemos que não podemos subtrair 8 de 6. Portanto, é necessário tomar
emprestado de E. O empréstimo de E faz com que E se torne D e 6 se torne 6 + 16 = 22 (em decimal).
Subtraindo 8 de 22 dá 14 que é E em hexadecimal. É assim que obtemos E na coluna mais à direita do
resultado. Então, indo para a esquerda, subtraia 3 de D (13 em decimal). Th é 10 (em decimal) e A em
hexadecimal. É assim que o resultado da subtração é A.
Essa ideia foi explicada aqui em detalhes, para que possamos usar uma ideia semelhante na subtração BCD.
Vamos usar os mesmos números para a subtração BCD que usamos no Exemplo 0.16. ou seja, subtraia 56
de 230. A representação BCD é mostrada abaixo. Cada dígito decimal é compactado em bits binários de 4
bits.
Decimal BCD embalado
230 – 56 0010 0011 0000 –
174 0000 0101 0110
0001 0111 0100
O ponto a ser lembrado aqui é que cada grupo de 4 bits representa um 'número decimal', cuja base é dez.
Assim, quando tentamos subtrair um número maior de um número menor, temos que considerar os 'quatro bits
juntos' como um número decimal. Vamos rever os passos na subtração acima.
Primeiro passo
Assim, quando temos que subtrair 6 de 0 no grupo de quatro bits mais à direita, precisamos pedir emprestado.
Pegue emprestado do grupo à esquerda um decimal 10 e adicione-o ao '0000' à direita. Isso o torna '1010' (por
causa do empréstimo, o 0011 à esquerda agora é '0010'). Em seguida, subtraia 0110 disso.
O resultado é 0100 como visto (dentro do grupo, é feita a subtração binária).
0010 0010 1010 –
0110
0100
Machine Translated by Google
Segundo passo
Este é o segundo grupo. Para subtrair 0101 de 0010, o empréstimo do decimal 10 é retirado do grupo mais à
esquerda. Assim, 0010 é '1100', 12 em decimal. Subtraindo '0101' (5) dele, dá '0111' (7) como mostrado.
Terceiro passo
O grupo mais à esquerda agora é 0001. Subtraia 0000 dele. Assim, a resposta final é 174 na forma de BCD
compactado.
0001 1101 1010 –
0000 0101 0110
0001 0111 0100
Tudo isso mostra que a subtração de BCD também precisa de cuidados extras como adição de BCD. Nos
computadores, instruções especiais cuidam disso.
Exemplo 0,17
Expresse os números 53 e 18 em BCD compactado e subtraia o último do primeiro.
Solução
Primeiro passo
Segundo passo
0100 1101 –
0001 1000
0011 0101
28 OS MICROPROCESSADORES x86
discuta a subtração para números com sinal de 8 bits. Tenha em mente que o intervalo de números com
sinal utilizável com 8 bits é -128 a + 127.
Exemplo 0,18
Realize a subtração dos seguintes números com sinal:
e) +26 de +68
ii) +26 de -68
Solução
e) +26 de +68
Th é um cálculo na forma de 68 + (ÿ26). Para isso, a forma de complemento de dois de 26 deve ser
adicionada a 68.
Decimal Binário
68 é -26 0100 0100 +
é 1110 0110
1 0010 1010
Ignore o bit extra gerado. Como o MSB é '0', o resultado é positivo. O resultado é 0010 1010 ou seja, 42.
Ignore o bit extra gerado. Como o MSB do resultado de 8 bits 1010 0010 é '1', a diferença dos dois
números é negativa. Pegue o complemento de dois disso. 0101 1110 ou seja, 94. Portanto, o resultado
do cálculo é -94.
Exemplo 0,19
Encontre o resultado da seguinte subtração:
i) -56 de + 23
ii) -56 de -23
Solução
i) -56 de + 23
O cálculo a ser feito é +23 – (ÿ56), ou seja, 23 + 56. Isso acaba sendo a adição dos dois números positivos
23 e 56.
23 + 0001 0111 +
56 0011 1000
79 0100 1111 ou seja, 79
Ignore o bit extra gerado. O MSB do resultado de 8 bits 0010 0001 é '0'. Portanto, o número é positivo e é
33 em decimal, como deveria ser.
Ignore o bit de transporte extra e observe o resultado de 8 bits. O MSB do resultado é '0' indicando que é
um número positivo. No entanto, sabemos que a resposta é negativa. O que causou o erro?
Como a soma era muito grande (maior que -128) para caber nos 8 bits atribuídos a ela, houve um 'estouro
no bit de sinal' fazendo com que o bit de sinal fosse alterado. (Um problema semelhante ocorre quando
adicionamos dois números positivos e a soma é maior que + 127). Em computadores existe uma bandeira
que nos diz quando há um overflow no bit de sinal fazendo com que ele seja invertido. Esses assuntos
serão discutidos em detalhes quando fizermos a programação.
Os dados podem ter tamanhos diferentes dependendo do processador. O 8086 pode ter dados de 8
bits e 16 bits, enquanto o Pentium pode manipular 8, 16 e 32 bits internamente. Às vezes pode ser
necessário adicionar/subtrair dados de diferentes larguras. Nesses casos, o importante é equalizar o
tamanho dos dados envolvidos. Os processadores não permitem adição/subtração de dados de larguras
diferentes. Portanto, um byte terá que ser convertido em uma palavra de 16 bits, se tiver que ser adicionado
a um número de 16 bits. A maneira como isso é feito depende se os dados são assinados ou não. Para
dados sem sinal, o byte é anexado com zeros no byte superior e convertido em uma palavra de 16 bits.
Para dados assinados, o byte deve ser 'sinal estendido' para torná-lo uma palavra de 16 bits. Consulte a
Seção 0.8.6 mais uma vez para se convencer da necessidade disso.
Exemplo 0,20
Adicione os números não assinados 35H e 7890H.
Solução
30 OS MICROPROCESSADORES x86
Exemplo 0,21
Adicione os seguintes números assinados:
e) 45H e A87CH
ii) A8H e 1045H
iii) F5H e B45CH
Solução
i) Neste 45H deve ser feito um número de 16 bits. Verifique o MSB deste byte. É '0', o que significa
que é um número positivo. O bit de sinal quando estendido para 16 bits forma o número 0045H.
Então a adição é
0045H +
A87CH
A8C1H
ii) Neste o byte é A8H, que possui um MSB de '1'. Assim, a extensão do sinal torna FFA8H.
Agora a adição é
FFA8H +
1045H
1 0 FEDH
O bit extra gerado é ignorado, como fizemos na Seção 0.7.3 sobre cálculo de números com sinal.
Para ter certeza de que isso está correto, a verificação pode ser feita conforme abaixo.
A8H é -88
1045H é +4165
Ignorando o bit de transporte extra, a soma é B451H, um número negativo. Para verificar, encontre os
equivalentes decimais dos números que são ÿ11 e ÿ19364, que somados dão ÿ19375.
Nota Você também pode verificar que, sem estender o sinal negativo, obtém-se um resultado errado.
Todos os cálculos que fizemos podem ser verificados facilmente usando a calculadora científica
disponível no PC. Então, tente ser adepto do uso dessa calculadora.
são 100 locais em um dispositivo de memória, 100 bytes são armazenados. Todos nós já ouvimos falar de capacidade de
memória sendo mencionada em termos como bytes, kilobytes e megabytes. Agora vamos quantificar esses termos. Você
ouvirá esses termos ao longo do uso deste livro.
Um byte tem 8 bits. Uma palavra não é realmente definida. Depende do processador utilizado. Para o 8086, um
tamanho de palavra é de 16 bits. Um processador de 32 bits pode alegar ter um tamanho de palavra de 32 bits. A
capacidade de memória é sempre especificada em bytes.
28 = 256 bytes
210 = 1024 bytes = 1KiloByte ou 1KB
26 × 210 = 216 = 64 KB = 65.536 bytes
210 × 210 = 220 = um Mega Byte (1 MB) = 1024 × 1024 = 1.048.576 bytes
210 × 220 = 230 = um Giga Byte (1 GB) = 1024 × 1024 × 1024 = 1.073, 741, 824 bytes
210 × 230 = 240 = um Terra Byte (TB) = 1024 × 1024 × 1024 × 1024 = 1.099, 511, 627, 776 bytes
Existem também unidades mais altas, que ainda não são tão comuns em uso, mas as coisas vão mudar em breve, sem
dúvida. Algumas dessas unidades são:
32 OS MICROPROCESSADORES x86
BUS DE ENDEREÇO
N
T
VAI E
R
N
UMA BARRAMENTO DE DADOS
eu
BANDEIRAS
MORADA
B REGISTRO
DENTRO
S
INSTRUÇÃO
DECODIFICADOR
BARRAMENTO DE CONTROLE
TEMPO E CONTROLE
Além disso, em muitas instruções, é um registrador implícito. Existe um registrador flag que fornece informações sobre o
resultado de cálculos aritméticos e lógicos. Nesses casos, os 'bits flag' são alterados como parte da execução da instrução.
O modelo também mostra dois conjuntos de registradores – um é um conjunto de registradores de uso geral e o outro é um
conjunto de registradores de endereço (veja a Figura 0.10). Todos os processadores possuem registradores que são usados
como armazenamento temporário para operandos. 'Registros de uso geral' são usados para dados e são registradores de 8 bits.
Os registradores de endereço são usados para armazenar endereços de memória e como os endereços têm 16 bits de
comprimento, os registradores de endereço têm 16 bits de tamanho.
Os outros registradores de 8 bits são B, C, D, E, H e L. Existe a possibilidade de combiná-los em pares para torná-los
registradores de 16 bits. As combinações permitidas são BC, DE e HL onde, na forma de 16 bits, o primeiro registrador contém o
byte superior do número de 16 bits. Assim, na combinação BC, B mantém o byte superior e C o byte inferior. Algumas instruções
visualizam o
Machine Translated by Google
Um registrador e um registrador de bandeira juntos como um registrador de 16 bits chamado de palavra de status do processador (PSW).
Nesse caso, o registrador A é o byte mais significativo e o registrador flag é o byte menos significativo. Veja a Figura 0.11
Registo de Bandeiras Qual é a importância do registo de bandeiras? É um registrador de 8 bits que é uma combinação de fl ip fl ops de
1 bit são designados como 'flag bits'. Os sinalizadores de 8085 são todos sinalizadores de status ou condicionais, no sentido de que são
ativados/reiniciados como resultado do status ou condição do resultado de certas (não todas) instruções. As condições das bandeiras
são importantes porque é com base nisso que é realizada a ramificação condicional. Veja a Figura 0.12. Agora vamos entender cada bit
do registrador flag.
Z ou Zero flag Quando o resultado de um cálculo é zero, este flag é definido (Z = 1), caso contrário, ele
é redefinido.
H (8) eu (8)
D (8) E (8)
B (8) C (8)
PSW
(PALAVRA DE STATUS DO PROCESSADOR)
D7 D6 D5 D4 D3 D2 D1 D0
S A PARTIR DE XEX P X CY
Carregar
Paridade
Para. Carregar
Zero
Sinal
34 OS MICROPROCESSADORES x86
C ou Flag de Carry Se uma operação causa overflow de um bit do MSB, este flag é setado (C = 1), caso contrário é
resetado.
S ou Sign fl ag Se o MSB do resultado for '1', este fl ag é setado (S = 1), caso contrário é resetado.
Sinalizador P ou Paridade Quando o resultado tem paridade par, este é setado (P = 1), caso contrário, é resetado.
Sinalizador AC ou Carry Auxiliar Este sinalizador é definido (AC = 1) quando há um carry de D3 para D4 do resultado.
Este sinalizador é usado apenas para cálculos BCD e não há operação de 'ramificação' associada a este sinalizador.
Contador de Programa (PC) Este é um registrador de 16 bits e é usado para 'seqüenciar' as instruções que estão sendo
executadas. Para elaborar este ponto, pense no processo de execução de instruções. As instruções são armazenadas
na memória e quando a execução deve ser feita, elas são buscadas um byte por vez da memória para o processador. O
PC sempre aponta para a 'próxima instrução' a ser executada. Quando uma instrução de desvio aparece, é aparente que
a seqüência atual de busca de instruções é perturbada e uma nova seqüência será retomada. Nesse caso, o PC será
carregado com o endereço da 'filial'.
Stack Pointer (SP) O stack pointer (SP) é um registrador de 16 bits que aponta para um local de memória na RAM que
conterá valores temporários em uma área da RAM chamada pilha. A pilha é explicada em detalhes no Capítulo 3.
Um modo de endereçamento para uma instrução implica a forma como um operando é apresentado para execução
pela instrução. Existem instruções de operandos simples e operandos duplos para o 8085. No primeiro caso, o operando
estará em um registrador ou memória. No caso e oper duplo, os operandos terão que ser especificados para estarem em
algum endereço de memória ou registrador e em outro registrador. No entanto, não há modo em que ambos os operandos
estejam na memória – isso significa que se houver dois operandos, pelo menos um deles deve estar em um registrador.
O formato geral de uma instrução de dois operandos de qualquer processador Intel pode ser ilustrado por
a instrução 'mover' que é da forma,
Destino MOV, origem
Neste, o conteúdo da origem é copiado para o destino. A fonte permanece inalterada.
Discutiremos as ideias relacionadas aos modos de endereçamento usando as instruções 'MOV' e ADD.
Nota: As linhas de código não diferenciam maiúsculas de minúsculas.
1. Endereçamento de registro.
2. Endereçamento direto.
3. Endereçamento indireto.
4. Endereçamento imediato.
Registrar Endereçamento
Neste modo, apenas registradores estão envolvidos. Tanto a origem quanto o destino são registradores.
Endereçamento direto
Neste, um dos operandos é endereçado 'diretamente'. Este operando está na memória e seu endereço é mencionado
'diretamente' na instrução.
LDA 0987H ;carregar acumulador direto – o endereço é o número de 16 bits
0987H.
Endereçamento indireto
Aqui, um dos operandos é especificado 'indiretamente'. Ele está na memória, mas em vez de escrever seu endereço
diretamente na instrução, o endereço é carregado em um registrador de 16 bits e esse registrador é especificado na
instrução.
36 OS MICROPROCESSADORES x86
Endereçamento imediato
Aqui, os dados de origem são escritos na própria instrução
Discutiremos cada grupo com mais detalhes agora, usando um conjunto de amostra de cada grupo.
i) MOV Rd, Rs ii) MVI ;copia dados de Rs(origem) para o registrador de destino(Rd)
da porta OUT iv) Endereço da ;envia dados do acumulador para a porta de saída
porta IN v) LXI Rp, data16 vi) ;leva dados da porta de entrada para o acumulador
Endereço LDA ix) Endereço ;copia dados para registro, da memória especificada indiretamente
instruções para multiplicação e divisão. É importante lembrar que todas as bandeiras condicionais são
afetadas por instruções aritméticas.
i) ADD R ; adicione o conteúdo de R a A - soma em A
ii) dados ADI8; adicione os dados imediatos a A – soma em A
iii) ADC R ; adicione o conteúdo de R, A e o carry - soma em A
iv) ADD M ; adiciona o conteúdo da memória especificada indiretamente a A
v) SUB R ; subtrai de A os dados em R – resulta em A
vi) dados SUI8; subtrair de A os dados imediatos - resultar em A
vii) SBB R; subtrair de A, o conteúdo de R e transportar – resultar em A
viii) INR R ;incrementa o conteúdo do registrador R de 8 bits em 1
ix) DCR R ;decrementa o conteúdo do registrador R de 8 bits em 1
x) INR M ;incrementa pelo conteúdo da memória especificada indiretamente
xi) DCR M ;incrementa em 1 o conteúdo da memória especificada indiretamente
Agora vamos escrever alguns programas usando as instruções que acabamos de aprender.
Exemplo 0,22
Traga dados do local de memória 4567H, adicione 56H a ele e armazene a soma no local 0567H.
Solução
O acima é um programa muito simples no qual usamos apenas a instrução load, store e uma instrução add
imediata.
Exemplo 0,23
Escreva um programa para adicionar um dado imediato a um dado no endereço de memória 0987H. Armazene a
soma no próximo endereço na memória.
Solução
Neste, um dado imediato é carregado no registrador B. O outro operando que está na memória é endereçado
indiretamente. Para isso, o endereço da posição de memória é carregado no par de registradores HL, utilizando
endereçamento imediato. Em seguida, os dados são movidos para A, usando endereçamento indireto. Th é
adicionado a B e a soma está agora em A. Para armazenar a soma no próximo endereço, incremente o ponteiro
de endereço no par de registradores HL. Veja o programa abaixo.
MVI B,3CH LXI ;carrega os dados imediatos em B
H,0987H ;carrega endereço no par de registradores HL
Machine Translated by Google
38 OS MICROPROCESSADORES x86
Exemplo 0,24
Há um byte de dados no local 6756H, que deve ser substituído por um número menor que 5. Isso é feito abaixo.
Solução
Usando transferência de dados e instruções aritméticas, vários cálculos podem ser feitos.
No entanto, surge um problema se quisermos fazer operações repetitivas em grandes blocos de dados. O
problema é não ter 'condições de parada'. Digamos, queremos fazer a mesma operação em dados diferentes dez
vezes – para isso, precisamos de um contador que nos diga quando a contagem de 10 for atingida. Quando isso
acontece, a ação repetitiva pode ser interrompida. A capacidade de tomar decisões com base em condições é o
que dá poder a qualquer computador, e o 8085 não é exceção. Ele tem instruções para ramificação que estão
listadas abaixo. A ramificação altera efetivamente a natureza sequencial da execução da instrução, fazendo com
que o controle se mova para um novo conjunto de instruções escritas em um novo endereço. A ramificação pode
ser condicional ou incondicional – as condições utilizadas são as configurações das bandeiras, como veremos
agora.
iii) JNZ address16 ;salto em salto diferente de zero para o endereço fornecido se Z = 0
iv) JC address16 ;salto no carry-jump para o endereço fornecido se C = 1
Exemplo 0,25
Agora vamos escrever um programa para multiplicar 24 por 10. Como não há instrução de multiplicação
para 8085, a multiplicação é obtida por adição repetida. Fazemos isso adicionando 24 a si mesmo 10 vezes.
Solução
No Exemplo 0.25, B atua como um contador. Inicialmente A = 0. Então 24 é adicionado a ele e cada vez que isso
é feito, o contador B é decrementado em um. Ao final de 10 adições, o conteúdo de B será igual a 0. Quando a
operação de decremento faz com que o resultado seja zero, ou seja, B = 0, o sinalizador Zero é definido (Z = 1).
Esta é a condição de parada para o loop de adição. Terminada a adição, o resultado é salvo na memória. Então
o loop é encerrado e o conteúdo de A é copiado para um local na memória.
Observação Como A tem apenas um tamanho de dados de 8 bits, o número máximo que ele pode conter é
255. Isso deve ser lembrado.
Exemplo 0,26
Dois números são armazenados na memória. Verifique se a soma deles é maior que 255. Se sim, envie o
valor ASCII de Y para uma porta de saída com endereço 78H. Caso contrário, envie N.
Solução
Se a soma for maior que 255 (FFH), será gerado um carry que definirá o carry fl ag. Assim, a verificação consiste
em testar o carry fl ag. Consulte o fluxo do programa.
LXI H,0897H ;carrega HL com o primeiro endereço
MOV A,M ;carrega dados desse endereço para A
MOV B,A ;move esses dados de A para B
INX H ;incrementa o par de registradores do ponteiro HL
MOV A, M ;carrega os segundos dados da memória em A
ADICIONE A,B ;adicione o conteúdo de A e B-sum em A
JC SIM ;se C = 1, soma >255; pule para SIM
MOV A,'N' ;se C = 0, significa soma <255, então A = 'N'
JMP HIT ;pula incondicionalmente para XIT
SIM: MOV A,'Y' ;é quando soma>255.A = 'Y'
XIT: SAÍDA 78H ;envia A para a porta de saída com endereço 78H
No Exemplo 0.26, vários pontos precisam ser elaborados. Já estamos familiarizados com a obtenção de
dados da memória usando endereçamento indireto. Uma vez que os dois números de 8 bits são trazidos
para os registradores A e B, eles são adicionados. Se a soma >FFH, o carry fl ag é definido, o que é
testado pela instrução JC. Se a condição for verdadeira, o controle desvia para o rótulo 'SIM'. Aqui o valor
ASCII de Y é copiado para A. ASCII é representado por aspas simples do caractere. Quando escrevemos
'Y', na verdade o número correspondente ao ASCII de Y, ou seja, 59H é o que está sendo copiado. Se a
ramificação YES não for tomada, o registrador A deve ser carregado com o ASCII de N. De qualquer
forma, há um caractere ASCII em A. O último passo é enviar este número para uma porta de saída. Para
isso, o endereço da porta de saída é mencionado na instrução, mas o registrador A está implícito. A porta
de saída pode ser um dispositivo de exibição.
Machine Translated by Google
40 OS MICROPROCESSADORES x86
xii) dados CPI8 ;comparar o conteúdo de A e dados fornecidos - apenas as bandeiras afetadas
A maioria das instruções acima não precisa de muita explicação – mas a instrução 'compare' sim. O formato desta
instrução é
Destino CMP, origem
Esta instrução compara os dois operandos, faz com que os sinalizadores condicionais sejam afetados, mas nem o
destino nem a fonte mudam. A comparação é feita por uma operação de subtração, e as bandeiras são ajustadas/
reiniciadas de acordo com o resultado desta. No entanto, apenas duas bandeiras realmente importam – elas são a
bandeira Zero e a bandeira Carry. Considere a instrução CMP destino, origem.
A condição das bandeiras será conforme a Tabela 0.5. Assim, para testar a igualdade de dois dados, a bandeira
zero pode ser usada, e para comparar a magnitude dos números, a bandeira de transporte é testada.
Usamos a última condição no Exemplo 0.27.
Se C bandeira Z bandeira
destino = origem 0 1
Exemplo 0,27
Compare o número no local de memória 4566H com o conteúdo de B. Envie o número maior para a porta de saída
com endereço 67H.
Machine Translated by Google
Solução
Com isso, chegamos ao fim de nossa discussão sobre a programação 8085. Existem mais algumas
instruções, mas como apenas uma breve introdução ao 8085 é possível aqui, iremos direto para os aspectos de
hardware do 8085.
X1 1 40 VCC
X2 2 39 AGUARDE
REINICIAR 3 38 HLDA
SID 5 36 REINICIAR EM
ARMADILHA 6 35 PRONTO
RST7,5 7 34 I0/M
RST6,5 8 33 S1
RST5.5 9 32 RD
DENTRO 10 8085 31 WR
ENQUANTO 11 30 MAS
AD0 12 29 S0
AD1 13 28 A15
AD2 14 27 A14
AD3 15 26 A13
16 25 A12
AD4
17 24 A11
AD5
18 23 A10
AD6
19 22 A9
AD7
VSS 20 21 A8
42 OS MICROPROCESSADORES x86
8085 tem 16 linhas de endereço e 8 linhas de dados, mas se olharmos o diagrama de pinos não encontraremos 16 + 8 =
24 pinos dedicados para endereço e dados. A razão é que os pinos de endereço e dados são multiplexados. As linhas de
endereço inferiores também transportam dados. Veja os pinos intitulados AD0 a AD7 . São pinos multiplexados. Eles
atendem tanto ao endereço quanto aos dados, mas não ao mesmo tempo. O ciclo de barramento para acesso à memória
ou E/S é organizado de tal forma que primeiro o endereço aparece nos pinos de endereço/dados AD0 a AD7 (byte inferior
de endereço) e também de A8 a A15. Junto com este evento, um sinal chamado ALE (Address Latch Enable) será alto. Um
latch de 8 bits deve ser conectado (externamente) às linhas de endereço de ordem superior e o ALE deve atuar como um
relógio para o latch. Assim, quando o ALE fica alto, as informações de endereço de ordem superior aparecem na saída do
latch e permanecem lá. A Fig 0.14 deixa isso claro. Depois disso, as informações de endereço podem ser removidas dos
pinos AD0 a AD7 e, em seguida, funcionam como pinos de dados denominados D0 a D7 . Assim, usando a trava 74LS373,
a desmultiplexação de endereço foi alcançada. No entanto, por que a multiplexação foi feita, em primeiro lugar?
Nos primeiros dias do desenvolvimento do microprocessador, os problemas de empacotamento exigiam que a contagem
de pinos fosse a menor possível.
A15
A15
A14
A13
A12 Ordem superior
8085 A11
Barramento de endereços
A10 (A8–A15)
A9
A8
MAS
A8
G
A7
AD7 A6
74LS373 A5 Pequena ordem
A4 Barramento de endereços
A3
(A0–A7)
A2
A1
AD0
VOCÊ ESTÁ
A0
D7
D6
D5
D4 Barramento de dados
D3 (D0-D7)
D2
D1
D0
8085
EU ESTOU
MEMRD
RD
WR
MEMBRO
IORD
IOWR
44 OS MICROPROCESSADORES x86
A15 A15
A8
A8
MAS BUS DE ENDEREÇO
AD7 A7
Robusto A0
AD0
D7
BARRAMENTO DE DADOS
D0
8085
EU ESTOU MEMRD
RD
WR MEMBRO
AO CONTROLE
SINAIS
IORD
IOWR
Figura 0.16 | Hardware externo usado para obter endereços separados e barramento de dados e sinais de controle
Ready Th é um sinal enviado ao processador por um periférico. Normalmente os periféricos são mais lentos
que os processadores. O tempo de acesso a qualquer localização periférica ou de memória é especificado
em termos de um número de ciclos de clock. Para periféricos mais lentos, serão necessários mais ciclos de
clock. Quando for esse o caso, o processador olha para o pino READY que é controlado pelo periférico.
Enquanto o pino READY estiver baixo, o ciclo de acesso não termina e assim obtém-se mais tempo para
leitura ou escrita. Deve-se providenciar que o pino READY fique alto assim que o atraso necessário for obtido.
0.9.4.5 | Interromper
Uma característica importante de qualquer processador é a capacidade de ser interrompido. No entanto,
antes de discutir os pinos de interrupção, vamos tentar entender o que significa uma interrupção.
Digamos que um processador esteja executando uma tarefa específica, executando instruções
correspondentes a essa tarefa. Se outra tarefa mais importante for necessária, a tarefa atual terá que ser
interrompida temporariamente e a outra mais urgente deverá ser retomada. Uma vez que a tarefa urgente é
Machine Translated by Google
+5 V GND
1 2 40 20
Serial
E/S SID 5 X1 X2 VCC VSS
Portas SOD 28
4
A15
21
ENQUANTO
11 A8
ARMADILHA 6
Interromper
Sinais RST7,5 7
RST6,5 19
8
AD7
RST5.5 9 8085 Endereço multiplexado/
DENTRO 10 Barramento de dados
AD0 12
PRONTO 35
Redefinir e 30
REINICIAR EM 36 MAS
Preparar 29
REINICIAR
3 S0
Sinais
33
S1 Controle e
AGUARDE 39 34
DMA EU ESTOU
Sinais de status
38 32
Sinais HLDA
RD
31
WR
37
CLK
FORA
terminado e terminado, o antigo pode ser retomado. Este é o cenário das interrupções.
Isso significa que o processador terá que ser 'interrompido'. Quem dá o pedido de interrupção?
Pode ser um periférico solicitando atendimento urgente. Neste caso, o periférico coloca sua solicitação
de interrupção em um pino de hardware do 8085. Outro caso é quando o processador é interrompido por
software. Aqui, uma instrução é escrita para interromper a execução da tarefa atual.
Em ambos os casos, a sequência de eventos que segue a interrupção é a mesma. O processador
completa a instrução atual, salva o contador de programa e o status do processador e assume a nova
tarefa indo para um novo local na memória. Essa nova localização de memória é chamada de 'vetor de
interrupção' correspondente à interrupção específica. O que há no vetor de interrupção?
É neste endereço que a Rotina de Serviço de Interrupção (ISR) é armazenada. O ISR é o programa que
o dispositivo de interrupção deseja que seja executado. Assim, para cada dispositivo de interrupção,
deve haver um ISR em um 'vetor de interrupção'.
Machine Translated by Google
46 OS MICROPROCESSADORES x86
ARMADILHA 0024H
RST7,5 003CH
RST6,5 0034H
RST5. 5 002CH
Pinos de interrupção do 8085 Este processador possui cinco pinos de interrupção de hardware nos quais os periféricos podem
fazer suas solicitações de interrupção. O primeiro é o pino INTR (Interrupt). Um periférico deve colocar um alto neste pino por um
tempo mínimo especificado, o que faz com que o processador seja interrompido.
O processador responde baixando a linha INTA que é um sinal 'Interrupt Acknowledge'.
O periférico ao obter isso, informa ao processador onde está colocado o ISR para esta tarefa – dizemos que o periférico fornece o
'vetor de interrupção' para sua tarefa. O processador vai para este endereço, executa aquela tarefa e depois volta para a tarefa
que havia sido interrompida.
Este é o caso de uma interrupção no pino INTR. E os outros pinos de interrupção?
Eles são TRAP, RST 7.5, RST 6.5 e RST 5.5. A especialidade desses pinos é que eles são pinos de interrupção 'vetorados'. Isso
significa que quando um periférico faz sua solicitação em qualquer um desses pinos, o periférico não precisa fornecer o endereço
do ISR. Para cada uma dessas interrupções, há um endereço pré-definido específico para o qual o controle vai automaticamente
– o hardware do processador cuida disso. Os vetores de interrupção para esses pinos são os da Tabela 0.6. Há também outro
problema em relação às interrupções. Suponha que vários periféricos interrompam simultaneamente nos vários pinos de interrupção
do 8085, obviamente, apenas um dos pedidos pode ser atendido. Qual deles?
Há uma prioridade pré-definida para os pinos de interrupção – TRAP é o pino de maior prioridade seguido por RST 7.5, 6.5, 5.5
nesta ordem e por último, o pino INTR.
para forma paralela (internamente) e salva em um registrador. Da mesma forma, os dados paralelos podem ser
convertidos em formato serial e enviados como um bit de cada vez, usando o SOD. Claro, existem instruções
especiais para auxiliar no processo de transmissão serial.
Conclusão
todos os pinos do processador 8085, exceto os pinos de status S0 e S1 . pinos que carregam algumasDiscutimos
informações de status, o que não é muito importante para sistemas pequenos. Com isso, concluímos nossa
revisão do 8085, e passamos à tarefa de entender os microprocessadores x86, a partir do 8086. Isso será a partir
do Capítulo 1.
| O primeiro PC que causou grande impacto no mundo da computação foi o IBM PC com Intel
microprocessador 8088 sendo sua CPU. Este PC foi lançado em agosto de 1981.
| Gradualmente, a família x86 de microprocessadores tornou-se o padrão de fato para PCs em todo o mundo.
| Um sistema de computador consiste em uma CPU, memória e E/S que se comunicam entre si
através do barramento do sistema.
| Para ler e escrever de/para a memória, são necessários vários ciclos de clock. A Hora
gasto para isso é chamado de tempo de acesso à memória.
| Ao comparar a programação em linguagem assembly com a programação em linguagem de alto nível, concluímos que a
primeira é mais rápida na execução e mais eficiente e compacta, mas é mais difícil de aprender e dominar.
| RISC e CISC são duas filosofias diferentes em design de computadores e, embora ainda haja muita controvérsia em torno de
qual é o melhor, os dois parecem ter se fundido, mais ou menos.
| Computadores fazem todos os cálculos em binário, mas para inserir dados através do teclado e para
exibindo-o no monitor, os códigos ASCII são usados.
| Os números negativos são representados na forma de complemento de dois por todos os computadores.
| O microprocessador 8085 ainda é um chip muito popular, embora não seja usado em PCs.
| O 8085 é um dos processadores da Intel que possui o gerador de clock dentro do chip.
PERGUNTAS
2. Cite dois microprocessadores de 8 bits da Intel que não fazem parte da família x86.
7. Você já ouviu falar do termo 'contenção de ônibus'? O que significa no contexto de um computador
sistema?
Machine Translated by Google
48 OS MICROPROCESSADORES x86
8. Se a largura do barramento de dados de um processador for de 64 bits, o que você diria sobre sua complexidade e
capacidade?
13. Se um sistema usa um clock de 1,5 GHz, qual é o seu período de clock?
16. Quais são as dificuldades envolvidas em aprender e usar a programação em linguagem assembly?
17. Cite uma característica distintiva de cada um dos computadores RISC e CISC.
19. Quando dois números positivos com sinal são adicionados e a soma excede 127, qual é o problema
que surge?
20. Qual é o intervalo de números com sinal que podem ser representados em 12 bits?
EXERCÍCIO
3. Conheça o 'Apple Mac' – sua história, seus recursos e por que e como ele é considerado um
'ótimo' computador.
50 OS MICROPROCESSADORES x86
a arquitetura
1 de 8086
Começaremos nosso aprendizado da família de microprocessadores x86, entendendo a arquitetura do 8086, na qual se
baseia a arquitetura de toda a família. O 8086 é um processador que atende a dados de 16 bits (D0 a D15) e possui um
endereço de 20 bits (A0 a A19).
Vemos que o diagrama de blocos interno foi particionado em duas unidades lógicas, a saber, a Unidade de
Interface de Barramento (BIU) e a Unidade de Execução. Eles interagem diretamente entre si através do barramento
interno, mas atuam separadamente como duas unidades com funções bem definidas para cada unidade. Vamos
explorar a configuração interna dessas unidades, uma a uma.
52 OS MICROPROCESSADORES x86
EU
16-BIT ALU E
LÓGICA DE CONTROLE DE BUS
R
BANDEIRAS N
UMA
eu
DENTRO
INSTRUÇÃO DE 6 BYTES
S
FILA
CONTROLE E CRONOGRAMA
Por que Registros? Todos os processadores possuem registradores internos. Um registrador interno é na verdade uma RAM
no chip. Alguns são visíveis para o programa, enquanto outros não são diretamente visíveis para os programadores.
Quanto maior o número de registros visíveis do programa, melhor para o programador. Isso porque os registradores internos
são usados como armazenamento temporário de operandos, e se o operando já estiver em um registrador, leva menos tempo
para execução da instrução associada. Esses registradores são chamados de registradores de uso geral ou de rascunho.
No entanto, os registradores constituem RAM no chip, o que é caro. Além disso, quanto maior o número de registradores,
maior o número de bits necessários para identificar e endereçar um determinado registrador. Isso pode causar um aumento
no comprimento dos opcodes em modos envolvendo registradores. Assim, o número de registradores que um processador
pode ter é um trade-off entre vários fatores conflitantes.
Conjunto de registradores de 8086 Vamos ver como o conjunto de registradores de 8086 foi organizado. O 8086 possui
registradores de dados, registradores de endereço, registradores de segmento e também registrador de bandeira. Vamos
primeiro examinar os registros na Unidade de Execução.
54 OS MICROPROCESSADORES x86
MACHADO AH AL ACUMULADOR
BX BH BL BASE DE REGISTRO
CX CH CL CONTAGEM DE REGISTRO
DX DH DL REGISTRO DE DADOS
SP PONTEIRO DE PILHA
PA PONTEIRO DE BASE
E ÍNDICE DE FONTE
IP PONTEIRO DE INSTRUÇÕES
e registradores exclusivos de 8 bits também, isto é, AX tem duas partes AH e AL, onde H e L representam as partes alta e baixa
respectivamente. Quando usados como registradores de 8 bits, AH e AL são separados, mas podem ser concatenados para formar o
registrador AX de 16 bits. Semelhante é o caso dos registradores BX, CX e DX. Cada registrador, embora de uso geral, também
possui usos especializados. Como tal, vamos entender esses recursos claramente.
AX Th é um registrador de dados de 16 bits, mas também pode ser usado como dois registradores de 8 bits não relacionados AH e
AL. AL /AX às vezes é chamado de acumulador, mas a relevância do acumulador é menor para 8086 em comparação com o 8085
anterior, no qual um operando está implícito no registrador A para muitas instruções. No entanto, para o 8086, apenas para certas
instruções especializadas o registrador AL ou AX está implícito para conter um dos operandos. Na maioria das outras instruções, a
origem e o destino devem ser especificamente mencionados na instrução. (O destino é o registrador ou local de memória no qual o
resultado de qualquer operação deve ser colocado.)
BX, CX e DX Esses são os outros registros de trabalho do 8086, o que significa que com esses registros podem ser feitos
armazenamento temporário de dados, cálculos aritméticos e manipulação de dados.
Eles também podem ser usados como registradores de 8 ou 16 bits, conforme mencionado anteriormente. Ainda assim, cada um
deles tem funções especiais.
Machine Translated by Google
A ARQUITETURA DE 8086 55
O registrador base BX é frequentemente usado como um registrador de endereço em muitos modos de endereçamento baseados.
O registrador de contagem CX é usado como contador em muitas instruções. O registrador de dados DX é usado em instruções de
E/S como um ponteiro para dados armazenando o endereço da porta de E/S. Além disso, as operações de multiplicação e divisão
envolvendo números grandes assumem DX e AX como um par.
Registradores de ponteiro e índice SP, BP, SI e DI são registradores de endereço e podem ser usados apenas como registradores de
16 bits. Eles são muito importantes na programação, pois facilitam o uso de vários modos de endereçamento.
BP e SP Eles são o ponteiro Base e o ponteiro Stack respectivamente. SP sempre aponta para o topo da pilha, enquanto BP pode
apontar para qualquer local na pilha. (Discutiremos o conceito de pilha em breve.) Assim, normalmente, sempre que falamos de dados
referidos por BP e SP, fica implícito que estamos falando de dados na pilha.
SI e DI Estes são registros de índice, rotulados como Índice de Origem e Índice de Destino, respectivamente.
Eles funcionam como registradores de endereço em vários modos de endereçamento, mas têm uma função especializada como sendo
os registradores padrão em instruções de string.
É um registrador de 16 bits, dos quais 7 bits não são utilizados. Dos bits restantes, 6 bits são usados como sinalizadores condicionais.
As outras são bandeiras de controle. Um sinalizador condicional é um fl ip fl op de bit único que é definido ou redefinido de acordo com
o resultado de uma operação aritmética ou lógica.
As bandeiras condicionais disponíveis são Carry (CF), Zero (ZF), Paridade (PF), Overflow (OF) e Sign Flag (SF). Como os
sinalizadores condicionais são um ingrediente importante na computação usando linguagem assembly, não adiaremos nossa discussão
sobre eles.
Carry fl ag (CF) O carry fl ag (CF) é definido se houver um carry do bit mais significativo durante um cálculo. Por exemplo, quando a
adição de 8 bits faz com que o resultado seja maior que 8 bits, ocorre um carry do MSB (D7), que faz com que este sinalizador seja
definido. Para operações de 16 bits, o transporte será do bit D15 e CF será definido.
Sinalizador Zero (ZF) Quando o resultado de uma operação aritmética ou lógica é zero, o sinalizador zero é definido.
Por exemplo, se continuarmos decrementando o conteúdo de um registrador (digamos, o registrador CX, que
U = não utilizado
PF = Sinalizador de Paridade
CF = Carregar Bandeira
56 OS MICROPROCESSADORES x86
é usado como uma contagem), ele finalmente se tornará zero. Neste instante, a bandeira zero fica definida, ou seja, ZF = 1.
Outro caso é quando dois números são comparados. A comparação é feita por subtração. Se os números
comparados forem iguais, o sinalizador zero é definido (ZF = 1) indicando igualdade dos operandos.
Flag de Paridade (PF) A configuração deste flag indica a presença de um número par de bits no byte menos
significativo (8 bits inferiores) do destino. Por exemplo, após uma operação aritmética ou lógica específica, se
o destino contiver o número 11100111, o sinalizador de paridade será definido para indicar paridade par.
Mesmo que a operação seja em dados de 16 bits, apenas a paridade dos 8 bits inferiores é verificada. Esta
bandeira não encontra muitas aplicações nas práticas de programação atuais.
Sinalizador (SF) Após uma operação aritmética ou lógica, se o resultado contiver um número negativo, o sinal
sinalizador é definido. Em essência, ele contém o MSB do resultado, que pode ser interpretado como o bit de
sinal em operações aritméticas com sinal.
Sinalizador de Carry Auxiliar (AF) Este sinalizador funciona semelhante ao Carry fl ag, exceto que o overflow
é do bit D3 para D4. Assim, indica uma execução dos 4 bits inferiores. A necessidade deste sinalizador é para
a instrução Decimal Adjust, que é importante nos cálculos do número BCD. Não há outras instruções que
testem diretamente o estado desse sinalizador e nenhuma ramificação condicional está associada a esse
sinalizador.
Nota: Para entender o uso das bandeiras usaremos algumas instruções simples, com explicação adequada.
Mas o conjunto de instruções será tratado em detalhes, somente a partir do Capítulo 2.
Exemplo 1.1
Encontre o status das bandeiras CF, SF, AF após a execução das seguintes instruções.
MOV AL, 35H
ADICIONAR AL, 0CEH
Solução
A ARQUITETURA DE 8086 57
Exemplo 1.2
Mostre o efeito das seguintes instruções nos bits CF, ZF e OF do registrador flag.
MOV BX, 45ECH
ADICIONAR BX, 7723H
Solução
Exemplo 1.3
Supondo que estamos adicionando números de 8 bits com sinal, como o resultado da seguinte adição deve ser
interpretado?
MOV AL, 125
ADICIONAR AL, 75
Solução
Houve um transbordamento de D6 para D7 (ou seja, para o MSB). Neste caso encontramos OF = 1. A soma é
interpretada como um número negativo com valor do bit de sinal = 1.
A configuração do sinalizador OF indica que a magnitude do resultado causou uma inversão do bit de sinal,
indicando um erro. Essa interpretação é feita, pois a faixa máxima de
números positivos com sinal é apenas +127 para representação de 8 bits.
Aliás, o Sinalizador também está definido (SF = 1).
Sinalizadores de controle Além dos sinalizadores condicionais, existem três sinalizadores de controle, a saber, o
sinalizador Trap, o sinalizador de direção e o sinalizador de interrupção. As bandeiras de controle devem ser definidas
ou redefinidas deliberadamente de acordo com os requisitos do programa. O sinalizador Trap (TF) é configurado para
executar passo a passo, durante a depuração. O sinalizador de interrupção (IF) é definido para habilitar interrupções. A direção
Machine Translated by Google
58 OS MICROPROCESSADORES x86
fl ag (DF) é usado em operações de string. Os detalhes do funcionamento dessas bandeiras serão discutidos em capítulos
posteriores.
Unidade Lógica Aritmética É a parte de um computador que realiza todos os cálculos aritméticos e lógicos. A ALU é a
unidade mais importante do processador. As instruções que são buscadas e decodificadas são executadas na ALU. Assim,
a ULA tem acesso direto aos registradores e sinalizadores de uso geral.
Esta unidade é responsável pelos cálculos de endereço, pré-buscando instruções para a fila e sequenciando instruções
uma a uma. Vamos examinar cada função.
A ARQUITETURA DE 8086 59
segmento. Um endereço base é o endereço inicial de um segmento. No entanto, como os registradores de segmento
não podem armazenar 20 bits (do endereço base), eles armazenam apenas os 16 bits superiores. O nibble menos
significativo está implícito em zero.
Como é obtido um endereço físico de 20 bits se existem apenas registradores de 16 bits? O endereço de 20
bits de um byte é chamado de endereço físico. No entanto, é especificado como um endereço lógico que está na
forma de dois números de 16 bits no formato endereço base: off set. Veja a Fig 1.4, para um exemplo típico.
Consideramos que um byte de dados é armazenado em um segmento de dados, cujo endereço base é 22220H.
Então o registrador de segmento de dados (DS) conterá o número 2222H. Os dados em qualquer local dentro deste
segmento são referenciados por um deslocamento (deslocamento) em relação ao endereço base.
Assim, se um dado em um local tem um endereço lógico especificado como 2222H : 0016H, o número 0016H é o
deslocamento ou deslocamento em relação ao endereço base. Para cálculo de endereço físico,
–
Endereço físico –
= 22220H +
–
0016H
DESLOCAMENTO = 0016H
22236H BYTE-2
BYTE-1
Figura 1.4 | Cálculo de um endereço físico a partir do endereço lógico para um segmento de dados
ENDEREÇO BASE
SS
A0000H
ISSO É
90000H
REGISTROS DE SEGMENTO
A000H SS
DS
70000H 9000H ISSO É
7000H DS
5000H CS
CS
50000H
60 OS MICROPROCESSADORES x86
a BIU anexa o conteúdo do registrador de segmento com quatro zeros binários (ou um zero hexadecimal) à
direita. O endereço físico é assim calculado como
22220H
+0016H
22236H
Semelhante é o caso para os outros segmentos. Todos os off-sets estão limitados a 16 bits, o que significa
que o tamanho máximo possível para um segmento é de apenas 216 , que é 65.536 bytes ou 64K bytes. ,
ES, SS ou CS) que é combinado com um off set (geralmente fornecido na instrução) para determinar o
endereço físico que está sendo acessado. Um byte de dados tem o endereço lógico da forma DS: off set.
Endereço do
Byte
topo da pilha 44782H
0122H SP
Byte
Byte
A ARQUITETURA DE 8086 61
Registro SS. Um endereço de pilha no formato 4466H : 0122H significa que o registrador SS contém 4466H, o ponteiro de
pilha (SP) contém o número 0122H e o endereço físico do topo da pilha é 44660H + 0122H = 44782H.
A pilha é usada principalmente para manter endereços e dados de lado temporariamente, quando um subprograma é
chamado. Isso será retomado quando o subprograma terminar. O 8086 tem uma pilha que cresce para baixo (ou seja, para
endereços de memória mais baixos). Isso significa que cada instrução push faz com que o SP seja decrementado (em dois
para 8086), e os dados são empurrados mais para baixo no segmento da pilha. Discutiremos a operação da pilha com mais
detalhes no Capítulo 4.
Embora uma pilha geralmente seja acessada apenas de cima, o 8086 possui outro registrador
chamado BP (ponteiro base), que é usado para referenciar dados em qualquer lugar dentro da pilha.
Assim, o formato SS : BP também é um endereço lógico. Isso tem certas aplicações interessantes.
segmentos armazenam dados, mas em certos casos especiais (instruções de string), pode ser necessário listá-los
separadamente. Há um registrador de segmento extra (ES) para armazenar os 16 bits superiores do endereço base do
segmento extra. O deslocamento dentro do segmento de dados também é denominado como um 'endereço efetivo'. O
cálculo de endereço efetivo depende do modo de endereçamento. Discutiremos isso muito em breve. A Tabela 1.1 mostra os
registradores de segmento e os registradores correspondentes que podem ser usados para off-sets.
Exemplo 1.4
O conteúdo de DS é 345BH. A quantidade de dados que deve ser armazenada no segmento de dados é de 12K bytes. Onde
na memória, este segmento estará localizado?
Solução
Este número corresponde aos 4 dígitos hexadecimais superiores do início (endereço base) do segmento de dados.
1K = 1024 bytes.
12K = 12 × 1024 = 12288 = 3000H.
62 OS MICROPROCESSADORES x86
Exemplo 1.5
O conteúdo dos seguintes registradores de segmento é dado.
CS = 1111H, DS = 3333H, SS = 2526H.
IP = 1232H, SP = 1100H, off-set no segmento de dados = 0020H.
Calcule os endereços físicos correspondentes para o byte endereçado em a) CS b) SS ec) DS.
Solução
a) O endereço base do segmento de código é 11110H. O endereço da próxima instrução a ser executada é referenciado
por CS e IP que é dado por 11110H + 1232H = 12342H.
b) O topo atual da pilha é referenciado por SS e SP. O endereço base do segmento da pilha é 25260H. O endereço
físico correspondente é 25260H + 1100H = 26350H.
c) Os dados que precisam ser acessados são fornecidos pelo DS e pelo offset. O endereço base do segmento de dados
é 33330H. O endereço físico desses dados é calculado como 33330H +
0020H = 33350H.
2. Os segmentos podem se sobrepor com um novo segmento começando a cada 16 bytes. Isso também significa que
pode haver mais de um endereço lógico para o mesmo local de memória (endereço físico). Por exemplo, 0000 :
0100, 0001 : 00F0 e 0010 : 0000 todos se referem ao endereço físico 00100H.
3. Podemos ter muitos segmentos com o mesmo endereço de base, mas os desvios dentro do segmento terão que ser
cuidados para evitar a substituição de dados. Por exemplo, em operações de string, podemos usar o mesmo
segmento que os dados e segmentos extras. Isto é conseguido carregando o mesmo número nos registradores ES
e DS.
5. Um programa não precisa ter todos os quatro segmentos, mas terá pelo menos o segmento de código.
6. Os endereços usados nas instruções são chamados de endereços lógicos e são traduzidos pela BIU para endereços
físicos.
que todos os registradores de endereços tenham o mesmo tamanho dos registradores de dados (16 bits), permitindo o
uso de endereços físicos de 20 bits.
2. Todos os endereços na memória são relocalizáveis. Isso significa que qualquer programa ou dado pode ser carregado
em qualquer endereço na memória. Um programa realocável é aquele que pode ser colocado em qualquer área da
memória e executado sem alterações. Os dados também são realocáveis. Alterar o endereço base do segmento
correspondente é a única ação que precisamos realizar para realocar.
Todos os endereços dentro do programa são relativos ao endereço base, pois estão na forma Endereço base: off
set. Todos os processadores da família x86 possuem esse tipo de segmentação. Os processadores de ordem
superior também possuem proteção adicionada a essa estrutura.
Organização da Memória
Vimos que os dados são armazenados na memória como bytes. Cada localização de byte tem um endereço. Se uma
palavra (dois bytes) deve ser armazenada, são necessárias duas localizações de endereços consecutivos. Considere que o
Machine Translated by Google
A ARQUITETURA DE 8086 63
MORADA DADOS
60088H E6H
60089H 34H
número 34E6H deve ser armazenado. Então 34H é armazenado em um local e E6H está no próximo local.
Os processadores da Intel usam o que é chamado de formato little endian, o que significa que o byte
inferior é armazenado no endereço inferior e o byte superior no endereço superior. Assim, se a palavra
acima tiver um endereço de 60088H, o armazenamento é como mostrado na Figura 1.7. Isso contrasta com
alguns outros processadores (como Motorola) que usam o formato big endian. (Supõe-se que a origem da
palavra 'endian' seja das viagens de Gulliver, referindo-se a uma controvérsia sobre se um ovo deveria ser
quebrado na ponta pequena ou na ponta grande.)
Como os dados neste caso são uma palavra, dois locais de memória com dois endereços devem ser
usados para acessá-los. A conexão de hardware entre o processador e a memória é projetada de forma
que ambas as localizações sejam acessadas e um acesso por palavra (16 bits) seja obtido, mesmo que
apenas um endereço lógico seja mencionado na instrução.
i) os operandos podem estar em registradores, na memória ou na própria instrução. Porém o 8086 não
possui um modo de endereçamento em que ambos os operandos estejam em posições de memória,
ii) no caso de dois operandos, um deles pode estar na memória, mas o outro terá que ser colocado em um
registrador,
iii) os tipos de dados devem corresponder – ou seja, a origem e o destino devem ser bytes ou
palavras.
1) Endereçamento de Registro
Aqui tanto a origem quanto o destino são registradores. Nenhum acesso à memória está envolvido. Consulte
as seguintes instruções.
MOV AL, AH ;copia o conteúdo de AH para AL
MOV CH, BL ;copia o conteúdo de BL para CH
Machine Translated by Google
64 OS MICROPROCESSADORES x86
Observe que as duas primeiras são operações de byte , enquanto as outras duas são operações de palavra.
2) Endereçamento Imediato
Neste modo, a fonte será uma constante de dados
3) Endereçamento Direto
Aqui, a origem ou o destino será um endereço de memória.
MOV AX, [2345H] ;move a palavra da posição 2345H para o AX
MOV [1089H], AL ;o byte em AL é movido para o local 1086H
Deve ser lembrado que os endereços nas instruções estão fora dos conjuntos dentro do segmento de dados (ou seja,
o endereço lógico). Precisamos conhecer o conteúdo do DS para calcular o endereço físico.
O tamanho dos registradores indica o tamanho do operando. Assim, na primeira instrução, uma palavra de dados é
referida; enquanto no segundo, um byte de dados é movido. Os colchetes são necessários para indicar que o número
é um endereço e não um dado. No entanto, podemos usar etiquetas para endereços e reescrever as duas instruções
acima.
CUSTO MOVIMENTO, AL
Devemos, então, garantir que os referidos endereços tenham sido definidos anteriormente com esses rótulos. Veremos
A ARQUITETURA DE 8086 65
Exemplo 1.6
Mostrar a localização dos dados na memória, após a execução de cada uma dessas instruções, se o
conteúdo dos registradores for o indicado
DS = 1112H, AX = EE78H e BX = 3400H i) MOV
[0422H], AL ii) MOV [0424H], AX
Solução
11542H 78H
ii) Este é também um caso de endereçamento direto. O endereço físico é calculado como
11120H +
04224H
11544H
No entanto, como o AX contém dois bytes de dados, o byte inferior (AL) é armazenado no endereço
11544H e o byte mais alto (AH) no próximo endereço (lembre-se do conceito 'little endian')
11544H 78H
11545H EEH
iii) Este é um caso de endereçamento indireto de registro. BX é um ponteiro para o endereço 3400H, que é
um off set. O endereço físico correspondente é
11120H +
3400H
14520H
Machine Translated by Google
66 OS MICROPROCESSADORES x86
O conteúdo do AX é movido para este endereço. Portanto, a memória correspondente será como mostrado
14520H 78H
14521H EEH
Assim, o endereço efetivo é [BX + 10 ]. Uma vez que o endereço efetivo é calculado, o endereço físico é
calculado como a soma do endereço base do segmento e o endereço efetivo. O deslocamento pode ser um
número assinado/não assinado de 16 bits ou um número estendido de sinal de 8 bits . No entanto, o
deslocamento não deve ser tão grande a ponto de fazer com que o endereço efetivo ultrapasse o intervalo
do tamanho máximo de um segmento. A instrução acima também pode ser escrita como MOV CL, [BX + 10]
No último caso, PREÇO deve ser definido anteriormente como um deslocamento de 10.
Neste modo, um registrador de índice e um registrador de base juntos carregam o endereço efetivo. O
conteúdo desses dois registradores é adicionado e chamado de endereço efetivo.
MOV AL, [BX][SI] ;move o conteúdo do endereço efetivo apontado por [BX] e [SI] para AL
A ARQUITETURA DE 8086 67
Exemplo 1.7
Encontre o endereço da memória física para as instruções a seguir se o conteúdo dos registradores
necessários forem os indicados abaixo SS = 2344H, DS = 4022H, BX = 0200H, BP = 1402H, SI = 4442H
Solução
Este é um caso de endereçamento relativo a registradores. O endereço efetivo é obtido a partir da instrução,
para ser a soma do deslocamento e endereço efetivo SI = 1234H +
4442H
5676H
Substituição de segmento
A Tabela 1.2 mostra os segmentos padrão a serem usados nos vários modos de endereçamento baseados em memória.
No entanto, isso pode ser substituído por um prefixo de substituição de segmento. Podemos usar segmentos
diferentes daqueles especificados na tabela. O formato deste prefixo de substituição é mostrado abaixo.
MOV AL, ES : [BX] substitui o fato de que uma instrução desse tipo implica que o segmento de dados deve
ser usado. Aqui, diz que ES deve ser usado em seu lugar. Portanto, os cálculos de endereço físico usam o
conteúdo do registrador CS como endereço base. Outros exemplos são
MOV DS : [BP + 7], BL ;DS a ser usado em vez de SS
MOV AX, CS : [BX ] ;CS a ser usado em vez de DS
Machine Translated by Google
68 OS MICROPROCESSADORES x86
Tabela 1.2 | Endereço Eficaz e Segmentos Referidos para Vários Modos de Endereçamento Baseados em Memória
1 Direto Deslocamento DS
[E] DS
[A PARTIR DE]
DS
Exibição + [SIM] DS
Exibição + [DI] DS
Exibição + [BP] SS
[BX] + [DI] DS
[PA] + [SIM] SS
[BP] + [DI] SS
Observe que o BP não pode ser usado sem deslocamento. Veja-o sendo usado no modo 'registrar relativo', mas não no modo
indireto de registro.
| A largura do barramento de dados de 8086 é 16 e os registradores internos também têm o mesmo tamanho de bit.
| O diagrama de blocos interno mostra duas unidades denominadas 'unidade de execução' e 'unidade de interface de barramento' com
funções bem definidas e separadas.
| A BIU e a UE se comunicam através do barramento interno. Ambos têm um tempo comum e contra
unidade de trole.
| Os sinalizadores condicionais são definidos ou redefinidos de acordo com o resultado de certas operações aritméticas/lógicas
ações.
| O 8086 tem 20 linhas de endereço, o que significa que pode acessar 1 MByte de memória.
| Os 16 bits superiores do endereço base de qualquer segmento estão disponíveis no segmento correspondente
registros.
| O segmento de pilha é um tipo de segmento que cresce para baixo à medida que os dados são inseridos nele.
A ARQUITETURA DE 8086 69
PERGUNTAS
3. Quais são os primeiros e últimos endereços de memória que um 8086 pode endereçar?
5. Como será útil para um processador se ele tiver um grande número de registradores internos?
15. O que acontece com a fila de pré-busca quando uma instrução de desvio é encontrada?
17. Se o endereço físico de um byte for 12345H, sugira três endereços lógicos que ele possa ter.
20. Escreva uma instrução de exemplo que contenha um prefixo de substituição de segmento.
EXERCÍCIO
1. Encontre o conteúdo do destino e o status do carry fl ag (CF) e zero fl ag (ZF) após a execução do seguinte conjunto de
instruções.
70 OS MICROPROCESSADORES x86
3. Mostre o número binário que estará disponível em AL após a execução de cada um dos seguintes
instruções.
a) MOV AL, 'C' b)
MOV AL, 25 c)
MOV AL, 34H
6. Se CS contém o número 0FC2H, e o volume de código é 2400 bytes, qual é o último endereço neste segmento de código?
8. Encontre o endereço físico dos locais de memória mencionados nas instruções a seguir
se DS = 0223H, DI = 0CCCH, SI = 1234H. a)
MOV [DI], AL
b) MOV [SI][56H], BL
10. Os endereços de memória a partir do endereço lógico 0124H : 0056H armazenam os números 0978H, CE45H, 45H e 7809H
em locais consecutivos. Desenhe um diagrama mostrando o endereço físico e os dados correspondentes armazenados.
Machine Translated by Google
programação
2 conceitos-eu
72 OS MICROPROCESSADORES x86
tradutor. No entanto, um montador é mais do que apenas um tradutor. É uma importante ferramenta de
desenvolvimento de programas, cuja qualidade pode afetar a facilidade de programação. Como a programação
em linguagem assembly é mais propensa a erros (do que HLLs); o montador deve fornecer mensagens de erro
apropriadas para orientar o programador em cada passo durante a programação.
Assemblers que suportam macros são chamados de Macro Assemblers. Uma macro é um nome dado a
uma sequência de linhas de instrução. Uma vez que uma macro é definida, seu nome pode ser usado no lugar
deste conjunto de linhas. No processo de montagem, cada macro é substituída pelas linhas de texto. Assim, uma
macro parece ao programador ser como um mnemônico, e ele pode usá-la com a frequência que quiser, sem
incorrer em nenhuma das sobrecargas que um procedimento ou função pode causar. O uso de macros pode
ajudar a estruturar os programas.
Neste exemplo, BEGIN é um rótulo, que corresponde ao endereço no qual esta linha de código está armazenada.
MOV é um mnemônico. Esta instrução significa que o conteúdo de COST deve ser movido para o registrador AX.
COST é um rótulo (para um local de memória) que atua como um operando nesta instrução de dois operandos.
Um rótulo quando definido é chamado de símbolo. Um símbolo só pode ser definido uma vez, mas pode ser
usado muitas vezes. Haverá um endereço de memória correspondente a todos os símbolos. Nesta instrução, o
outro operando é AX. O texto que vem depois de ';' é um
Comente.
Todos os montadores atuais permitem o uso de rótulos, em vez de endereços numéricos de locais de
memória. No entanto, finalmente, o montador deve traduzir esses rótulos para endereços de memória. Como tal,
uma questão importante que um montador terá que resolver é o que é chamado de 'problema de referência direta'.
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 73
NOVAMENTE: ---------------
À medida que o montador lê a segunda linha deste programa, um rótulo indefinido NOVAMENTE é
encontrado. O montador ainda não tem conhecimento disso, mas o valor do símbolo NOVAMENTE é
necessário antes que possa ser definido. Isso também é chamado de problema de símbolos futuros ou
problema de referências não resolvidas. Este problema é resolvido de várias maneiras, dependendo do tipo
de montador.
Existem muitos tipos de montadores – um passo, dois passos e montadores multipasso. Cada passagem
otimiza o processo de montagem. Dois montadores de passagem são os mais comuns, então vamos discuti-los.
Uma passagem implica 'uma leitura' do código do início ao fim. Um montador de duas passagens faz duas
passagens sobre o arquivo de origem (a segunda passagem será sobre um arquivo gerado na primeira passagem).
Na primeira passagem, procura as definições dos rótulos e as insere na tabela de símbolos após atribuir-lhes
endereços. Os montadores modernos mantêm mais informações em sua tabela de símbolos, o que permite que
eles resolvam endereços em uma única passagem. Endereços conhecidos (referências anteriores) são resolvidos
imediatamente. Endereços desconhecidos (referências de encaminhamento) são “preenchidos de volta”, uma vez resolvidos.
A memória é alocada sequencialmente e um 'contador de localização' é incrementado a cada etapa. Ao
final desta passagem, a tabela de símbolos deverá conter as defi nições de todos os rótulos utilizados no
programa. Isso significa que durante a primeira passagem, o único dever do montador é atribuir endereços de
memória aos rótulos.
Na passagem 2, é feita a tradução real do código assembly para o código de máquina. Os erros também
são relatados depois disso. O processo de montagem produz um arquivo de objeto 'relocalizável'. Este arquivo
objeto pode ser carregado em qualquer lugar da memória, quando o programa for executado. Um 'loader' é
um programa que faz isso. Observe que o carregamento pode ser feito em qualquer lugar da memória e que
não é necessário carregá-lo no mesmo local toda vez que a execução do programa for concluída.
74 OS MICROPROCESSADORES x86
Dois montadores populares são TASM e MASM. TASM é o Turbo Assembler da Borland, enquanto o MASM é o
Macro Assembler da Microsoft. Verifica-se que o código escrito no TASM é executado no MASM, embora o inverso
não precise ser verdadeiro. Ambos são executados em DOS e Windows, o que significa que podem usar codificação
de 16 bits e 32 bits. Ambos são classificados como montadores de alto nível, o que significa que podemos usar
estruturas de controle de alto nível (como IF, WHILE, REPEAT…UNTIL) que facilitam a programação. HLA é outro
montador que usa estruturas de controle de alto nível, tipos de dados de alto nível e chamadas de procedimento de
alto nível.
Aliás, MASM é um produto proprietário da Microsoft. Agora usaremos a versão de 16 bits que roda em DOS,
porque podemos usar interrupções de DOS e BIOS nesta versão. Há uma versão de 32 bits que roda no Windows.
Isso está disponível gratuitamente na rede (a versão de 32 bits não permite o uso de interrupções de DOS e BIOS).
Em capítulos posteriores, usaremos o MASM32 para os processadores x86 de 32 bits. Esta abordagem dá uma
compreensão muito boa da linguagem assembly em geral. A versão DOS usada para programas neste livro é MASM
6.14. Esses programas serão executados em todas as versões do MASM a partir de 6.0.
i) Escreva o código com a ajuda de um editor. Podemos ter um editor dentro do MASM ou podemos usar o bloco de
notas ou o wordpad. Salve-o como filename.asm no diretório BIN do MASM. Observe que as instruções, diretivas
e rótulos não diferenciam maiúsculas de minúsculas.
ii) Abra a janela de comando do DOS e vá para o diretório que contém o MASM. A partir disso, vá para o diretório BIN.
iii) Montar o código. Erros de sintaxe (se houver) serão relatados nesta fase. Isto irá gerar o arquivo objeto com o
nome arquivo nome.obj. Outros arquivos também são gerados e podemos optar por visualizá-los (arquivo de
listagem, arquivo de configuração e assim por diante). Os detalhes destes são fornecidos no Apêndice B.
iv) Vincular o arquivo objeto. A ligação envolve a combinação de módulos montados separadamente em um
arquivo executável (nomedoarquivo.exe).
v) Execute o arquivo exe. Isso fará com que o programa seja carregado na memória e executado.
vi) Os resultados da execução ficarão na memória ou em registradores. Se quisermos visualizá-lo em nossa unidade
de exibição, teremos que usar códigos especiais para ele (isso será discutido mais adiante). Caso contrário, nós
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 75
pode examinar a memória e registrar o conteúdo usando o depurador. O depurador tem todos os comandos
necessários para fazer isso, e o conjunto completo de comandos está detalhado no Apêndice B. Os comandos
do DOS também estão listados aqui.
Os diferentes modelos informam ao montador como usar segmentos e fornecer espaço suficiente para o código do
objeto. Os mais simples são o modelo minúsculo e o modelo pequeno. Vamos começar com esses modelos. O
modelo minúsculo é usado quando código, dados e pilha cabem em um segmento com tamanho máximo de 64 K.
O modelo pequeno pode ter um segmento de dados e um segmento de código, cada um com tamanho máximo de
64 K .
Exemplo 2.1
.MODELO PEQUENO ;escolha o modelo de segmento único
.CÓDIGO ;início do segmento de código
.COMECE ;início do programa
Vamos inserir este código usando um editor e salvá-lo como tinym.asm no diretório BIN do MASM6.14. Abra a
janela de comando do DOS. Vá para o diretório MASM 6.14/BIN. No diretório BIN, monte e vincule o arquivo usando
o comando ml tinym.asm. O Exemplo 2.2 mostra a janela de comando do DOS correspondente a isso. O comando
ml faz com que a montagem e a vinculação sejam feitas de uma só vez. Agora para obter o arquivo de listagem,
digite o comando ml/Fl tinym.asm. O arquivo de lista será salvo no diretório BIN como tinym.lst (mais comandos e
opções estão disponíveis no Apêndice B). Versões anteriores do MASM exigiam duas etapas para as mesmas
ações. Para montar, o comando foi masm filename.asm. A vinculação exigia o comando link filename.obj. O
arquivo de lista foi obtido usando masm/l filename.asm. Os exemplos 2.2 mostram a janela de comando do DOS
enquanto montamos e vinculamos. O Exemplo 2.3 mostra o arquivo de lista.
Nota Se você acha que esta parte é cansativa, passe rapidamente por esses tópicos e volte a ele depois de ter
aprendido mais aspectos de programação e estiver pronto para programar usando este montador.
Machine Translated by Google
76 OS MICROPROCESSADORES x86
Exemplo 2.2
C:\masm6.14\BIN>ml tinym.asm
Microsoft (R) Macro Assembler Versão 6.14.8444
Copyright (C) Microsoft Corp 1981–1997. Todos os direitos reservados.
Montagem: tinym.asm
Exemplo 2.3
Microsoft (R) Macro Assembler Versão 6.14.8444
tinym.asm
.MODELO PEQUENO ;escolha o modelo de segmento único
0000 .CÓDIGO ;início do segmento de código
.COMECE ;início do programa
O Exemplo 2.3 mostra a listagem correspondente ao nosso programa tinym. (Somente uma parte do arquivo de
lista é mostrada aqui. Consulte o Apêndice B para obter detalhes adicionais.) Muitas informações podem ser
obtidas apenas olhando o arquivo de lista. O arquivo de listagem é uma das saídas obtidas no processo de montagem.
Examinar o Exemplo 2.3.
Vemos primeiro os detalhes da versão do MASM que é usada. O programa completo em linguagem
assembly, juntamente com os comentários que digitamos, é visto a seguir. No lado esquerdo, vemos os off-
sets dentro do segmento de código no qual o código é salvo. Esses off-sets foram gerados pelo montador.
Também encontramos os opcodes correspondentes a cada instrução.
Por exemplo na primeira linha:
0100H é o off set no segmento de código onde a primeira instrução está armazenada, e B0 67 é o opcode
de MOV AL, 67H. Se adicionarmos uma diretiva.listall, o arquivo de lista será alterado conforme mostrado
no Exemplo 2.4.
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 77
Exemplo 2.4
.MODELO PEQUENO
0000 .CÓDIGO
.COMECE
0100 *@Comece:
.listall
Essas duas instruções encerram a execução do programa e devolvem o controle ao DOS. END é uma
diretiva. Ele diz ao montador para parar de ler, pois não há instruções além disso. O comando .STARTUP
está disponível apenas nas versões do MASM 6.0 e superiores. É um atalho, pelo qual os registradores
de segmento são inicializados automaticamente, o que significa que os programadores não precisam
escrever instruções para isso.
Agora vamos usar o depurador para obter mais informações sobre esses aspectos. O depurador nos
permite visualizar a memória e os registradores, juntamente com várias outras funções (veja o Apêndice B).
Para entrar no depurador, digite debug tinym.com. Recebemos um sublinhado como o prompt. Ao
digitar 'r', podemos ver o conteúdo dos registradores, antes da execução do programa. Agora digite
'u', que é o comando para desmontar ou desmontar. Desmontar é o inverso de montar. Ele recupera
os mnemônicos dos códigos de máquina. O Exemplo 2.5 fornece o resultado desses dois comandos.
Exemplo 2.5
C:\masm6.14\BIN>debug tinym.com
-r
AX = 0000 BX = 0000 CX = 010C DX = 0000 SP = 0000 BP = 0000 SI = 0000
DI = 0000 DS = 13AD ES = 13AD SS = 13BD CS = 13BD IP = 0100 NV
UP EI PL NZ E PO NC
13BD: 0100 B067 MOV AL, 67
-dentro
78 OS MICROPROCESSADORES x86
O comando nos dá o conteúdo dos registradores, antes da execução da instrução MOV AL, 67H. Descobrimos
que o conteúdo do registrador CS é CS = 13BD. Ao digitar o comando 'u', descobrimos que o endereço
lógico da primeira instrução é 13BD:0100. O valor de CS não precisa ser o mesmo toda vez que o programa
é carregado na memória. Isso ocorre porque o arquivo objeto gerado pelo montador é relocalizável.
i) O tamanho é limitado a 64 K.
iv) O código inicia em off set 0100 H, logo após o PSP (segmento de prefixo de programa) do DOS.
v) Arquivo menor em relação aos arquivos exe, pois não possui o bloco de cabeçalho de 512 bytes.
Dos Exemplos 2.2 a 2.5, vimos as táticas de executar e analisar um programa em linguagem assembly de
segmento único rodando no MASM. Agora, veja a listagem correspondente a outro programa que usa o
modelo tiny.
Exemplo 2.6
.MODELO PEQUENO ;escolha o modelo de segmento único
0000 .CÓDIGO ;início do segmento de código
.COMECE ;início do programa
O Exemplo 2.6 mostra uma sequência de instruções que copiam vários dados entre registradores de 16 e 8
bits. O ato de mover dados de um registrador para outro altera apenas o registrador de destino, nunca a
fonte.
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 79
Exemplo 2.7
.MODELO PEQUENO ;escolha o modelo de segmento único
0000 .CÓDIGO ;início do segmento de código
.COMECE ;início do programa
0100 B8 0000 MOV AX, 0 ;coloca 0000 em AX
0103 B0 43 MOV AL, 'C' ;coloque 'C' em AL
0105 B9 5674 MOV CX, 05674H ;coloque 5674H em CX
0108 B2 2D MOV DL, 45 ;coloque 45 (decimal) em DL
010A B6 45 MOV DH, 45H ;coloque 45H em DH
.SAÍDA ;sair para DOS
FIM ;fim do programa
O Exemplo 2.7 é uma listagem e mostra várias instruções em linguagem assembly que usam endereçamento
imediato. Apenas dados de 8 bits podem ser colocados em um registrador de 8 bits. AL, DL e DH são
registradores de 8 bits. Dados de 16 bits podem ser copiados para registradores de 16 bits. Embora no editor, a
segunda instrução tenha sido escrita como MOV AL, 'C', o montador traduz ASCII 'C' para seu equivalente hexadecimal 43H.
Todos os dados gravados na memória estarão no formato hexadecimal (ou seja, a forma compactada de
representação binária). Assim, o decimal 45 é encontrado para 2DH na listagem.
Nota Um dado (byte, palavra ou mais) começando com os caracteres hexadecimais A, B, C, D, E ou F deve
ser precedido por um 0. Caso contrário, o montador dará um erro, ou seja, MOV AL, EFH dará um erro de
montagem . Deve ser reescrito como MOV AL, 0EFH. Da mesma forma MOV BX, C456H está errado.
Reescreva-o como MOV BX, 0C456H.
Byte BD BYTE
Palavra DW PALAVRA
80 OS MICROPROCESSADORES x86
Exemplo 2.8
.MODELO PEQUENO
0000 .CÓDIGO
0000 50 NUM1 DB 50H ;coloque 50H em NUM1
0001 210A 0003 NUM2 DW 210AH ;coloque 210AH em NUM2
0789 NUM3 DW 0789H ;coloque 0789H em NUM3
.COMECE
FIM
O exemplo 2.8 é uma listagem, que mostra os dados sendo colocados no próprio segmento de código. No
modelo tiny, podemos ter dados e código no mesmo segmento, com a restrição de que o tamanho do
segmento não deve ultrapassar 64 Kbytes. NUM1, NUM2 e NUM3 são locais que armazenam dados.
NUM1 é um local de byte, enquanto NUM2 e NUM3 são locais de palavras.
Exemplo 2.9a
.MODELO PEQUENO ;escolha o modelo pequeno
0000 .DADOS ;inicia o segmento de dados
FIM
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 81
i) A palavra R nas linhas de código com endereços diz que os endereços são relocalizáveis. Isso pode
ser observado na listagem do Exemplo 2.8 também.
ii) No segmento de dados, os locais dos dados receberam rótulos. Os dados serão armazenados em off-sets como
mostrado na Fig. 2.1 (lembre-se do conceito de little endian ).
Agora vamos ver o mesmo programa listado com a diretiva .LISTALL inserida antes da diretiva de
inicialização. Isto mostrará a conversão de .STARTUP e .EXIT para um número de instruções de
8086. O que deve ser observado é que a diretiva de inicialização corresponde às instruções
necessárias para inicializar os registradores de segmento (exceto CS, que é feito apenas pelo SO ).
Compare isso com o Exemplo 2.12. No entanto, se tudo isso o confunde, deixe-o de lado por
enquanto e volte a ele quando se tornar mais proficiente em programação em linguagem assembly.
Exemplo 2.9b
.MODELO PEQUENO ;escolha o modelo pequeno
0000 .DADOS ;inicia o segmento de dados
0000 *@Comece:
0000 BA ---- R * mov dx, DGROUP
0003 8E SIM * arroz ds, dx
0005 8C D3 * arroz bx, ss
0007 2B DA * sub bx, dx
0009 D1 E3 * shl bx, 001h
000B D1 E3 * shl bx, 001h
000D D1 E3 * shl bx, 001h
000F D1 E3 * shl bx, 001h
0011 AF *cli
0012 8E D2 * arroz ss, dx
0014 03 E3 * adicionar sp, bx
0016 FB * esses
.SAÍDA
0024 B4 4C * arroz ah, 04Ch
0026 CD 21 * int 021h
FIM
Machine Translated by Google
82 OS MICROPROCESSADORES x86
Figura 2.1 | Segmento de dados com rótulos e off-sets correspondentes ao Exemplo 2.9
TEMP EQU 34
PREÇO EQU 199
Exemplo 2.10
.MODELO PEQUENO
0000 .DADOS
0000 45 UM BD 45H
0001 00 DOIS DB?
0000 .CÓDIGO
.COMECE
FIM
O Exemplo 2.10 mostra o uso da diretiva EQU. A partir deste arquivo de lista, vemos que o rótulo FACTR é
substituído por 25H quando o programa está sendo executado.
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 83
Exemplo 2.11a
.MODELO PEQUENO
.DADOS
.SAÍDA
FIM
Exemplo 2.11b
.MODELO PEQUENO
0000 .DADOS
ORG 0010H
0010 20 40 NUMS DB 20H,40H
ORG 0030H
0030 8907 00FD NUMS1 DW 8907H,0FDH
0000 .CÓDIGO
.COMECE
ORG 000AH
.SAÍDA
FIM
O Exemplo 2.11b é o arquivo de lista correspondente ao programa do Exemplo 2.11a. Compare-o com qualquer um
dos arquivos de lista vistos anteriormente. Agora, nem os dados nem os segmentos de código começam no padrão
Machine Translated by Google
84 OS MICROPROCESSADORES x86
off set de 0000. Os dados e o código que vêm após as instruções ORG têm off sets conforme especificado na diretiva
ORG. Assim, deixou de fora muito espaço nos segmentos de dados e de código.
Estes são outros modelos disponíveis para serem utilizados de acordo com nossas necessidades. A Tabela 2.2 dará
uma ideia desses modelos e suas especificações. Há outro modelo chamado modelo fl at, que usa endereçamento
de 32 bits e memória não segmentada e é usado no modo protegido.
Pelo exposto, fica claro que todos os modelos não são apenas para 8086, mas são os recursos do MASM que atende
a toda a família x86.
Agora vamos ver o modelo tradicional de MASM. No modelo de memória simplificado, cabe ao software carregador
inicializar os registradores de segmento. No modelo tradicional, usamos diretivas para definir segmentos e instruções
para inicializar os registradores de segmento. Isso é chamado de definição de segmento completo . Os registradores
CS e SS são inicializados automaticamente pelo carregador, mas o DS e o ES (se o segmento extra estiver sendo
usado) terão que ser inicializados pelo programador.
Vamos reescrever o Exemplo 2.9 usando a definição de segmento completo.
Exemplo 2.12
QUE SEGMENTO ;inicia o segmento de dados
NÚMERO 1 BD 50H
NUM2 DW 210AH
NUM3 DW 0789H
QUE FIM ;termina o segmento de dados
i) O segmento de dados recebeu um nome DAT. Os dados dentro do segmento são colocados entre as diretivas
SEGMENT e ENDS que são semelhantes aos parênteses para um segmento.
ii) Da mesma forma, o segmento de código é denominado COD e o conteúdo deste segmento também foi
entre as mesmas diretivas (os segmentos podem ter qualquer nome).
iii) O registrador DS foi inicializado pelas duas primeiras instruções. O DS não pode usar
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 85
1 Minúsculo
1 Nada
endereçamento. Portanto, o DAT, que corresponde a um número, deve ser carregado no AX (ou qualquer outro registrador
de 16 bits) e depois transferido para o DS.
iv) O valor de DAT é carregado no DS. Isso significa que DAT corresponde ao endereço base do segmento de dados. Entretanto,
somente quando o carregador carrega este programa na memória, o endereço base real (isto é, os 16 bits superiores do
endereço base) será carregado no registrador DS.
Neste ponto, o montador apenas reconhece a 'referência' a um segmento chamado DAT.
v) O registrador CS não precisa ser inicializado no programa. Isso é feito pelo carregador por
predefinição.
vi) O programa é finalizado usando a instrução INT 21H com a função número 4CH
(As chamadas de função DOS serão discutidas em detalhes posteriormente).
vii) ASSUME é uma diretiva que relaciona cada segmento ao seu registro de segmento, especificando
o nome.
No entanto, os modelos de pontos simplificados serão usados ao longo deste livro-texto, exceto quando razões especiais exigirem
o uso da definição de segmento completo. Nas versões mais antigas do MASM, antes do advento da diretiva .startup, os
registradores de segmento precisavam ser inicializados com as instruções abaixo:
Exemplo 2.13
ETIQUETA CÓDIGO DE OPERAÇÃO OPERANDO COMENTE
86 OS MICROPROCESSADORES x86
Uma linha de linguagem assembly tem quatro campos, a saber, rótulo, opcode, operando e comentário. Um rótulo
é posicionado à esquerda de uma linha e é o símbolo do endereço de memória que armazena essa linha de
informação. Existem certas regras sobre rótulos que são permitidos no MASM.
ii) Um rótulo pode ter de 1 a 31 caracteres que podem ser dígitos, letras maiúsculas ou minúsculas ou os caracteres
especiais em (@), dólar ($), sublinhado (_), ponto (.) ou ponto de interrogação (?) .
O segundo campo é o opcode ou campo de instrução. O terceiro é o campo do operando, e o último é o campo do
comentário que começa com um ponto e vírgula. O uso de comentários é recomendado para tornar os programas
mais legíveis.
No entanto, será muito instrutivo e informativo entender como e por que um mnemônico específico foi
convertido em um código específico. Vamos entender os princípios subjacentes da Arquitetura do Conjunto de
Instruções do 8086.
CONCEITOS DE PROGRAMAÇÃO – I 87
Descubra que AMD64 e P64 têm o mesmo ISA, mas não são os mesmos internamente. O ISA é uma interface
entre uma linguagem de nível superior e a linguagem de máquina.
Agora vamos ao processador 8086, que é um processador CISC. Uma característica do CISC é que seu tamanho
de instrução varia – nem todas as instruções têm o mesmo tamanho. 8086 tem tamanho de instrução variando de
um byte a cinco bytes. Isso torna os processos de montagem, desmontagem e decodificação de instruções
complicados porque o comprimento da instrução precisa ser calculado para cada instrução. Uma instrução deve
ter as informações completas para buscar e executar uma instrução. Assim, deve conter as seguintes informações:
Veja o formato geral dos três primeiros bytes de uma instrução (veja a Fig 2.2).
Prefixo
Este é um byte opcional e precisa ser usado apenas para alterar a operação, por exemplo, segmento sobre
prefixo de passeio.
Primeiro byte
Este é considerado o primeiro byte de uma instrução. Neste byte, existe o código de operação (opcode) que tem 6
bytes de comprimento. Este é o código que define a operação a ser realizada.
Os outros dois bits são os bits D e W.
eu)
PREFIXOS
(OPCIONAL)
ii)
CÓDIGO DE OPERAÇÃO
D Dentro
iii)
88 OS MICROPROCESSADORES x86
Segundo byte
MOD (2 bits) – Bits de registro.
REG (3 bits) – o código de identificação do registro usado.
R/M (3 bits) – Especificando um registrador ou operando de memória.
Os bits MOD e R/M juntos especificam o modo de endereçamento da instrução.
Observação Todas as instruções não precisam ter os bits W e D. Nesses casos, o tamanho do operando é implícito e a
direção é irrelevante.
000 AL MACHADO
001 CL CX
010 DL DX
011 BL BX
100 AH SP
101 CH PA
110 DH E
111 BH A PARTIR DE
ISSO É 00
CS 01
SS 10
DS 11
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 89
Tabela 2.5 | Códigos Pertencentes aos Modos de Endereçamento - Padrões de Bits MOD e R/M
CONTRA 00 01 10 11
R/M
W=0W=1
Com a ajuda das tabelas acima, vamos tentar projetar um código para algumas instruções simples.
e) MOV AX, BX
Chegando à nossa tarefa, primeiro procure no manual da Intel o opcode do MOV, com a especificação 'Register/Memory to/
from Register'. Vê-se que é 100010. Isso corresponderá aos primeiros 6 bits do primeiro byte. W = 1, pois o operando é uma
palavra. O bit de direção D deve ser definido. Nesse caso, tanto a origem quanto o destino são registradores. Vamos vê-lo
como uma palavra sendo movida para AX, ou seja, o registrador AX é, portanto, o destino. Portanto, D = 1. Então devemos
usar o código de AX no campo de registrador do segundo byte. O primeiro byte é
CÓDIGO DE OPERAÇÃO DW
10001011
Byte 1
Para projetar o segundo byte, primeiro procure na Tabela 2.5 os bits MOD e R/M. Descobrimos que os bits MOD são 11
(última coluna da tabela) para endereçamento de registradores, os bits reg são 011 para AX (da Tabela 2.3) e os bits R/M
são tratados como o campo 'segundo registrador'. Aqui, o segundo registro é BX, cujo código é 011 (Tabela 2.5 4ª linha).
Assim, o segundo byte é
Byte 2
Não há nenhuma outra informação necessária para codificar esta instrução. Esta é uma instrução de dois bytes com o código
8B C3 H.
Machine Translated by Google
90 OS MICROPROCESSADORES x86
CÓDIGO DE OPERAÇÃO DW
00000010
Byte1
Byte 2
O opcode de ADD com a especificação de 'Register/Memory with Register to any' é 00000. W = 0, pois é uma
transferência de byte. D = 1 considerando BL como registrador de destino. Para o segundo byte, MOD = 11. O
código de registro para BL é 011, bits R/M correspondentes a CL é 001.
O código, portanto, é 02 D9 H.
Esta é uma instrução no modo imediato. Dois bytes são necessários para os dados imediatos, que são de 16 bits.
Agora vamos olhar para os manuais da Intel sobre o formato de MOV no modo imediato 'para registrar'. Mostra
como:
Aqui W = 1, Reg (CX) = 001. Portanto, a codificação desta instrução é 1011 1001 como o primeiro byte
seguido pela palavra data no esquema little endian como 13 02 H. A instrução completa
é B9 13 02H.
CÓDIGO DE OPERAÇÃO DW
10001011
Byte 1
Byte 2
O primeiro byte é 8BH. O segundo byte tem MOD = 00 (Coluna 2 na Tabela 2.5) e os bits R/M são 110
(correspondente ao endereçamento direto na Tabela 2.5). Assim, o segundo byte é 16H. Th é seguido pelo
endereço direto na forma little endian. O código de máquina de 4 bytes é 8B 16 CD 23 H.
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 91
CÓDIGO DE OPERAÇÃO DW
10001000
Byte 1
Byte 2
Para o segundo byte, MOD = 00 correspondente a [BX]. Os bits de registro são 110 para DH e R/M = 111
da Tabela 2.5. Assim, o código de instrução é 88 37H.
CÓDIGO DE OPERAÇÃO DW
10001010
Byte 1
Byte 2
Seguindo o mesmo procedimento discutido nas instruções anteriores, o código para isso é 8A 00 H.
CÓDIGO DE OPERAÇÃO DW
00000011
Byte 1
Byte 2
92 OS MICROPROCESSADORES x86
Exemplo 2.14a
.MODELO PEQUENO
.DADOS
ORG 23CDH
DAT DW 0000
.CÓDIGO
.COMECE
MOV AX, BX
ADICIONAR BL, CL
MOV CX, 0213H
MOV DX, DAT
MOV [BX], DH
MOV AL, [SI] [BX]
ADICIONAR AX, 53H[SI][BX]
MOV CS:[BX], DH
MOV AX, CS:[BX]
.SAÍDA
FIM
Exemplo 2.14b
0B56:0017 8BC3 MOV AX, BX
0B56:0019 02D9 BL, CL
ADICIONAR
No depurador, as instruções desmontadas são mostradas acima, com os endereços (offsets dentro dos
segmentos de código) das instruções também mostrados. Por exemplo, na linha
0B56:0019 02D9 ADICIONAR BL, CL
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO – I 93
0B56 é o valor de CS, 0019 é o off set da instrução e 02D9H é o código de máquina da instrução ADD BL,
CL.
Agora que temos o procedimento de codificação para algumas instruções, pode-se concluir que a codificação
manual é uma alternativa na ausência de um montador, mas não é uma boa prática confiar nela. O uso de
um bom montador é recomendado para uso rápido e eficiente do código assembly.
No entanto, conhecer a metodologia de codificação ajuda-nos a ter uma ideia da forma como os dados,
registos e instruções são tratados pelo processador.
Nota Todas as instruções que codificamos nesta seção têm pelo menos dois bytes de comprimento. No
entanto, existem algumas instruções que possuem apenas um byte – exemplos são STI (set interrupt fl ag)
e CLD (clear direction fl ag). Tente descobrir por que eles têm apenas um byte de comprimento.
| Para um montador, ter que saber o endereço de memória correspondente a um rótulo que ainda não foi
definido é chamado de problema de 'referência direta'.
| Os montadores podem ser de uma passagem, duas passagens ou várias passagens. Cada passagem refina a otimalidade do
processo de montagem.
| Vários montadores estão disponíveis para x86, dos quais o MASM é atualmente um dos mais
populares.
| O modelo minúsculo é um modelo de memória compacto e permite apenas um segmento. O arquivo de execução gerado aqui é um
arquivo com.
| O modelo pequeno também precisa de um segmento de dados. Ele gera um arquivo exe como o arquivo de execução.
| Os tipos de dados devem ser definidos como bytes, palavras e assim por diante, antes que os rótulos sejam usados para os dados.
| Os programas também podem ser escritos usando a 'definição de segmento completo' convencional.
| A codificação manual de instruções é possível se todas as informações referentes aos formatos de instrução, modo, códigos de registro
e opcodes estiverem disponíveis.
PERGUNTAS
1. A tradução de código assembly para código de máquina é um processo individual, mas a tradução
de uma linguagem de alto nível para código de máquina não é assim. Explique por quê.
94 OS MICROPROCESSADORES x86
10. Liste as regras sobre rótulos que podem ser usados no MASM.
EXERCÍCIO
2. Escreva um programa para copiar 25 para AL, 'S' para BL e '*' para CL. Em seguida, mova-os para AH, BH e CH,
respectivamente.
3. Usando o modelo pequeno, armazene os bytes 56H e FCH e as palavras 0978H e CFD4H nos dados
segmento.
4. Armazene três bytes e quatro palavras no segmento de dados. Copie um byte e uma palavra destes para os registradores
apropriados.
5. Usando o modelo pequeno, escreva um programa que incorpore os seguintes modos de endereçamento.
a) modo de registro
b) modo imediato
c) registrar o modo indireto.
6. Escreva um programa que adicione um fator de correção constante a uma temperatura armazenada no segmento de
dados. A temperatura corrigida deve ser armazenada em um novo local na memória.
7. Usando a diretiva DUP, aloque espaço para 10 palavras de dados, 5 palavras duplas e 2 palavras quádruplas no segmento
de dados. Preencha também os próximos 12 espaços com 0, os próximos 10 espaços com '$' e o próximo espaço com
'S'.
8. Usando a definição de segmento completo, escreva um programa para adicionar o conteúdo de duas palavras que estão
na memória e armazene a soma em um terceiro endereço.
programação
3 conceitos-ii
Um argumento comum é se a programação é uma arte ou uma habilidade. Dizer que é uma arte implica que bons
programadores nascem, não são feitos. Isso pode ser parcialmente verdade, porque se vê que algumas pessoas têm
um talento natural para a programação. No entanto, isso se aplica a todas as habilidades que temos. Mesmo que a
habilidade de programação seja uma habilidade inata, é preciso poli-la e praticar esse ofício para se tornar bom nisso.
Não há outra maneira senão trabalhar duro para se tornar um especialista.
Chegando ao outro lado do argumento de que programar é uma habilidade – então também, as mesmas regras se
aplicam. O ofício da programação deve ser aprendido com fundamentos sólidos – devemos desenvolver nossos
processos de pensamento para nos tornarmos bons solucionadores de problemas. Para cada problema, há mais de uma
maneira de resolvê-lo. Encontrar a solução ideal depende em grande parte do quanto aprendemos a construir castelos
no ar – onde esses castelos são as soluções para nossos problemas.
Vamos concluir que qualquer um pode se tornar um programador razoavelmente bom, obtendo um
uma boa compreensão do básico e acompanhá-lo com estudo afiado e prática contínua.
Existem várias abordagens para resolver um problema de programação. Uma delas é chamada de abordagem de
cima para baixo . Esta abordagem tende a olhar para o problema como um bloco funcional completo.
A solução para o problema é planejada, depois que todo o problema é completamente entendido.
96 OS MICROPROCESSADORES x86
Este bloco funcional é então decomposto em blocos menores, cujas funções serão definidas ao longo do caminho.
A outra abordagem é a abordagem de baixo para cima . Aqui os blocos funcionais básicos que estão
disponíveis ou podem ser claramente definidos, são unidos para obter o módulo maior. Assim, pequenos blocos de
função são integrados para formar a entidade de nível superior. Ambas as abordagens têm suas vantagens e
desvantagens. Dependendo do tipo de problema em questão, a metodologia deve ser decidida.
Algo que deve ser evitado é pular para 'codificação' assim que um problema for apresentado. Devemos primeiro
construir a solução para o nosso problema, opcionalmente em nossa mente – mas a melhor maneira é escrever um
pseudocódigo ou desenhar um fluxograma antes de escrever o código real. Dessa forma, nossos processos de
pensamento nos levam ao algoritmo a ser usado. À medida que nos familiarizamos com a programação, podemos
gradualmente evitar pseudocódigos ou fluxogramas para programas pequenos, mas usá-los para os mais complexos.
Neste livro, apenas a parte de codificação é feita – cabe ao aluno visualizar ou escrever o algoritmo, como preferir.
A partir do capítulo anterior, você pode ter tido uma visão geral da programação em assembly usando o MASM.
Agora, estamos em condições de ter uma ideia melhor do conjunto de instruções de 8086, em uma fase
maneiras.
No Capítulo 2, alguns programas foram executados, mas não tínhamos nenhum mecanismo para exibir as
saídas. Também não havia mecanismo para receber dados pelo teclado, ou seja, não era possível fazer programação
interativa. Lá usamos o depurador para acessar a memória e visualizar os registradores para verificar se nossos
resultados estão como deveriam estar. Para inserir dados, deveríamos armazená-los na parte de dados do segmento
que está sendo usado. Para um programador, essa abordagem parece complicada. A programação interativa é
definitivamente mais divertida e instrutiva. Vamos ver o que é.
O que é DOS?
Estamos agora na era do computador quando nosso aprendizado de computadores começa com o uso da versão
mais recente do Windows. No entanto, não foi assim no início da evolução do computador. Vários sistemas
operacionais foram testados, testados e descartados antes que a interface gráfica que é o Windows se tornasse
comum. Anteriormente, o DOS era um sistema operacional muito popular. Ele ainda é usado e é muito útil.
DOS significa sistemas operacionais de disco, que pode ser um acrônimo para qualquer sistema operacional,
mas é mais frequentemente usado como abreviação de MS-DOS (sistema operacional de disco da Microsoft).
Originalmente desenvolvido pela Microsoft para a IBM, o MS-DOS era o sistema operacional padrão para
computadores pessoais compatíveis com a IBM.
As versões iniciais do DOS eram muito simples e lembravam outro sistema operacional chamado CP/M. As
versões subsequentes tornaram-se cada vez mais sofisticadas à medida que incorporavam recursos de sistemas
operacionais de minicomputadores. No entanto, o DOS ainda é um sistema operacional de 16 bits e não oferece
suporte a vários usuários ou multitarefa.
O DOS é considerado insuficiente para muitas das operações gráficas para as quais usamos nossos
computadores, mas todos os Windows têm uma forte dependência do DOS. Portanto, as versões mais recentes do
DOS são incorporadas em todos os sistemas operacionais Windows. Considera-se que o DOS controla o hardware
diretamente. É esse aspecto do DOS que nos levará a usar as interrupções do DOS e do BIOS neste livro. Alguns
comandos básicos do DOS são fornecidos no Apêndice B. Eles o ajudarão a começar no MASM 6.14.
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO ÿ II 97
Até agora, estávamos vendo o processador 8086 como conectado apenas à memória. Por exemplo, a memória
física – RAM. No entanto, na realidade, o processador também está conectado a vários dispositivos de entrada
e saída. Por exemplo, o PC tem o teclado e o mouse como dispositivos de entrada.
O monitor de vídeo é um dispositivo de saída. Como programadores, gostaríamos de inserir dados no
processador usando o teclado e obter os resultados exibidos no monitor de vídeo. Para fazer isso, precisamos
ter alguma maneira de acessar esses dispositivos de E/S, que contêm muito hardware extra.
Felizmente, existem softwares disponíveis para lidar com esse problema, e eles vêm na forma de funções
escritas para acessar dispositivos de entrada e saída. A palavra BIOS pode parecer familiar. BIOS (Basic Input
Output System) consiste em um conjunto de funções escritas para esta finalidade. Além disso, existe outro
conjunto de funções chamado funções DOS ou interrupções DOS. Eles fazem parte do sistema operacional
DOS. São funções escritas para acessar dispositivos de entrada e saída, que são chamados na forma de
interrupções de software. Vimos uma interrupção do DOS que é aquela para a qual a instrução .EXIT é traduzida:
Neste exemplo, 4CH é o número da função que deve ser carregado no registrador AH antes de chamar a
interrupção com o tipo número 21H. Essa função causou a saída do programa e o retorno ao prompt do DOS.
Começaremos com quatro chamadas de função importantes, todas do tipo interrupção 21H.
i) Leia o teclado com echo MOV AH,
01
INT 21H
Esta chamada sai com o valor ASCII da tecla pressionada, ficando disponível em AL. A tecla pressionada
também é ecoado na tela.
MOV AH, 08
INT 21H
Esta chamada sai com o valor ASCII da tecla pressionada disponível em AL. A tecla pressionada
não é ecoado na tela.
98 OS MICROPROCESSADORES x86
O endereço lógico DS : DX deve apontar para o início da string. Este deve ser seguido pelas seguintes
instruções:
MOV AH, 09
INT 21H
O conjunto de instruções do 8086 é razoavelmente grande. Além disso, cada instrução pode ser usada em vários
modos de endereçamento tornando o conjunto maior. Conhecer todas as instruções, seu formato e suas
características é um fator chave para se tornar um programador especialista. Vamos listar as características gerais
das instruções que se tornarão mais claras à medida que forem explicitamente obtidas.
i) A maioria das instruções tem dois operandos, ou seja, o destino e a origem. Estes podem ser registradores
ou operandos de memória. No entanto, ambos os operandos não podem ser operandos de memória.
Algumas instruções também podem usar dados imediatos como operando de origem.
ii) Certas instruções têm apenas um operando mencionado que é o destino ou a origem. Estes podem ser
operandos registradores ou de memória, mas não dados imediatos.
iii) Existem instruções que não possuem operandos explicitamente mencionados nas instruções. Nesse caso,
algum registro está implícito no uso dessas instruções.
Para aprender o conjunto de instruções, a abordagem será listar instruções com base em sua funcionalidade,
aprender seu formato e função e, em seguida, escrever alguns programas usando-os.
A Tabela 3.1 fornece todas as instruções de transferência de dados do 8086, exceto as instruções de entrada e
saída, que serão apresentadas no Capítulo 5. Algumas dessas instruções serão discutidas em detalhes e usadas
em programas aqui. O resto será usado em capítulos posteriores.
O uso da instrução MOV nos modos registrador e de endereçamento imediato foi abordado no Capítulo 2.
Portanto, usaremos MOV em outros modos de endereçamento agora.
Exemplo 3.1
.MODELO PEQUENO ;selecione um modelo pequeno
.DADOS ;inicia o segmento de dados
COSTP DB 67H ;preço de custo da loja
Machine Translated by Google
CONCEITOS DE PROGRAMAÇÃO ÿ II 99
Tabela 3.1 | Lista de Instruções de Transferência de Dados 8086 com Formato e Função
(Intercâmbio) origem
5 Destino POP (Pop) Transferir palavra no topo da pilha atual (SS : SP) Nenhum
para o destino
(Carregue no DS e o DS e registre-se
registre-se)
7 LES reg16, memória Carregue o ponteiro far para Nenhum
para a pilha
no registrador de bandeira
12 XLAT (Traduzir) Substitui o byte em AL pelo byte Nenhum
O Exemplo 3.1 mostra o uso da instrução MOV no modo direto de endereçamento. Este modo usa um
local de memória como um operando. Aqui, dois locais de memória rotulados COSTP e SELLP foram
definidos no segmento de dados. O COSTP tem um byte de dados armazenado nele, mas o SELLP só
tem espaço alocado para armazenamento posterior. A primeira instrução MOV obtém o byte de dados em
COSTP para AL. Após adicionar uma constante LUCRO pré-definida a ela, a soma em AL é armazenada
em SELLP. Ambas as instruções MOV usam endereçamento direto. Nesta etapa, é preciso lembrar que
o montador fará a conversão dos rótulos para endereços de memória.
Exemplo 3.2
.MODELO PEQUENO ;selecione um modelo pequeno
0000 .DADOS ;inicia o segmento de dados
0000 10 20 30 40 50 BD MATRIZ 10H, 20H, 30H, 40H, 50H
;configurar
0000 .CÓDIGO array ;iniciar segmento de código
.COMECE ;inicia o programa
0017 BF 0000 MOV DI, 0 ;carrega DI com 0
001A 8A 85 0000 R MOV AL,ARRAY[DI] ;pega primeiro elemento em AL
001E 04 07 ADD AL,07H ;adiciona 07 a ele
0020 83 C705 ADICIONE DI,05H ;adicione 5 a DI
0023 88 85 0000 R MOV ARRAY[DI], AL ;mover soma para memória
.SAÍDA ;sair para DOS ;fim
FIM do programa
O Exemplo 3.2 mostra o arquivo de listagem de um programa que utiliza a instrução MOV no modo de
endereçamento relativo a registradores . Analisemos o programa. O segmento de dados é inicializado
com 5 bytes. O endereço do primeiro local é rotulado como ARRAY. DI é usado para endereçar os
números dos elementos. Com DI = 0, o primeiro elemento é acessado e com DI = 5, o sexto elemento é acessado.
Então o endereço efetivo (EA) é [ARRAY + DI]. Quando DI = 0, a instrução MOV AL, ARRAY[DI], transfere
os dados da primeira posição de memória para AL. A isso, adiciona-se 07. Com DI = 5, ARRAY[DI] torna-
se o endereço efetivo da sexta posição na memória. Então MOV ARRAY[DI], AL armazena a soma na
memória. O deslocamento para o modo relativo é o valor do rótulo ARRAY. A partir do arquivo de lista, vê-
se que o off set correspondente ao ARRAY é 0000.
Como ARRAY é o endereço da primeira localização no segmento de dados, o segmento de dados ficará
assim, após a execução do programa. A soma estará no local ARRAY + 5.
EA CONTENTE
MATRIZ + 5 17H
MATRIZ + 4 50H
MATRIZ + 3 40H
MATRIZ + 2 30H
MATRIZ + 1 20H
MATRIZ + 0 10H
Machine Translated by Google
Exemplo 3.3
.MODELO PEQUENO ;selecione um
modelo pequeno
0000 .DADOS ;inicia o
segmento de dados
0000 34 87 56 05 07 ARRAY DB 34H, 87H, 56H, 05H, 07H
;configurar
0000 .CÓDIGO array ;iniciar
segmento de código
.COMECE ;inicia o programa
O Exemplo 3.3 é o arquivo de listagem de um programa que executa a mesma função do exemplo anterior,
mas usa o modo de endereçamento indexado baseado , ou seja, o endereço efetivo é a soma de um
registrador base e um registrador índice. A instrução MOV BX, OFFSET ARRAY faz com que o off set de
ARRAY (que é 0000 como visto no arquivo de lista) seja carregado em BX. Assim, BX agora é um ponteiro
para o local rotulado como ARRAY. Porém, para apontar cada elemento um por um, também é utilizado
outro registrador DI. Com DI = 0, a instrução MOV AL, [BX + DI] faz com que os dados da primeira localização
sejam copiados para AL. Com DI = 5, [BX + DI] acessa a sexta localização no segmento de dados.
Você deve ter notado que o acima é um substituto para a instrução MOV BX, OFFSET ARRAY usada no
Exemplo 3.3.
Agora vamos usar esta instrução em uma aplicação interessante. Gostaríamos de exibir duas cadeias
de caracteres em duas linhas no monitor de vídeo. Foi discutido na Seção 3.1.2 que as chamadas de função
do DOS são necessárias para isso. O seguinte é o arquivo de lista para o programa que faz isso.
Machine Translated by Google
Exemplo 3.4a
.MODELO PEQUENO
0000 .DADOS
0000 48 45 4C 4C 4F 24 MESG1 DB “OLÁ$”
0006 0A 0D 49 20 41 4D MESG2 DB 0AH, 0DH, “EU SOU SAM$”
20 53 41 4D 24
0000 .CÓDIGO
.COMECE
Exemplo 3.4b
OLÁ
EU SOU SAM
C:\masm6.14\BIN>
Agora vamos analisar o programa que faz isso, cuja listagem é mostrada no Exemplo 3.4(a). No
segmento de dados, duas mensagens são armazenadas em off-sets com rótulos MESG1 e MESG2. As
cadeias de caracteres são colocadas entre aspas duplas e terminadas pelo sinal $. Este sinal é
obrigatório para terminar uma cadeia de caracteres que deve ser impressa no dispositivo de exibição.
Observe que a listagem no Exemplo 3.4a mostra os valores ASCII correspondentes para cada caractere
da string. Existe um valor ASCII para 'espaço' que vem entre cada palavra da segunda mensagem, ou
seja, I AM SAM. É visto como '20H'. Observe que '24H' é o valor ASCII de $ e é visto no final de ambas as strings.
Na segunda linha, também vemos dois caracteres 0AH e 0DH. Estes são os valores ASCII para avanço
de linha (que avança o cursor para a próxima linha) e retorno de carro (define o cursor para a posição
esquerda da tela). Elas são necessárias para que a impressão ocorra na segunda linha, começando pela esquerda.
Para imprimir a primeira mensagem, DX aponta para o OFF set MESG1. Isso é feito usando a instrução
LEA, que carrega o off set de MESG1 em DX. Então a função DOS com o número 09 é chamada. Da mesma
forma para a segunda mensagem, DX deve apontar para o off set de MESG2. As duas mensagens conforme
são impressas na janela de comando são vistas no Exemplo 3.4(b). O comando .EXIT faz com que o controle
retorne ao prompt do DOS
Em seguida, em AL, carregue o número que extrairá os dados necessários. Consulte a Tabela 3.2. Por exemplo, se
você deseja obter o valor ASCII de 5, carregue AL = 5. Ele obterá a sexta entrada da tabela.
Consulte a tabela de pesquisa que relaciona um número decimal ao seu valor ASCII. Os valores ASCII como '0', '1',
'2' possuem valores numéricos 30H, 31H, 32H. Consulte a tabela ASCII na Seção 0.6.5.
Exemplo 3.5
O programa a seguir entra na posição de memória a partir de VALUES, os valores ASCII de 1, 3, 5, 4, 0 … nessa
ordem. A tabela de consulta é armazenada no array denominado ASC.
.MODELO PEQUENO
.DADOS
ASC DB '0', '1', '2', '3', '4', '5', '6', '7'
NUM DB 1, 3, 5, 4, 0
VAL DB?
.CÓDIGO
.COMECE
LEA BX, ASC ;deixe BX apontar para o deslocamento da tabela ;deixar SI
LEIA SE, NÃO apontar para NUM
LEA DI, VAL ;deixe DI apontar para VAL
MOV CX, 5 ;CX = 5
AGN: MOV AL, [SIM] ;move o conteúdo de NUM para AL
XLAT ;traduzir
MOV [DI], AL ;mover valor traduzido de AL para VAL
INC SIM ;incrementa o ponteiro para NUM
INC DE ;incrementa o ponteiro para VAL
LOOP AGN ;repete até CX = 0
.SAÍDA
FIM
Número ASCII
0 '0'
1 '1'
2 '2'
3 '3'
4 '4'
5 '5'
6 '6'
7 '7'
8 '8'
9 '9'
Machine Translated by Google
As instruções PUSH e POP são relevantes apenas para o segmento da pilha. Então role para baixo e leia sobre
a operação da pilha antes de tentar entender as instruções PUSH e POP.
BX
CC 99
CONTEÚDO ENDEREÇO DE
DE PILHA TOPO DA PILHA
SP ANTES
--
03E8H O IMPULSO
CC 03E7H
SP DEPOIS
99 03E6H
O IMPULSO
----
03E5H
---
03E4H
CONTEÚDO ENDEREÇO DE
DE PILHA TOPO DA PILHA
SP DEPOIS
--
0314H
O POP
0E 0313H
SP ANTES
67 0312H
O POP
----
0311H
---
03E10H
CX
0E 67
A operação da pilha é diferente das operações normais de memória. É uma memória push-down. Por
exemplo, o valor de SP mencionado acima, digamos, a instrução PUSH BX deve ser executada. Seja BX
= CC99H. Lembre-se que SP = 03E8H. A operação de empurrar é a seguinte. SP é primeiro decrementado
em dois. Os novos dados serão colocados nos endereços (offsets) 03E7H (SP-1) e 03E6H (SP-2),
seguindo o conceito 'little endian' ou seja, quanto maior o byte de BX será o maior endereço (03E7H) e o
byte inferior no endereço inferior (03E6H). O novo valor de SP será 03E6H. Isso mostra que os novos
dados a serem inseridos na pilha serão inseridos nos dois endereços inferiores em relação ao topo da
pilha atual. Sempre, o topo da pilha (SP) tem o deslocamento correspondente ao último byte que foi
inserido.
O inverso será o caso após uma operação POP. Assuma uma operação POP CX no momento em
que o valor SP for 0312H. O conteúdo da pilha será primeiro carregado no registrador CX, e SP é
incrementado em dois. Consulte a Figura 3.2.
tamanho da pilha é menor que 128 bytes. Caso contrário, a pilha definida pelo DOS pode apagar o PSP (prefi x
do segmento de programa) e causar o travamento do sistema.
Exemplo 3.6a
.MODELO PEQUENO
.PILHA 400H ;especifique o tamanho da pilha
Exemplo 3.6b
STACKSEG PILHA DE SEGMENTOS
DW 200H(?)
STACKSEG FIM
O Exemplo 3.6 mostra duas maneiras de definir uma pilha. O Exemplo 3.6a usa o modelo de memória simplificado
e especifica o tamanho da pilha como 400 bytes. O Exemplo 3.6b usa a definição de segmento completo. 200
palavras de dados devem ser separadas como pilha, conforme esta definição. Aqui, ambas as definições criam
pilhas do mesmo tamanho.
Exemplo 3.7
Explique o que é feito neste programa. Suponha SP = 0310H, quando a pilha foi inicializada.
.MODELO PEQUENO
.PILHA 300H
.CÓDIGO
.COMECE
MOV AX, 4567H
MOV BX, 0ACEH
EMPURRAR MACHADO
PRESSIONE BX
EIXO POP
POP BX
.SAÍDA
FIM
Solução
Este programa define uma pilha de 300 bytes pelo uso da diretiva stack. O programa primeiro carrega dois
números em AX e BX. Esses números são colocados na pilha usando as operações PUSH. Seguido por,
operações POP. O que precisamos lembrar é que o estouro ocorre na direção inversa. O que for inserido por
último será exibido primeiro. O último PUSH foi PUSH BX. É óbvio então que pela operação POP AX, o conteúdo
de AX é substituído pelo conteúdo de BX. Da mesma forma, o segundo POP faz com que BX obtenha o conteúdo
de AX. Assim, este programa troca o conteúdo desses dois registradores, utilizando a pilha como área temporária
de armazenamento de dados.
Após a execução, o conteúdo dos registradores é: BX = 4567H e AX = 0ACEH.
Observação A troca de conteúdo de registro não é realmente um aplicativo para a pilha. Podemos trocar esses
conteúdos de registradores facilmente usando a instrução XCHG AX, BX. No entanto, este programa mostra a
relação entre as operações POP e PUSH.
Machine Translated by Google
i) A localização do salto pode estar no mesmo segmento de código, neste caso está próximo ao salto.
Para um salto próximo, o valor de CS permanece o mesmo, mas o valor de IP mudará. Isso também é
chamado de salto intra-segmento (dentro do segmento).
ii) A localização do salto pode estar em um segmento de código diferente – então é chamado de salto
distante . Nesse caso, tanto CS quanto IP terão que assumir novos valores. Este é um salto entre
segmentos (entre segmentos).
iv) O salto pode ser para trás ou para frente na sequência do programa.
MOV.........
ADICIONAR,-------
JMP NOVAMENTE
................
--------------
--------------
NOVAMENTE: ................
v) O salto pode ser incondicional. Então o formato da instrução de salto é rótulo JMP,
onde rótulo é o endereço do destino.
vi) Além dos saltos incondicionais, existem vários saltos condicionais disponíveis. As condições
são baseadas no estado das bandeiras que são afetadas por instruções aritméticas ou lógicas.
Uma diretiva SHORT pode ser usada se tivermos certeza de que nosso destino de salto está dentro do
intervalo especificado acima. Esta instrução tem dois bytes de comprimento – um byte para o opcode e um
byte para o off set de destino. Agora vamos ver um cálculo de endereço para uma instrução de salto curto.
Exemplo 3.8
0000 B4 01 COMEÇAR: MOV AH, 01
0002 CD 21 INT 21H
0004 8A D0 MOV DL, AL
0006 EB 07 JMP CURTA AÍ
--------------------------------------------
-------------, instruções ignoradas> ---------
--------------------------------------------
000F 80 C2 02 LÁ: ADICIONAR DL, 02
0012 B4 02 MOV AH, 02
0014 CD 21 INT 21H
0016 EB E8 JMP CURTO INÍCIO
Machine Translated by Google
O Exemplo 3.8 mostra como as instruções de salto 'curto' passam o controle de uma parte do programa
para outra.
Veja a linha acima que é retirada do arquivo de lista do programa correspondente. Mostra o endereço
(0006) no qual esta instrução está armazenada. O opcode desta instrução JUMP direta é EB e o
'deslocamento' é 07.
Durante o tempo em que esta instrução é decodificada, o valor de IP é 0008 (endereço da próxima
instrução). No início da primeira passagem, o montador reserva um byte de espaço na memória para o
endereço de THERE. O montador sabe que apenas um byte é necessário para THERE, por causa da
diretiva SHORT. Caso contrário, teria reservado dois bytes de espaço, como para um quase salto geral.
Se o endereço da próxima instrução (0008) for adicionado ao deslocamento estendido de sinal (0007) da
instrução de salto (esse deslocamento é calculado pelo montador), o endereço de THERE está na
localização 0008H + 0007H = 000FH. Assim, controle as ramificações para o local 000FH.
Agora, veja a outra instrução de salto direto no programa
0016 EB E8 JMP CURTO INÍCIO
O opcode é EB e o deslocamento é E8. JMP BEGIN é visto como um salto para trás, pois BEGIN é um
rótulo que aparece muito antes desta linha de instrução. O montador calcula esse deslocamento (que é
negativo) e então adiciona esse deslocamento ao valor de IP naquele ponto da sequência de instruções.
Então salta para o destino BEGIN. Neste caso o deslocamento negativo é E8H. Quando JMP SHORT
BEGIN for executado, o conteúdo do IP será 0018H.
Para saltar para BEGIN, o cálculo do endereço é 0018 + FFE8 = 0000, que é o endereço da instrução com
o rótulo BEGIN. Observe que o número negativo E8H, quando usado em cálculos de 16 bits, deve
ter sinal estendido. Portanto, E8H é FFE8H na forma estendida de sinal de 16 bits.
Agora vamos escrever e executar um programa divertido usando uma instrução de salto incondicional.
O Exemplo 3.9a é um programa simples chamado UPLOW que usa interrupções do DOS para inserir um
caractere de um teclado. Se esse caractere for um alfabeto maiúsculo, ele o converterá em letras minúsculas.
A tabela de caracteres ASCII mostra que um caractere minúsculo pode ser obtido adicionando 20H ao
código maiúsculo, ou seja, o ASCII de 'A' é 41H e o de 'a' é 61H, e assim por diante.
Exemplo 3.9a
.MODELO PEQUENO
.CÓDIGO
.COMECE
COMEÇAR: MOV AH, 01H ;AH = 01
INT 21H ;digite uma chave
ADICIONAR AL, 20H ;adicione 20H a
MOV DL, AL ele ;mova a soma para DL
MOV AH, 02 ;AH = 02
INT 21H ;use esta função para exibir
MOV DL, 0AH ;0AH é o ASCII para nova linha
MOV AH, 02H ;exibe uma nova linha
INT 21H
JMP INÍCIO ;vai começar a repetir
.SAÍDA
FIM
Machine Translated by Google
Exemplo 3.9b
C:\masm6.14\BIN>UPLOW
Aa
Bb
CC
Dd
Eh
Ff
Gg
Hh
^C
C:\masm6.14\BIN>
INT 21H com número de função 01 é usado para inserir uma chave. Então 20H é adicionado ao valor ASCII da
chave, e isso é exibido na mesma linha. Para obter mais exibições em linhas separadas, o caractere ASCII 0AH
é exibido. Lembre-se que 0AH corresponde a 'nova linha'. A instrução JMP START é usada para repetir toda
esta sequência indefinidamente. Como não há condição de parada para este loop, temos que usar a combinação
'ctrl c' do teclado para encerrar o programa. A saída exibida é mostrada no Exemplo 3.9b. Observe que, para
qualquer entrada de chave que não seja um caractere maiúsculo, a saída é algum caractere aleatório.
JMP [SI] ;pula para o endereço que está armazenado na posição de memória
apontada pelo SI
Se SI = 0670H, o endereço de destino é obtido do segmento de dados nas localizações 0670H e 0671H. O IP
é substituído pelo valor nesses endereços.
A Tabela 3.3 contém os saltos usados para dados não assinados e aqueles que testam diretamente os sinalizadores e registradores.
Observação
i) Certos mnemônicos são equivalentes – por exemplo, JZ e JE significam o mesmo, pois testam as mesmas bandeiras. Então,
faça JC e JB, JP e JPE e assim por diante. Mais podem ser identificados na lista.
ii) JCXZ testa o registrador CX, mas outras instruções de salto testam apenas sinalizadores condicionais.
iii) Há outro conjunto de instruções de salto condicional que são especialmente destinadas à aritmética sinalizada. A lista
dessas instruções e seu uso serão tratados no Capítulo 4.
Usaremos alguns dos saltos condicionais nos próximos exemplos.
Um salto distante é um salto entre segmentos, o que significa que o endereço de destino está em um segmento de código diferente.
Esta será uma instrução de 5 bytes, sendo o primeiro byte o opcode, o segundo e
Tabela 3.3 | Lista de instruções de salto condicional que atendem à aritmética não assinada e que endereçam
diretamente sinalizadores ou registradores
3 JB Saltar se Abaixo FC = 1
5 JC Saltar se Carregar FC = 1
16 JP Saltar se Paridade PF = 1
terceiro, o novo valor de IP, e o quarto e quinto, os novos valores de CS. Para especificar que um salto é para
um segmento de código diferente, um ponteiro distante pode ser usado no formato.
JMP FAR PTR AGAIN ;PTR significa 'ponteiro'
Definir um endereço como externo e, em seguida, usar um salto para esse endereço também é possível. Essas
ideias serão discutidas no Capítulo 5.
Inicialmente o CX é carregado com um número, que chamamos de 'count'. Veja a sequência do programa acima.
O que deve ser entendido aqui é que, a sequência de instruções até a linha que contém a instrução LOOP, será
executada uma vez. Então, quando a instrução LOOP é encontrada, CX é decrementado e então testado. Se
CX for igual a zero, o loop é encerrado e a próxima instrução na sequência é retomada. Se CX! = 0, o controle
retorna ao rótulo MAIS.
LOOP pode ser combinado com outras condições, para torná-lo uma instrução condicional.
LOOPNE / LOOPNZ e LOOPE / LOOPZ podem ser usados. Essas instruções testam a bandeira zero, bem como
o valor de CX. Os exemplos 3.10aeb mostram o uso de uma instrução LOOP incondicional. Neste programa,
três arrays foram declarados no segmento de dados. Bytes correspondentes das duas primeiras matrizes devem
ser adicionados e a soma deve ser salva na terceira matriz.
Para apontar para os itens de dados nas três matrizes, três registradores são usados. Os dados são acessados
usando o endereçamento indireto do registrador. Após uma rodada dessas ações, os registradores de ponteiro
são incrementados usando a instrução INC. Esta instrução adiciona 1 aos registradores. Esta sequência de
operações é repetida seis vezes usando a instrução LOOP. Uma vez que CX = 0, o loop é encerrado e o
programa termina.
Exemplo 3.10a
.MODELO PEQUENO
.DADOS
NUMS1 banco de dados 45H, 67H, 89H, 65H, 34H, 23H
NUMS2 banco de dados 09, 09, 12H, 13H, 08, 02
NUMS3 banco de dados 6 DUP(0)
Machine Translated by Google
.CÓDIGO
.COMECE
LEA BX, NUMS1 ;use BX para apontar para NUMS1
LEA SI, NUMS2 ;use SI para apontar para NUMS2
LEA DI, NUMS3 ;use DI para apontar para nUMS3
MOV CX, 06 ;CX = 6
REPEA: MOV AL, [BX] ;leva os dados AL do array NUMS1
ADICIONAR AL, [SIM] ;adiciona a AL os dados no array NUMS2 ;salva a
MOV [DI], AL soma no terceiro array
INC BX ;ponteiro de incremento
INC SIM ;ponteiro de incremento
INC DE ;ponteiro de incremento
LOOP REPEA ;repete a sequência até CX = 0
.SAÍDA
FIM
Este problema pode ser resolvido com um número menor de registradores de endereço se o 'modo de registro
relativo' de endereçamento for usado. Veja o Exemplo 3.10b. Aqui apenas o registrador BX é usado. Seu conteúdo
é adicionado a diferentes endereços para acessar os três diferentes arrays.
Exemplo 3.10b
.MODELO PEQUENO
.DADOS
NUMS1 DB 45H, 67H, 89H, 65H, 34H, 23H
NUMS2 DB 09, 09, 12H, 13H, 08, 02
NUMS3 DB 6 DUP(0)
.CÓDIGO
.COMECE
MOV CX, 6
MOV BX, 0
REPEA: MOV AL, NUMS1[BX] ;aponta para o primeiro array
ADD AL, NUMS2[BX] ;adiciona os números do segundo array
MOV NUMS3[BX], AL ;salva no terceiro array
INC BX
LOOP REPEA ;repete até CX = 0
.SAÍDA
FIM
Agora, vamos divagar na discussão das instruções aritméticas, mas você pode ver que as instruções
de desvio em várias formas continuarão a ser usadas.
Observação
i) Na lista, dest significa destino e src significa origem. Após uma operação, o resultado fica disponível no destino.
ii) Como mencionado anteriormente, o destino e a origem podem ser ambos registradores ou um local de memória e um registrador. A fonte pode ser
dados imediatos, a menos que seja explicitamente mencionado (para certas instruções) que o modo imediato de endereçamento não é permitido.
iii) As bandeiras são afetadas pela maioria das instruções aritméticas. Em certos casos, todas as bandeiras são afetadas, mas algumas são indefinidas.
A notação --- para as bandeiras correspondentes é usada em tais casos significando 'indefinido' (na tabela).
iv) Em alguns casos, as bandeiras não são afetadas. Isso é especificado por 'nenhum'.
Existem certas instruções que podem ser usadas para definir/redefinir sinalizadores. Isso é muito relevante no caso de
sinalizadores de controle como sinalizador de direção, sinalizador de interrupção e assim por diante. No entanto, existe uma condição
Machine Translated by Google
fl ag que pode ser definido/reiniciado usando instruções, e esse é o carry fl ag. As instruções relevantes para isso
são:
Agora, veremos o formato e o uso de algumas das funções aritméticas importantes e comumente usadas.
instruções.
INC – Incremento.
Uso: destino INC.
Esta instrução adiciona 1 ao destino. Todas as bandeiras condicionais, exceto a bandeira de transporte, são
afetadas.
A diretiva PTR
Este é um ponto conveniente para introduzir a diretiva PTR (ponteiro). Quando o tamanho do oper não está
implícito na instrução, um ponteiro é usado para indicar se o operando é um byte, uma palavra ou uma palavra
dupla. Por exemplo, veja a instrução.
INC [BX]
Machine Translated by Google
Aqui, BX é um ponteiro para um local cujo conteúdo deve ser incrementado. Não está claro se os dados apontados
são um byte, uma palavra ou uma palavra dupla. Para deixar claro, será útil modificar a instrução como:
Exemplo 3.11
O seguinte é um programa que adiciona dois bytes armazenados na memória. A soma dos bytes provavelmente será
maior que FFH. Portanto, um espaço de palavras precisa ser alocado para a soma.
.MODELO PEQUENO
.DADOS
NUMS DB 95H, 0FCH ;armazena os dois bytes
SOMA DW ? ;atribui um espaço de palavras para a soma
.CÓDIGO
.COMECE
MOV AX, 0 ;AX = 0
CLC ;limpa a bandeira de transporte
MOV AL, NÚMEROS ;move o primeiro número para AL
ADD AL, NUMS + 1 ;adiciona o segundo número a AL
ADC AH, 0 ;adiciona AH e CF e 0 ;a soma em AX é movida para a
MOV SOMA, AX memória
.SAÍDA
FIM
O primeiro AX é carregado com 0. Observe como uma adição de byte faz com que um resultado seja uma palavra. A
soma de dois bytes que são adicionados a AL é muito grande para caber em AL. Por isso, gera um carry. A próxima
instrução adiciona CF, 0 e AH que contém um 0. Assim, descobrimos que o bit de transporte está acomodado em AH.
Assim, AH-AL ou seja, AX contém a soma que é uma palavra.
O Exemplo 3.12 adiciona 10 bytes armazenados na memória. A soma desses dez bytes não caberá em um local
de byte. Assim, uma localização de palavra é alocada para a soma. Deve-se notar também que a soma se encaixará
definitivamente em um local de palavra. [Se houver dez bytes, o número máximo possível para a soma de dez bytes é
apenas 255 × 10 = 2550, que é menor que 65.536 o número decimal máximo que uma palavra pode conter.]
Exemplo 3.12
.MODELO PEQUENO
.DADOS
NUMS DB 245, 178, 190, 167, 56, 178, 250, 89, 150, 235
SOMA DW 0
.CÓDIGO
.COMECE
CLC ;limpa a bandeira de transporte
Machine Translated by Google
O acima é um programa simples que fornece muitas informações. Por um lado, observe que os dados são
escritos na forma decimal e não como bytes hexadecimais. No entanto, se o arquivo de listagem for verificado,
ele mostrará que os dados são convertidos para o formato hexadecimal (na parte do código de máquina da
listagem). O programa usa a instrução LOOP para realizar a adição cumulativa. CX é usado como um
contador, que diminui a cada adição. A primeira instrução ADD adiciona dois bytes.
É possível que um carry seja gerado a partir dessa adição. Este carry é adicionado a AH, cujo outro operando
é 0. Assim, a soma dos carrys das dez operações de adição estará em AH, que formará o byte superior da
soma. Esta soma está assim disponível como uma palavra no AX que é salva na localização da palavra SUM.
É importante limpar o carry fl ag antes de usar a instrução ADC, para evitar a possibilidade de qualquer carry
residual levar a um resultado errado.
O Exemplo 3.13 é um programa interessante que adiciona duas palavras duplas. Uma palavra dupla é
duas palavras de comprimento, ou seja, 4 bytes de comprimento.
Exemplo 3.13
.MODELO PEQUENO
.DADOS
LONGNUM1 DD 0F8FC6768H ;dados da primeira palavra dupla
LONGNUM2 DD 0C6EF2109H ;segundo dados de palavra dupla
SOMA DD 0 ;soma
SUMC DB 0 ;espaço para realizar
.CÓDIGO
.COMECE
LEA SI, LONGNUM1 ;SI como ponteiro para o primeiro operando
LEA OF, LONGNUM2 ;DI como ponteiro para o segundo operando
LEA BX, SOMA ;DX como ponteiro para a soma
CLC ;limpar porte
MOV CX, 2 ;CX para contar o número de palavras
REPEA: MOV AX, [SIM] ;mover para AX a primeira palavra
ADC AX, [DI] ;adiciona o segundo operando e carrega
MOV[BX], AX ;a palavra inferior do resultado armazenada
INC SIM ;incrementa SI duas vezes para apontar para
INC SIM ;próxima palavra operando
INC DE ;incrementa DI duas vezes para apontar para
INC DE ;segundo operando de palavra
INC BX ;incrementa BX duas vezes para apontar para
Machine Translated by Google
FIM
Há uma série de recursos notáveis para este programa. Vamos listar essas características.
i) As palavras duplas são armazenadas em dois locais DD denominados LONGNUM1 e LONGNUM2.
Eles serão armazenados no formato little endian.
ii) A soma de duas palavras duplas pode ser mais do que uma palavra dupla. Isso pode ser acomodado como um
carry, adicionado a um registrador e pode ser armazenado na memória como o byte mais alto da soma. Três
registradores são usados como ponteiros para cada palavra dupla. No entanto, a adição pode ser feita apenas
como palavras, pois o tamanho máximo de um operando é de apenas 16 bits (chamado de palavra), para o 8086.
Assim, primeiro as palavras de ordem inferior das duas palavras duplas são adicionadas. Existe a possibilidade
de um carry devido a esta adição, que pode ter que ser adicionada à palavra superior.
Como a adição é em loop, a instrução ADC é usada para acomodar a adição do transporte.
iii) Os ponteiros de endereço devem ser incrementados em 2 para apontar para a palavra superior da palavra dupla. A
instrução INC é preferível à instrução ADD, pois não afeta o carry fl ag. É importante preservar o carry fora
da operação da segunda palavra. Este transporte final é adicionado a DL (que é primeiro assegurado ser 0). Os
números aqui utilizados são duas palavras duplas cuja soma é uma palavra dupla, mais um byte (01 BFEB 8871H).
000C 01 SUMC
000B BF
000A EB
SOMA
0009 88
0008 71
0007 C6
0006 E SE
LONGNUM 2
0005 21
0004 09
0003 F8
0002 FC
LONGNUM1
0001 67
0000 68
Machine Translated by Google
iv) As localizações de memória e os dados correspondentes, após a execução do programa é como mostrado
(assumindo que a origem do segmento de dados é 0000).
v) Os três arrays na memória podem ser acessados usando 'registrar endereçamento relativo' como no
Exemplo 3.10b. Tente ver se dá alguma vantagem em termos de redução do número de instruções/
registros utilizados.
3.4.3 | Subtração
SUB – Subtrair.
Uso: SUB destino, origem.
Esta instrução subtrai a origem do destino. O resultado está no destino. Todos os sinalizadores
condicionais são afetados.
SUB AX, BX ;subtrai BX de AX
SUB AL, [BX] ;subtrai o byte apontado por BX de AL
SOB CUSTO[SI], CX ;subtrai CX da palavra com
EA = CUSTO + SI
SUB EIXO, 8956H ;subtrai 8596H de AX
SUB CL, BYTE PTR[SI] ;subtrai de CL o byte apontado por SI
SBB – Subtrair com empréstimo.
Uso: destino SBB, origem.
Esta instrução subtrai a fonte e o carry fl ag do destino. Todos os sinalizadores condicionais são afetados.
DEC CL ;subtrai 1 de CL
DEC WORD PTR [SI] ;subtrai 1 da palavra apontada por SI
DEC BYTE PTR NUMB[BX] ;subtrai 1 do byte apontado pelo endereço efetivo
NUMB + BX
Exemplo 13.14
Explique o que ocorre na execução das seguintes instruções:
MOV CL, 0B5H
SUB CL, 0FCH
Solução
Isso é uma subtração de um número maior de um número menor. Assim, o carry fl ag é definido para
indicar que o empréstimo foi necessário na subtração. A diferença é ÿ71 (decimal), que é representado
como B9H que é a representação em complemento de dois do decimal ÿ71. A bandeira de transporte é
definida para indicar que a subtração usou um 'empréstimo'. O sinal sinalizador é definido para indicar
que o MSB do resultado é 1, que neste caso é interpretado como um número negativo.
Agora vamos usar a instrução SUB em um exemplo interessante. A divisão é uma operação que
pode ser obtida por subtração repetida. Muitos dos primeiros microprocessadores (8085, por exemplo)
não tinham instrução de divisão. O 8086, possui uma instrução de divisão. No entanto, aqui, vamos
usar a subtração repetida para dividir, digamos, 100 por 9. Sabemos que o quociente é 11 (0BH) e o
resto é 1.
Exemplo 3.15
.MODELO PEQUENO
.DADOS
QUOCIENTE DB 0
RESTANTE DB 0
.CÓDIGO
.COMECE
MOV AL, 100 ;copiar dividendo para AL
MOV CL, 0 ;CL, o registrador de quociente = 0
REPETIR: SUB AL, 9 ;subtrai 9 de 100
JC ACIMA ;para quando CF = 1
INC CL ;incrementa CL se CF não estiver definido
JMP RAPEA ;repete a subtração se CF não estiver definido
SOBRE: ADD AL, 9 ;adiciona 9 a AL para obter o resto
MOV REMAINDER, AL ;armazena o restante
MOV QUOTIENT, CL ;armazenar quociente
.SAÍDA
FIM
Se FC ZF
destino > origem 0 0
destino < origem 1 0
destino = origem 0 1
Vimos até agora operações de adição e subtração usando números no formato hexadecimal (essencialmente
binário). No entanto, os números também são representados em outros formatos, como BCD e ASCII. Existem
instruções especiais como DAA e DAS que atendem a números BCD e instruções como AAA, AAS que atendem
a operações ASCII. Na Seção 4.4.2, essas instruções serão usadas em cálculos aritméticos usando tais números.
Se dois números sem sinal forem comparados, ficará mais claro se usarmos JA/JB como o mnemônico seguindo
a instrução de comparação, em vez de JC ou JNC. Isso facilitará a compreensão do significado do resultado da
comparação. Se quisermos comparar AX e BX, podemos pensar nisso como: Saltar para o alvo se AX estiver
acima de BX. As instruções de uso são:
CMP AX. BX
E Alvo
Da mesma forma, ao testar a igualdade, poderíamos usar JE/JNE em vez de JZ/JNZ.
Nota Estas dicas são apenas para melhorar a legibilidade do programa. Agora, vamos escrever alguns programas
ilustrando o uso da instrução de comparação.
Exemplo 3.16
Duas palavras sem sinal são armazenadas no segmento de dados nos locais WORD1 e WORD2. O programa
compara os dois números e exibe uma mensagem informando qual número é maior.
.MODELO PEQUENO
.DADOS
PALAVRA1 DW ------- ;armazena o primeiro número
WORD2 DW ------- ;armazena o segundo número
MES1 DB “WORD1 IS MAIOR$” ;primeira string de mensagem
MES2 DB “WORD2 É MAIOR$” ;segunda cadeia de mensagens
Machine Translated by Google
.CÓDIGO
.COMECE
EIXO DE MOVIMENTO, PALAVRA1 ;copia WORD1 para AX
EIXO CMP, WORD2 ;compara AX com WORD2
JB SEGUNDO ;Se AX < PALAVRA2, vai para SEGUNDO
LEA DX, MES1 ;aponta DX para MES1
JMP DISP ;pular para DISP
SEGUNDO: LEA DX, MES2 ;aponta DX para MES2
DISP: MOV AH, 09 ;AH = 09 para exibição de string
INT 21H ;A função DOS INT21H é chamada
.SAÍDA
FIM
Este é um programa muito simples no qual o WORD1 é trazido para o AX. É então comparado com WORD2.
A instrução jump (JB) após a comparação direciona o controle para a mensagem apropriada. Lembre-se de
que a chamada de função do DOS com AH = 09 exibirá uma string no console.
Nota Para executar este programa, os dados reais terão que ser escritos no segmento de dados nos locais
WORD1 e WORD2.
O Exemplo 3.17 encontra o maior de 10 bytes armazenados na memória.
Exemplo 3.17
.MODELO PEQUENO
.DADOS
NUMS DB 56H, 38H, 09H, 98H, 99H, 0C7H, 07H, 0BCH, 0CH, 0ECH
MAIOR DB? ;armazena o maior número
.CÓDIGO
.COMECE
iii) Inicialmente AL = 0.
iv) AL é comparado com cada número. Se AL não for superior ou igual ao número na matriz, o número maior
é trazido para AL.
v) Se AL estiver acima do número na matriz, o conteúdo de AL é mantido como está.
vi) Esta é uma rodada de comparação. Então o ponteiro (BX) é incrementado e conta (CL)
é decrementado.
vii) Quando a contagem chega a zero, ZF é definido e o loop é encerrado devido ao uso do mnemônico JNZ.
viii) O maior número está agora no AL que fica armazenado na memória no espaço que lhe é atribuído.
O Exemplo 3.18 é outro programa interessante, que procura em uma cadeia de caracteres a presença de
um determinado caractere e exibe as mensagens apropriadas.
Exemplo 3.18
.MODELO PEQUENO
.DADOS
STRIN DB “HOWAREYOUMYBOY” ;cadeia de caracteres
LEN DW 0EH
MESG1 DB 0AH, 0DH, “CHARACTER ENCONTRADO$”
MESG2 DB 0AH, 0DH, “CARACTER NÃO ENCONTRADO$”
.CÓDIGO
.COMECE
LEA BX, STRIN ;BX para apontar para a string
MOV CX, LEN ;copia o comprimento da string para CX
Uma cadeia de caracteres é armazenada no local rotulado STRIN. O comprimento desta string é especificado
em um local de palavra chamado LEN. O caractere cuja presença (ou ausência) queremos verificar é digitado
através do teclado usando a chamada de função DOS com AH = 01. Este caractere é comparado com cada
um dos caracteres da string. Uma vez que a igualdade é encontrada, o loop de comparação
Machine Translated by Google
é encerrado e MES1 é exibido. Caso contrário, MES2 é exibido, após a comparação de todos os caracteres do
array. Observe que ambas as mensagens (MESG1 e MESG2) são precedidas pelos caracteres de nova linha
(0AH) e retorno de carro (0DH). Isso é para garantir que a exibição seja obtida em uma linha diferente, após o
caractere de entrada (o que é digitado pelo teclado) ser ecoado na tela.
i) Byte a byte
Neste, um dos operandos deve estar no registrador AL, e a fonte pode ser um byte em um registrador ou local de
memória. O produto (uma palavra) estará em AX.
MUL BL ;multiplicar BL por AL – produto em AX
MUL BYTE PTR[SI] ;multiplica o byte apontado por SI, por AL – produto em AX
MUITO GRANDE ;multiplicar o conteúdo de BIG por AL – produto em AX
Neste, um dos operandos deve estar no registrador AX, e a fonte pode ser uma palavra em um registrador ou
local de memória. O produto será em DX e AX, com a palavra superior em DX.
MUL CX ;multiplica CX por AX – produto em DX e AX
MUL WORD PTR [AT] ;multiplicar a palavra apontada por DI por AX – produto em DX e AX
Este é apenas um caso especial da multiplicação palavra × palavra. O byte deve ser estendido para ser uma
palavra fazendo com que o byte superior seja 0. Se o byte estiver em AL, estenda-o para ser uma palavra fazendo
com que o conteúdo de AH seja zero. Assim, AX agora contém um dos operandos.
Bandeiras afetadas
Para a instrução de multiplicação, todos os sinalizadores condicionais são afetados, mas apenas os sinalizadores
carry (CF) e overflow (OF) têm algum significado. Eles serão definidos ou redefinidos de acordo com o tamanho
do produto. Lembre-se de que uma multiplicação byte × byte pode produzir um resultado de tamanho de palavra.
No entanto, se os operandos forem pequenos, o produto em si é apenas um byte e precisa apenas do registrador
AL para o produto. Nesse caso, as bandeiras de carry e overflow são encontradas limpas, mas se o produto ocupa
um tamanho de palavra, ambas as bandeiras são definidas (CF = 1, OF = 1). Este conceito pode ser estendido
para a palavra × multiplicação de palavras também. Podemos resumir que se o produto tiver um tamanho igual ao
tamanho dos operandos, ambos os flags são resetados. ou seja, CF = 0, OF = 0. No entanto, se o produto for
grande o suficiente para ocupar os registradores atribuídos a ele, essas bandeiras são definidas, ou seja, CF = 1, ZF = 1.
Veja esta multiplicação:
MOV AL 78H
MOV CL, 0F9H
MUL CL
Machine Translated by Google
Este segmento de programa fará com que o produto seja 74B8H. Assim, o resultado da multiplicação é
AX = 74B8H, CF = 1 e OF = 1.
No entanto, se o segmento do programa
for MOV AL, 13H
MOV CL, 09H
MUL CL
O resultado é AX = 00ABH, CF = 0 e OF = 0.
No exemplo 3.19, dois bytes armazenados no segmento de dados são multiplicados. O resultado da
multiplicação está disponível no AX, que é então movido para a localização PROD, uma localização da palavra.
Exemplo 3.19
.MODELO PEQUENO
.DADOS
MULT DB 0AH ;multiplicador
MULP DB 0F6H ;multiplicando
PRODW? ;espaço alocado para o produto
.CÓDIGO
.COMECE
MOV AL, MULP ;move o multiplicando para AL
MUITÍSSIMO ;multiplica com o multiplicando
MOV PROD, ;produto movido do AX para a memória
AX .EXIT
FIM
Agora, vamos usar a instrução multiplicar em uma aplicação mais complexa. O Exemplo 3.20 é um
programa para encontrar o fatorial de um número N. Para 8086, o tamanho máximo de um
operando para multiplicação é apenas uma palavra. Isso coloca uma limitação no valor de N que
pode ser usado. Pode-se verificar que N deve ser menor que 9, para que o programa dê o resultado
correto. Neste programa, o valor de N deve ser digitado pelo teclado, lembrando que N deve ser menor que 9.
Como qualquer valor digitado pelo teclado está no formato ASCII, 30H é subtraído dele, para obter o valor
binário de N a ser usado no cálculo.
Exemplo 3.20
.MODELO PEQUENO
.DADOS
FACT DW 0 ;espaço alocado para o fatorial
.CÓDIGO
.COMECE
MOV AH, 01
INT 21H ;digite N no teclado
SUB AL, 30H ;converte ASCII para binário
MOV AH, 0 ;converte N em AL para uma palavra em AX
MOV BX, AX ;mover para BX
MOV EIXO, 1 ;AX = 1, para iniciar a iteração
CMP BX, 0 ;compara BX (= N) com 0
Machine Translated by Google
FIM
Aqui, o dividendo deve ser uma palavra colocada em AX e a fonte deve ser um byte. O resultado da divisão
faz com que AL contenha o quociente e AH contenha o resto.
DIV BL ;divide AX pelo byte em BL ;divide
DIV BYTE PTR [BX] a palavra em AX pelo byte apontado por BX
DIVIRTA-SE ;divide a palavra em AX pelo byte em DIG
Veja esta divisão
Este segmento de programa fará com que AH (restante) = 0CH e AL (quociente) = CCH.
Este é apenas um caso especial de uma divisão de uma palavra por um byte. Nesse caso, converta o byte do
dividendo em uma palavra carregando o dividendo em AL e 0 em AH. Assim, AX será a palavra que funcionará
como dividendo.
Neste caso, o dividendo deve estar em AX e DX (a palavra superior em DX). O divisor deve ser uma
palavra. O resultado dessa divisão faz com que o quociente fique em AX e o restante em DX.
Machine Translated by Google
Semelhante ao caso anterior, se quisermos uma divisão palavra por palavra, estenda a palavra em AX para
ser uma palavra dupla carregando 0 em DX para obter o dividendo como uma palavra dupla em AX e DX.
Dividir por Zero Erro.
Para divisão, se o divisor for zero, o quociente fica indefinido. Ao tentar tal divisão, o 8086 sairá deste
programa e gerará uma interrupção. Esse estado é dito ser um 'erro de divisão por zero'. Uma interrupção
gerada por um erro é chamada de exceção. No entanto, a divisão por zero não é a única condição para
causar tal erro. Se o registrador de quociente for muito pequeno para acomodar o quociente, isso também
acontecerá. Por exemplo, se o dividendo for um número grande e o divisor for muito pequeno, tal condição
é possível.
MOV AX, 09876H
MOV CL, 25H
DIV CL
O segmento de programa acima dará um quociente de 41EH, que obviamente não pode ser acomodado
em AL. Quando tal erro ocorre, a execução do programa é abortada e o montador exibe a mensagem
'divide overflow error'. Se esse problema tivesse sido previsto, a solução seria converter o dividendo em
uma palavra dupla e o divisor em uma palavra. Então o quociente estará em AX, que será grande o
suficiente para isso.
Exemplo 3.21
.MODELO PEQUENO
.DADOS
PRIMEIRO DB 89H
SEGUNDO DB 0CAH
AVG DB?
.CÓDIGO
.COMECE
MOV AL, FIRST ;copia FIRST para AL
MOV AH, 0 ;extensão zero MOV BL,
SECOND ;copia SECOND para BL
MOV BH, 0 ;extensão zero
ADD AX, BX ;adiciona as palavras estendidas zero
MOV CL, 02 ;carrega divisor para CL
DIV CL ;divide AX por CL
MOV AVG, AL ;salvar quociente para AVG
.SAÍDA
FIM
O Exemplo 3.21 fornece um programa completo para encontrar a média de dois bytes armazenados em
locais de memória rotulados FIRST e SECOND. Estes são copiados para os registradores AL e BL e
estendidos a zero para convertê-los em palavras. A adição dos números é então feita como palavras.
Essa soma, que é o dividendo, está no registro AX. O divisor 2 é copiado para o registrador CL. Depois
Machine Translated by Google
divisão, o quociente está disponível em AL e o restante em AH. Para este problema, apenas o quociente é
importante, e isso é salvo no local AVG.
Agora, veremos uma aplicação muito útil e interessante da operação de divisão. Este programa
converte um número hexadecimal de 16 bits para decimal e exibe o número decimal no console após
convertê-lo para o formato ASCII. Para ver a lógica deste programa, tomemos um número, digamos, 246.
i) Divida isso por 10 para obter um quociente de 24 e um resto de 6. Empurre o resto para
a pilha.
ii) Em seguida, divida o quociente novamente por 10 para obter 2 como quociente e 4 como resto. Empurre isso
restante também para a pilha.
iii) Mais uma divisão faz com que o quociente seja zero. Esta é a condição de parada no
laço de divisão.
iv) O número de operações de divisão realizadas é contado juntamente com todas essas etapas.
Agora, retire os restos da pilha. Isso será na ordem inversa das operações de push. Assim, 2
serão exibidos primeiro e 6 por último. Isso pode ser exibido nesta ordem.
v) Para visualização, cada dígito deve ser convertido para seu ASCII correspondente. Isso é feito
adicionando 30H a cada dígito.
Agora, examine o Exemplo 3.22. O programa converte qualquer número hexadecimal de 16 bits em
decimal e o exibe. Aqui, o número hexadecimal é colocado no segmento de dados. Observe que a
divisão aqui é realizada como uma divisão dupla palavra por palavra .
Exemplo 3.22
.MODELO PEQUENO
.DADOS
NUM DW 0CEF6H ;o número hexadecimal
CONT. DB 0 ;conta o número de divisões feitas
.CÓDIGO
.COMECE
Exemplo 3.23
Encontre o resultado e o estado das bandeiras CF, ZF e OF seguindo as instruções a seguir.
Dado AX = 008CH, BX = 345EH, CX = 67EBH
i) E BL, CL
ii) OU AH, BH
iii) XOR AL, CH
iv) TESTE AH, BL
Solução
i) E BL, AL
BL = 5EH 0101 1110
CL = EBH 1110 1011
4AH 0100 1010
Exemplo 3.23
Encontre o resultado e o estado das bandeiras CF, ZF e OF seguindo as instruções a seguir.
Dado AX = 008CH, BX = 345EH, CX = 67EBH
i) E BL, CL
ii) OU AH, BH
iii) XOR AL, CH
iv) TESTE AH, BL
Solução
i) E BL, AL
BL = 5EH 0101 1110
CL = EBH 1110 1011
4AH 0100 1010
Isso dá AL = 08H no registrador AL. O nibble superior de 78H foi mascarado. Como outro exemplo,
veja abaixo onde os dados de 16 bits são ANDed com 0FFFFH, de modo a mascarar os 4 bits superiores.
Este é um caso particular quando apenas 12 bits desses dados são necessários.
Aplicações Típicas de Instruções Lógicas Agora, vamos usar essas instruções lógicas em algumas
aplicações simples.
E Para converter um número ASCII em um número binário, mascare o número com 0FH.
MOV AH, 01 ;insere o número pelo teclado
INT 21H
E AL, 0FH ;mascarar a mordida superior
OR Para converter um número binário de 8 bits (de 0 a 9) para ASCII, OR com 30H.
MOV AL, 9 ;AL = 09
OU AL, 30H ;AL = 39H
Th é testa se o bit D0 de BL é 1 ou não. Se o bit em teste for resetado, a operação AND correspondente
às operações TEST faz com que ZF seja ajustado (ZF = 1).
TESTE CX, 8000H
Isso testa se D15 de CX está definido ou não. O resultado disso é que ZF = 0 como D15 = 1.
Machine Translated by Google
3.6.1 | Mudança
iii) O deslocamento aritmético é usado para operações de números com sinal, enquanto o deslocamento lógico atende a operações sem sinal.
números.
iv) Deslocar para a direita causa uma divisão por 2, para cada posição de bit deslocada, enquanto deslocar para a esquerda corresponde a uma
multiplicação por 2.
v) A contagem significa o número de posições de bit, pelo qual o deslocamento deve ser feito.
vi) Se a contagem >1, carregue-a em CL, caso contrário use '1' no modo imediato.
Esta instrução desloca o destino para a esquerda por bits de 'contagem' e os zeros são deslocados para preencher as posições vagas à direita. A bandeira
Carry contém o último bit deslocado. Porque, '0' é deslocado do lado direito. Deslocamento à esquerda 'lógico' e 'aritmético' executam a mesma
operação e, portanto, o mnemônico SAL ou SHL pode ser usado de forma intercambiável.
C 7 0 0
bits de 'contagem'
Machine Translated by Google
O Exemplo 3.24 mostra um segmento de programa para encontrar o peso da soma módulo-2 de dois números.
A soma do módulo 2 é essencialmente encontrar as posições em que os dois números são diferentes – o que é
uma operação XOR. O peso de um número é o número de 1s nele.
Neste problema, a soma do módulo-2 é encontrada fazendo um XOR dos dois números em AL e BL.
O resultado disto é então deslocado para a esquerda. O bit deslocado estará na bandeira de transporte. Ao
verificar o carry, se for 1, o registrador CH é incrementado. Junto com isso, o registrador CL é decrementado.
CL contém o comprimento do operando. Aqui CL = 8. No final do programa, obtemos o 'peso' da soma módulo-2
de AL e BL em CH. Para os números usados neste programa, CH = 6 é o resultado.
Exemplo 3.24
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AL, 89H MOV ;move o primeiro número para AL
BL, 0F7H XOR AL, ;move o segundo número para BL
BL MOV CL, 8 SHL ;EX-OR os dois números
AL, 1 JNC REPEA ;CL = 8
DE VOLTA: INC CH DEC CL ;muda AL para esquerda uma
JNZ BACK vez ;repete se não houver transporte
;incrementa CH se houver um carry
REPETIR: ;diminuir a contagem
;repete o deslocamento até CL = 0
.SAÍDA
FIM
O 7 0 C
Machine Translated by Google
O Exemplo 3.25 mostra um exemplo de operação de turno. Quando um número decimal é representado como um
nibble binário de 4 bits, e esses nibbles são empacotados em um byte, é chamado de representação BCD
empacotada. Por exemplo, a representação BCD compactada de 56 é 0101 0110. Descompactá-la significa separá-
la como dois bytes 0000 0101 e 0000 0110.
Exemplo 3.25
Converta um byte BCD compactado em dois bytes descompactados.
Solução
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AL, 95H MOV ;copia o byte BCD compactado para AL
BL, AL E AL, 0FH ;copia o mesmo byte para BL
E BL, 0F0H MOV ;mascarar o nibble superior de AL
CL, 04 SHR BL, ;mascarar o nibble inferior do BL
CL .EXIT ;mover uma contagem de 4 para CL
;muda BL para a direita 4 vezes
FIM
Neste problema, um byte BCD compactado está em AL. Deve ser descompactado e colocado em dois registradores.
O operando está em AL. Mantenha uma cópia dele em BL também. Para desembalar, primeiro o nibble superior de
AL é mascarado. Isso dá um byte BCD descompactado. Th é agora em AL. Em seguida, o nibble inferior de BL é
mascarado e o resultado é deslocado para a direita 4 vezes para trazer os dados do nibble superior para a posição
do nibble inferior. Agora, os dois bytes descompactados estão disponíveis em AL e BL.
Nota A operação e o uso prático da instrução SAR serão discutidos na Seção 4.7.4, onde a aritmética de números
assinados é tratada.
Modif es Flags: CF OF
C 7 0
7 0 C
Esta instrução gira os bits no destino para a 'contagem' direita vezes com todos os dados enviados pelo lado direito
reentrando no lado esquerdo. A bandeira Carry conterá o valor do último bit girado para fora.
Modif es Flags: CF OF
ROR AL, 1 ;girar para a direita uma vez o byte em AL
ROR DX, CL ;gira para a direita a palavra em DX a contagem em CL
Exemplo 3.26
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV BX, 5634H
MOV CL, 8
ROL BX, CL
MOV AL, 0C6H
MOV CL, 4
ROR AL, CL
.SAÍDA
FIM
Na primeira instância, existe um registrador BX de 16 bits que contém o valor 5634H. Usando ROL e girando 8
vezes, o valor em BX muda para 3456H. Da mesma forma com AL = C6H, usando ROR com uma contagem de 4,
Al terá o novo valor de 6CH. Assim, podemos alternar nibbles ou bytes de troca usando as instruções de rotação
com a contagem apropriada em CL. Observe que, para esta aplicação, não importa se ROL ou ROR é usado.
É fácil verificar que o Exemplo 3.25 pode ser reescrito substituindo a instrução SHR pela instrução ROL ou
ROR.
Machine Translated by Google
Modif es Flags: CF OF
C 7 0
RCL BL, CL ;girar para a esquerda através do carry, BL, pela contagem em CL
RCL CX, 1 ;girar para a esquerda carrega a palavra em CX uma vez
7 0 C
Esta instrução faz com que o bit mais à direita (MSB) entre no carry fl ag, e o CF entra pela extremidade
esquerda (MSB). Assim, devido a uma operação de deslocamento, o LSB entra no CF e o CF entra na
posição MSB.
Modif es Flags: CF OF
RCR BYTE PTR [SI], 1 ;girar direto pelo carry, o byte apontado por
SI, uma vez
RCR WORD PTR [DI][BX], CL ;girar para a direita carrega a palavra apontada por
EA = SI + BX, pela contagem especificada em CL
Exemplo 3.27
Encontre os valores no destino para cada linha deste segmento de programa.
STC
MOV AX, 5485H
RCR AL, 1
MOV CL, 03
RCL AX, CL
MOV CL, 05
ROR AX, CL
ROL AX, 1
Solução
MOV CL, 03 CL = 03
RCL AX, CL AX = 1010 0110 0001 0101
MOV CL, 05 CL = 5
ROR AX, CL AX = 1010 1101 0011 0000
ROL AX, 1 AX = 0101 1010 0110 0001
| As chamadas de função do BIOS e DOS facilitam o uso de dispositivos de entrada e saída na programação,
tornando-o interativo e mais divertido.
| O conjunto de instruções do 8086 pode ser dividido em grupos com base na funcionalidade.
| LEA é uma instrução que copia o off set de um endereço de memória para um registrador de 16 bits. Isso pode ser usado
para fazer o registrador ser um ponteiro para uma matriz de itens de dados na memória.
| O registrador SS contém os 16 bits superiores do endereço mais baixo (base) no segmento da pilha. SP contém o off set (em
relação ao endereço base) do endereço mais alto na pilha.
| JUMP é uma importante instrução de desvio que pode ser distante ou próxima, incondicional ou condicional.
| LOOP é uma instrução de salto que causa ramificações e também diminui uma contagem em CX. UMA VOLTA
instrução pode ser condicional, também.
| Existem 20 instruções aritméticas para 8086, das quais algumas atendem especificamente a números assinados,
alguns para números BCD e alguns para números ASCII.
| As instruções ADC (Adicionar com transporte) e SBB (Subtrair com empréstimo) encontram uso em multi-byte
adições e subtrações.
| MUL é o mnemônico para multiplicação sem sinal. Para uma multiplicação byte por byte, um operando está implícito em AL e o
produto em AX. Para uma multiplicação palavra por palavra, um operando deve estar em AX e o produto estará em DX-AX.
| DIV é o mnemônico para divisão sem sinal. Para uma divisão palavra por byte, o dividendo deve estar em AX. Após a divisão, o
quociente estará em AL e o restante em AH. Para uma divisão dupla palavra por palavra, o dividendo deve estar em DX-AX.
Então o quociente estará em AX e o restante em DX.
| Se o quociente for muito grande para caber no registrador atribuído a ele, um erro 'dividir por zero' será
gerado.
| A instrução TEST faz o AND lógico, mas apenas os sinalizadores são afetados.
| O deslocamento de um dado pode ser feito para a esquerda ou para a direita, e também por quantas posições forem necessárias.
| O deslocamento aritmético é significativo para números assinados, enquanto o deslocamento lógico pertence aos não assinados.
aritmética.
| A rotação pode ser feita para a esquerda ou para a direita e pode ser direta ou através da bandeira Carry.
Machine Translated by Google
PERGUNTAS
1. Distinguir entre a abordagem de cima para baixo e de baixo para cima na programação.
PRESSIONE BX
POP CX
POP DX
b) EMPURRAR EIXO
PRESSIONE BX
POP DX
POP CX
c) PRESSIONE BX
EMPURRAR MACHADO
POP CX
POP DX
10. Nomeie uma instrução de salto condicional que não testa um sinalizador condicional.
11. Quais são as condições sob as quais uma instrução LOOPZ sai do loop?
12. O que faz a instrução STC?
14. A instrução INC [SI] parece ambígua. Por quê? Como a ambiguidade pode ser corrigida?
15. O que a instrução CMP AX, BX faz?
17. O que acontece se a instrução DIV for usada para um dividendo de 1938H e divisor de 05?
19. Como a multiplicação e a divisão podem ser alcançadas por operações de deslocamento?
20. Qual a diferença entre as instruções RCL e ROL?
EXERCÍCIO
1. Escreva um programa para imprimir em duas linhas separadas, as mensagens 'Oi, pessoal' e 'Eu sou Samantha'.
2. Digite um caractere pelo teclado sem ecoá-lo no monitor de vídeo. Compare-o com um número armazenado na memória e
exiba a mensagem 'EQUAL' ou 'NOT EQUAL' conforme o caso.
Machine Translated by Google
4. Digite 'N' caracteres pelo teclado sem eco. Salve-o na memória como um array. Em seguida, exiba-o como uma sequência de
caracteres.
5. Indique o que está errado (se algo estiver errado) com cada uma dessas instruções. a) MOV CX,DL b)
ADD DATA1, 0978H c) MOV BYTE PTR [SI][BX], DX d) MOV 045FH, AX e) MOV [DX], AL f) MOV [SI]
[CX], AX g) MOV DS, 3453H
6. Escreva um programa que adicione duas palavras quádruplas e armazene o resultado na memória.
7. Escreva um programa que subtraia duas palavras duplas e armazene o resultado na memória.
8. Encontre o status dos sinalizadores CF e ZF após a execução dos seguintes conjuntos de instruções. a) MOV AX, 9078H b)
CMP AX,0C089H c) XOR AL, AL d) MOV AL, 29H e) CMP AL, 0
10. Existem 10 bytes não assinados armazenados na memória. Organize esses bytes em a) ordem
crescente e, b) ordem decrescente.
11. Encontre a média de 20 bytes armazenados na memória. Exiba a média como um número decimal.
15. Encontre o número de vezes que um determinado caractere está presente em uma sequência de caracteres armazenada na memória.
Machine Translated by Google
programação
4 conceitos-iii
| Para distinguir macros de procedimentos e aprender a | Para escrever programas usando as construções de
escrever e usar macros. linguagem de alto nível do MASM.
SI devem atuar como ponteiros para o segmento de dados e segmento extra respectivamente. Isso significa que,
inicialmente, o SI deve conter o endereço (off set) da primeira localização no segmento de dados. Da mesma
forma, DI deve conter o endereço (off set) da primeira localização no segmento extra.
palavras
string de palavras
palavras
palavras
palavras
fl ag estiver definido
Nota Em instruções de string, 'SB' significa 'string byte' e 'SW' para 'string word'.
iii) Existe um sinalizador de controle chamado de sinalizador de direção que é usado exclusivamente para operações de string.
Sua finalidade é que em operações com strings, se o sinalizador estiver setado, os registradores de ponteiro sejam automaticamente
decrementados e se resetado, o inverso ocorra. Portanto, sempre que instruções de string estiverem sendo usadas, o sinalizador de
direção (DF) deve ser definido ou redefinido dependendo da direção em que os endereços devem ser modificados após cada operação.
iv) O contador CX deve ser carregado com a contagem do número de operações necessárias.
feito. O problema em questão é transferir 10 bytes (o caractere '*') de uma área de memória designada como DATA1 para uma área
denominada DATA2.
Assim, a origem deve ser o segmento de dados e o destino, o segmento extra. Como incorporamos o segmento extra?
Se usarmos o modelo de segmento completo, podemos definir dois segmentos – o segmento de dados (DAT) e o segmento extra
definidos, os segmentos são definidos. Em seguida, as instruções do programa fazem com que os dados no
segmento de dados sejam copiados para o segmento extra. O Exemplo 4.1a usa o modelo de segmento completo para isso.
Exemplo 4.1a
QUE SEGMENTO
DAT1 DB 10 DUP('*') ;armazena '*' em 10 locais
QUE FIM
EXTRA SEGMENTO
DAT2 DB 10 DUP(0) ;alocar 10 locais
EXTRA FIM
BACALHAU SEGMENTO
ASSUMA CS:COD, DS:DAT, ES:EXTR
MOV AX, DAT
MOV DS, AX ;inicializar o registro DS
MOV AX, EXTR
MOVE ES, AX ;inicializar o registro ES
No Exemplo 4.1a, dois segmentos DAT e EXTR são definidos e dois registradores de segmento DS e ES são
inicializados. Os endereços SI e DI apontam para os endereços de dados de origem e de destino e DF é limpo
para incrementar automaticamente os registradores de ponteiro.
Agora vamos fazer o mesmo programa usando o modelo simplificado. O modelo pequeno pode ter
apenas um segmento de dados, então como podemos ter um 'segmento extra'? A solução é ter ambas as
áreas de dados no próprio segmento de dados, mas depois que o segmento de dados estiver definido,
copie o valor de DS para ES – isso faz o montador acreditar que o segmento extra está disponível – embora
seja o mesmo que o segmento de dados. Neste exemplo, a área de dados de destino é escolhida para
estar em org 0200H. Isso é feito apenas para espaçar as áreas de dados de origem e destino e não é
obrigatório. Assim, o primeiro pré-requisito de ter os dados e os segmentos extras é satisfeito.
Em seguida, o registrador SI aponta para o endereço DATA1 e o registrador DI para DATA2.
Então o registrador do contador é carregado com 10, a contagem de operações de transferência de dados
necessária. A instrução CLD é utilizada para limpar o sinalizador de direção (DF). Isso faz com que o valor
de SI e DI seja incrementado após cada operação de movimento. Aqui os dados estão na forma de bytes.
Assim, SI e DI são incrementados apenas em um de cada vez. A instrução string usada aqui é MOVSB
(prefixada por REP). Isso faz com que os dados na localização apontada por SI sejam movidos para a
localização apontada por DI. Após cada operação de movimentação, ocorrem duas ações. Uma é que CX
decrementa em 1 e a outra é que os registradores de ponteiro são incrementados. Esta sequência continua até CX = 0.
Os exemplos 4.1ae 4.1b ilustram essas etapas.
Machine Translated by Google
Exemplo 4.1b
.MODELO PEQUENO ;selecione um modelo pequeno
.DADOS ;inicia o segmento de dados
DAT1 DB 10 DUP('*') ;armazena '*' em 10 locais
ORG 0200H ;definir área de destino
DAT2 DB 10 DUP(?) ;separe 10 locais
.CÓDIGO
.COMECE
MOV AX, DS ;mover DS para AX
MOVE ES, AX ;mover AX para ES
LEA SI, DAT1 ;aponta SI para a Fonte
LEA DI, DAT2 ;aponta DI para o destino
MOV CX, 10 ;contagem de carga em CX
CLD ;limpa o sinalizador de direção
REP MOVSB ;mover a string de bytes
.SAÍDA
FIM
Para o programa acima, se os dados envolvidos estiverem na forma de palavras, a única alteração seria
substituir a linha REP MOVSB por REP MOVSW. Neste caso, CLD fará com que SI e DI sejam incrementados
em 2.
Exemplo 4.2
.MODELO PEQUENO
.DADOS
WRD1 DB “SAMSON” ;armazena a primeira
WRD2 DB “SAMRON” palavra ;armazena a segunda palavra
DEUS BD “MESMO$” ;armazena a mensagem para igualdade
MAU DB “NÃO MESMO$” ;armazena a mensagem de desigualdade
.CÓDIGO
.COMECE
MOV AX, DS
MOVE ES, AX ;copia DS para
LEA SI, WRD1 ES ;aponta SI para fonte
LEA DI, WRD2 ;aponta DI para o destino
MOV CX, 6
Machine Translated by Google
Aqui SI e DI apontam para as duas cadeias de caracteres, CX armazena a contagem e o sinalizador de direção
é apagado para incrementar automaticamente os ponteiros de endereço. REPE é usado como prefixo para
comparar os bytes da string. REPE CMPSB significa que os bytes de string correspondentes da origem e do
destino são comparados desde que sejam iguais. A igualdade também implica que o sinalizador Zero está definido.
A comparação é interrompida assim que uma desigualdade é encontrada. Uma das duas condições a
seguir faz com que o loop de comparação seja encerrado.
i) Uma desigualdade é vista, ou seja, a bandeira Zero é reiniciada.
Exemplo 4.3
.MODELO PEQUENO
.DADOS
LISTA DB “ANBHTSHFGTRIUUJEHNPBGDVBTH”
RP DB “CARACTER PRESENTE$”
NOTP DB “CARACTER NÃO PRESENTE$”
Machine Translated by Google
.CÓDIGO
.COMECE
No acima, uma variação (dos exemplos anteriores) foi usada. DI foi feito para apontar para o último caractere da string, e o
sinalizador de direção é definido, de modo que o endereço diminui automaticamente após cada operação de varredura.
Consulte o Exemplo 3.18, onde o mesmo problema foi resolvido sem usar instruções de string.
.DATA) e o conteúdo do registro DS é então movido para ES. Observe também que a área de memória é endereçada
usando o registrador DI. O registrador SI não pode ser usado.
Exemplo 4.4
.MODELO PEQUENO ;selecione um modelo pequeno
.DADOS ;inicia o segmento de dados
ÁREA DW 50 DUP(?) ;definir ÁREA
;iniciar segmento de código
;inicia o programa
.CODE .STARTUP ;copia DS para AX
MOV AX, DS MOV ES, AX ;copia AX para ES
Machine Translated by Google
É óbvio que a instrução STOS é usada para preencher uma área da memória com os mesmos dados.
ii) PILOTO
A última das instruções de string é LODS. Esta é uma instrução para 'carregar'. Carregar sempre significa o ato de pegar
dados da memória e colocá-los em um registrador. Aqui, a memória de origem é o segmento de dados e o ponteiro para
ele é o SI. O segmento de dados é o segmento de origem e o registrador de destino é o registrador AL ou AX. Não faz
sentido usar o prefixo REP para a instrução LODS, pois os dados podem ser carregados para AL/AX apenas uma vez.
4.2 | Procedimentos
Em linguagens de alto nível (ou seja, C, C++) você pode ter encontrado 'funções'. Uma função é um programa que realiza
uma tarefa específica. Quando esta tarefa deve ser feita repetidamente, a função é usada repetidamente. Quando um
programa 'principal' considera isso como uma tarefa subsidiária, a função (ou sub-rotina) é 'chamada' sempre que seu
serviço for solicitado. Isso também é aplicável à programação em linguagem assembly. Tomando emprestada a
terminologia da Intel, chamaremos isso de 'procedimento'.
A Figura 4.1a mostra dois casos. Um é o caso de um programa principal chamando muitos procedimentos
diferentes. O segundo é um programa chamando o mesmo procedimento repetidamente. Assim, existe um
programa principal que pode chamar um procedimento em qualquer lugar de seu corpo. O primeiro é o 'programa
de chamada' e o último é o 'programa de chamada'. O programa principal está em um segmento de código específico e o
(b)
(uma)
Programa principal
Programa principal
…… ……
…… ……
…… LIGAR BETA
……
LIGUE ALFA
…… ……
…… LIGAR BETA
……
……
…… ……
……
LIGAR BETA
…… ……
…… LIGAR BETA
……
CHAMAR GAMA
……
…… ……
FIM FIM
Figura 4.1 | a Programa principal chamando procedimentos diferentes b Programa principal chamando o mesmo procedimento repetidamente
Machine Translated by Google
procedimento pode ser escrito no mesmo segmento de código (nesse caso é um procedimento 'próximo'), ou pode
estar em um segmento diferente (procedimento 'distante').
Vejamos agora a sequência de ações executadas por um processador ao usar um procedimento. Por enquanto,
vamos supor que o procedimento seja um procedimento 'próximo'. No decorrer da ação de execução do programa
principal, é encontrada uma instrução CALL. Isso sinaliza que um procedimento escrito em outro lugar deve ser
executado. Esta é essencialmente uma operação de ramificação, pois a sequência normal de execução do programa
é perturbada. No momento em que a instrução CALL estiver sendo executada, o IP (ponteiro de instrução) estará
apontando para a próxima instrução do programa principal. Os passos dados pelo processador automaticamente
são:
i) Ele salva o conteúdo IP atual na pilha (este é o endereço de 'retorno' para voltar ao
o programa principal depois de executar o procedimento).
ii) O destino CALL (especificado na instrução CALL) será o endereço do procedimento. O IP agora é carregado
com este endereço e a execução prossegue a partir desse local.
iii) O procedimento é executado até que seja encontrada uma instrução RET (retorno) no procedimento.
iv) Em seguida, o valor antigo do IP é recuperado da pilha e o controle retorna ao
programa no endereço de retorno.
A Fig 4.2 mostra uma CALL encontrada em um programa principal. Em seguida, o procedimento MULT é
retomado para execução. Ao final do procedimento, há a instrução RET, em execução que faz com que o controle
retorne ao programa principal. A instrução após a instrução CALL será agora retomada.
4.2.1 | Escrevendo um
procedimento Como qualquer montador, o MASM também possui especificações para escrever
um procedimento. O procedimento deve começar com o nome do procedimento seguido da diretiva
PROC. Também usamos as diretivas NEAR ou FAR que especificam o 'tipo' do procedimento. O
procedimento deve terminar com o nome do procedimento e o ENDP. O Exemplo 4.5 mostra um
programa que digita 10 números de um único dígito pelo teclado, encontra seus quadrados e os armazena na
Apenas locais de byte foram alocados na memória para os quadrados, pois o quadrado do número de dígito único
mais alto é 81, que caberá em um espaço de byte. No procedimento, o registro
........
LIGUE MUITO
........
........
........
........
PROC MUITO PERTO
........
........
........
........
CERTO
atribuído para o produto é AX. No entanto, o produto ocupará apenas AL. Assim, apenas o valor em AL é
movido para a memória.
Agora, vamos examinar os principais recursos deste programa.
i) Um procedimento chamado SQUARE é usado para calcular os quadrados.
ii) A entrada de dados do teclado e o armazenamento dos quadrados na memória é feito na
programa.
iii) O procedimento está no mesmo segmento de código. Por isso, é designado como 'próximo'.
iv) O procedimento termina com uma instrução RET (retorno) que leva o controle de volta ao
programa.
v) A instrução .EXIT é a última instrução do programa principal. Sabemos que ele é convertido nas instruções
para retornar o controle ao DOS. Assim, é a última instrução que é executada.
vi) A última linha do código é a diretiva END que diz ao montador para parar de ler.
vii) Sabemos que o segmento de pilha é necessário para o funcionamento de um procedimento. Por enquanto,
não estamos definindo nenhum segmento de pilha, mas usando a pilha definida automaticamente pelo DOS.
Quando precisarmos de mais tamanho de pilha, definiremos nossa própria pilha.
Exemplo 4.5
.MODELO PEQUENO
.DADOS
NÚMEROS DB 10 DUP(0) ;alocar espaço para os quadrados
.CÓDIGO
.COMECE
MOV CX, 10 ;contagem de carga em CX
AÍ, NÚMEROS ;deixe o SI apontar para NUMBERS
REPEA: MOV AH, 01 ;entrada do teclado
INT 21H
SUB AL, 30H ;converte de ASCII para binário
PRAÇA DE CHAMADA ;chamar o procedimento de quadratura
MOV [SI], AL ;armazena o quadrado na memória
INC SIM ;ponteiro de incremento
LOOP REPEA ;decrementa CX e repete se CX! = 0
.SAÍDA ;retorna ao prompt do DOS
No Exemplo 4.5, o quadrado dos números foi calculado e salvo na memória. Pode ser interessante exibi-los no
monitor. Isso pode ser feito consultando o Exemplo 3.22. O programa para converter qualquer número
hexadecimal para binário e exibir pode ser feito outro procedimento e chamado aqui.
Machine Translated by Google
O programa a seguir ilustra o uso de uma chamada de proximidade indireta. O Exemplo 4.6 ilustra o uso da instrução de
registrador CALL para chamar procedimentos que começam nos endereços off-set ENT e DISP. (Essas chamadas também
podem chamar os procedimentos diretamente como CALL ENT e CALL DISP.)
O endereço off set ENT é colocado em BX e DISP em SI, e então as instruções CALL BX e CALL SI chamam estes
procedimentos. O procedimento ENT permite a entrada do teclado com eco. Se uma letra maiúscula for inserida por ENT, o
programa chamador converte em minúscula e o procedimento DISP exibe a letra minúscula correspondente.
Exemplo 4.6
.MODELO PEQUENO ;selecione um modelo minúsculo
.CÓDIGO ;iniciar segmento de código
Machine Translated by Google
ENT ENDP
DISP ENDP
FIM
Chamada Far Direta Uma chamada far é uma chamada entre segmentos, o que significa que o endereço de destino
está em um segmento de código diferente. Esta será uma instrução de 5 bytes, sendo o primeiro byte o opcode, o
segundo e terceiro bytes sendo o novo valor de IP e o quarto e quinto os novos valores de CS.
Esta não é uma chamada relativa. Quando o procedimento é chamado, os valores de IP e CS são substituídos pelos
valores correspondentes na instrução de chamada conforme mostrado na Fig. 4.4.
Chamada Far Indireta Para uma chamada indireta, o endereço de destino não está na instrução, mas sim em um
registrador ou memória. Para uma chamada remota, são necessários quatro bytes para especificar um destino.
Obviamente, um registrador não pode especificá-lo. Assim, os quatro bytes necessários para especificar um destino
são armazenados na memória e apontados por um registrador. Como exemplo, CALL DWORD PTR [SI] pode ser uma
instrução de chamada remota. [SI] e [SI + 1] dão o novo valor de IP e [SI + 2] e [SI + 3] dão o novo valor de CS.
Chamadas e procedimentos Far são especificados usando a diretiva 'far' ao definir o procedimento.
No Capítulo 5, veremos como a diretiva EXTRN é usada nesse contexto.
onde se ramificou. Isso significa que o valor de IP (e CS para uma chamada 'distante')
terá que ser recuperado. Isso é feito pela instrução 'return' que é a última instrução do procedimento.
A execução de RET faz com que o endereço de retorno seja retirado da pilha para IP ou IP e CS.
(Sempre que um procedimento é definido, sabe-se se é um procedimento distante ou próximo. A
partir disso, é determinado se a pilha salvou apenas o valor IP antigo ou ambos IP e CS.)
Exemplo 4.7a
.MODELO PEQUENO
.DADOS
----------------
.CÓDIGO
.COMECE
..
..
..
LIGUE MÚLTIPLOS
..
..
..
MULTI ENDP
FIM
Machine Translated by Google
Agora veja o Exemplo 4.7b. O programa principal não é mostrado. O que está ilustrado é que ele
utiliza os registradores DX e CX. Esses registradores também são usados no procedimento MULTI.
A construção USES no início do procedimento será convertida em PUSH DX e PUSH CX quando
o procedimento for chamado e em POP CX e POP DX ao retornar do procedimento. Isso pode ser
verificado 'depurando' o programa ou usando a diretiva.list all. Em seguida, o arquivo de lista
mostrará a listagem do procedimento conforme mostrado abaixo. Observe o push e pop DX e CX
que não escrevemos especificamente no programa, mas foram causados pela construção USES.
Exemplo 4.7b
002B MULTI PROC PERTO DE USA DX CX
002B 52 *
empurre dx
002C 51 *
empurre cx
002D F6 E3 MUL BL
002F BA 4509 MOV DX, 4509H
0032 03 C2 ADICIONAR AX, DX
0034 B9 0608 MOV CX, 0608H
0037 03 C1 ADICIONAR AX, CX
CERTO
0039 59 * cx
pop
003A 5A * dx
pop
003B C3 * ret 00000h
003C MULTI ENDP
FIM
Quando os procedimentos são chamados, eles devem receber dados sobre os quais trabalhar e, em
seguida, esses procedimentos terão que retornar os resultados ao programa chamador. Existem várias
maneiras de fazer isso. Uma forma seria colocá-lo em registradores que podem ser acessados tanto pelo
programa principal quanto pelo procedimento. Outra maneira seria colocar os dados na memória e acessá-
los pelo nome ou usando ponteiros. Ainda outro método é usar a pilha para isso. Os dados ou endereços
disponibilizados para os programas chamador e chamado são chamados de 'parâmetros' e agora
discutiremos várias maneiras de 'passar parâmetros' de e para procedimentos.
Nesse caso, os dados são colocados em registros pelo programa principal, e esses registros são
usados pelo procedimento. O Exemplo 4.8 é um programa que calcula e guarda na memória o
enésimo termo de uma progressão aritmética. A fórmula para o enésimo termo de uma PA é A + (N
ÿ 1) D, onde A é o primeiro termo e D é a diferença comum. Aqui os valores de A, N e D são
colocados no segmento de dados de onde o programa principal os pega, carrega-os em registradores
e passa os valores para o procedimento. O procedimento faz o cálculo e passa o resultado para o
programa principal através do registrador BX.
Exemplo 4.8
.MODELO PEQUENO
.DADOS
Machine Translated by Google
A DB 4 ;A=4
D DB 5 ;D=5
N DB 20 ;N = 20
NTH DW?
.CÓDIGO
.COMECE
MOV BL, A ;copia de A para BL
MOV BH, 0 ;BX = 0 para ter A em BX como palavra
MOV AL, D ;copia D para AL
MOV CL, N ;Copiar N para CL
DEC CL ;diminui CL para obter N-1
CALL NTH_TERM_AP ;chamar o procedimento
MOV NTH, BX .EXIT ; salva o enésimo termo na memória
NTH_TERM_AP ENDP
FIM
i) Suponha que os números sejam 6, 8, 34, 0 e 67. Os dois primeiros números são comparados. Se o
primeiro número for maior que o segundo, nenhuma alteração será feita na ordenação. Caso contrário,
troque-os, de modo que o número maior venha primeiro no par. Para o nosso conjunto, agora a
ordenação passa a ser 8, 6, 34, 0 e 67.
ii) Em seguida, o segundo e terceiro números (ou seja, 6 e 34) são comparados. A nova ordenação é
8, 34, 6, 0 e 67.
iii) Isso é repetido N ÿ 1 vezes, de modo que devido à ordenação de pares, o maior número vem primeiro
na nova ordenação de pares. No Exemplo 4.9, o procedimento one_set faz isso.
iv) Esta sequência de passos é repetida N ÿ 1 vezes, de tal forma que temos todos os números ordenados em
ordem decrescente, substituindo a matriz não classificada.
Exemplo 4.9
.MODELO PEQUENO
.DADOS
PALAVRA N 0009H
NUMS BYTE 10H, 08, 89H, 78H, 67H, 07, 2, 99H, 0FEH
.CÓDIGO
Machine Translated by Google
.COMECE
LEA BX, NÚMEROS ;BX para apontar para o array de números
MOV CX, N ;mover o tamanho do array para CX
DEC CX ;CX deve conter N-1
MOV SI, BX ;SI ter cópia do endereço inicial
PARA: MOV DX, CX ;DX = N-1
STRT: LIGUE ONE_SET ;o procedimento para ordenação em pares
DEC DX ;manter uma contagem do número de chamadas
JNZ STRT ;repete até DX = 0
MOV BX, SI ;coloca o endereço inicial de volta em BX
LOOP AG ;loop de volta até CX = 0
.SAÍDA
No programa acima, nove números (bytes) são armazenados no segmento de dados e ordenados.
Qualquer número de bytes pode ser ordenado desta forma, limitado apenas pelo valor máximo de N. Para
ordenação em ordem crescente, apenas uma instrução no procedimento precisa ser alterada (qual?).
Após a classificação, se escrevermos um procedimento para converter números hexadecimais em ASCII,
os números classificados também poderão ser exibidos.
Nota Não usamos C como um rótulo porque 'C' é uma palavra reservada no MASM.
Exemplo 4.10
.MODELO PEQUENO
.PILHA 100H
Machine Translated by Google
.DADOS
A DW 0987H ;valores de dados no segmento de dados
B DW 678H
E DW 0A5EH
D DW 0034H
RESULTADO DW?
.CÓDIGO
.COMECE
PRESSIONE A ;pressione para empilhar
EMPURRAR B
PRESSIONE E
PRESSIONE D
vi) RET 8 adiciona 8 a SP após o retorno do procedimento. Na verdade, ele apaga os dados que foram empurrados
para a pilha.
Consulte a Figura 4.5. Digamos que antes do primeiro PUSH, o valor de SP = 0120H. Esta figura mostra o
conteúdo da pilha após as quatro operações PUSH. O endereço de SP agora é 0118H. Quando o CALL é
executado, SP = 0116 H, porque o conteúdo do IP é empurrado na pilha. Antes de retornar do procedimento, SP
= 0116 ÿ.Rÿÿ 8 faz com que o IP seja estourado. Então, SP = 0118 ÿ. Adicionando 8 a este valor de SP faz com
que SP se torne 0120 H novamente.
Machine Translated by Google
Pilha Pilha
Morada contente
011FH 09
UMA
011EH 87
011DH 06
B
011CH 78
011BH 0A
E
011AH 5E
0119H 00
D
0118H 34
É importante ser muito claro sobre as operações da pilha se você planeja usar a pilha. Qualquer alteração errada
da pilha pode causar uma falha no sistema.
SP pode ter um valor máximo de FFFFH. Para cada operação PUSH, o valor de SP diminui em 2 e, no caso
limite, pode ir para SP = 0000.
Qualquer operação PUSH além disso causará um 'stack overflow'. Isso cria uma condição quando não há
espaço na pilha para novos dados.
Stack underflow é o outro caso em que operações POP fazem com que SP tenha valores além do topo
definido da pilha.
4.3 | Macros
O nome do nosso montador é 'Montador Macro'. Como tal, vemos que se espera que seja capaz de lidar com um
item chamado 'macros'. O que é uma macro? É como um opcode – quando usado, ele é executado.
Uma macro, quando chamada pelo nome, executa as instruções listadas sob esse nome. Assim, essencialmente,
uma macro é uma notação abreviada para várias linhas de instrução. Essencialmente, torna a codificação em
linguagem assembly mais legível e ajuda a evitar codificação repetitiva.
Normalmente, uma macro, como um procedimento, é definida para executar uma função específica. No
entanto, as 'despesas gerais' envolvidas na invocação de um procedimento não são incorridas aqui. Uma chamada
de procedimento causa push e popping de endereços/dados na pilha. Uma macro quando invocada apenas
expande o código colocando todas as instruções correspondentes à macro chamada. Ele não tem que 'chamar' e
'retornar'. Assim, quando escrevemos nosso código com macros, ele pode parecer pequeno, mas ao montar o
código, cada macro é substituída pelo conjunto completo de instruções que o compõem. Assim, podemos dizer
que as macros executam mais rápido, mas o código montado ocupa mais memória. Isso ocorre porque um
procedimento é escrito apenas uma vez na memória, mas as instruções da macro são gravadas como parte do
código toda vez que a macro é chamada.
Pensemos em uma tarefa simples que poderia ser definida como uma macro. Se queremos frequentemente
inserir dados através do teclado, pode ser escrito como uma macro.
Esta macro não possui parâmetros a serem passados para ela. Outra macro semelhante é para exibir um
caractere conforme mostrado abaixo.
Ao escrever programas usando macros, certifique-se de que as macros estejam definidas antes de serem usadas.
O Exemplo 4.11 é uma ilustração simples desses princípios.
Exemplo 4.11
.MODELO PEQUENO
.CÓDIGO
.COMECE
ENTRADA MACRO ;defina a macro para inserir uma chave
MOV AH, 01H
INT 21H
AUTO
Quando executamos o programa acima, a tecla pressionada é exibida duas vezes. Por quê?
Agora vamos definir e usar uma macro usando parâmetros.
MOSTRAR MACRO STRINGDAT
MOV AH,09
LEA DX,STRINGDAT
INT 21H
O acima é uma macro que exibe a string cujo endereço é carregado no DX. O parâmetro é 'STRINGDAT'.
Também é chamada de variável fictícia. Quando a macro é invocada, o nome real da string a ser exibida
pode ser usado. O Exemplo 4.12 ilustra essas ideias.
Machine Translated by Google
Exemplo 4.12
.MODELO PEQUENO
.DADOS
MESG1 DB “MEU NOME É ANTONY GONSALVES$”
MESG2 DB “EU SOU SAMANTHA$”
.CÓDIGO
.COMECE
MOSTRAR MACRO STRING ;defina uma macro para exibição de string
MOV AH, 09
LEA DX, STRING
INT 21H
MOV DL, 0AH ;DL = dados ASCII para nova linha
MOV AH, 02
INT 21H
MOV DL, 0DH ;DL = dados ASCII para retorno de carro
MOV AH, 02
INT 21H
AUTO
No programa acima, a macro DISPLAY é definida pela primeira vez. Então a macro é invocada duas vezes
com dois parâmetros diferentes MESG1 e MESG2. Observe que a macro não apenas exibe uma string, mas
também possui instruções para exibir nova linha e retorno de carro. Isso garante que, após exibir uma linha,
o cursor se mova para o lado esquerdo da próxima linha. Assim, no Exemplo 4.12, as duas mensagens são
exibidas em linhas separadas.
Exemplo 4.13
.MODELO PEQUENO
.CÓDIGO
.COMECE
STAR MACRO N ;defina macro STAR com parâmetro N
LOCAL NOVAMENTE ;declara NOVAMENTE para ser um rótulo local
Machine Translated by Google
NOVO MACRO ;defina uma macro para passar para a próxima linha
MOV DL, 0AH
MOV AH, 02
INT 21H
MOV DL, 0DH
MOV AH, 02
INT 21H
AUTO
.SAÍDA
FIM
O Exemplo 4.13 mostra esse caso. Duas macros foram definidas – STAR e NEW. O primeiro contém um rótulo
NOVAMENTE que foi declarado como LOCAL. Esta macro faz com que o personagem
'*'
ser impresso em uma linha N vezes. N é um parâmetro cujo valor é passado para esta macro, quando chamado.
A macro NEW apenas move o cursor para o lado esquerdo da próxima linha. A saída do Exemplo 4.13 é mostrada
abaixo.
*****
****
***
**
*
C:\masm6.14\BIN>
Sabemos que os computadores fazem todos os seus cálculos usando aritmética binária, mas estamos
acostumados a fazer cálculos na forma decimal. Vemos os números impressos na forma decimal e inserimos os
dados usando o teclado como números decimais. Nossa conclusão obviamente é que através
Machine Translated by Google
os dados aritméticos são processados principalmente em forma binária por computadores, existem métodos para
converter dados binários em formas mais adequadas para exibição e compreensão. Além disso, se quisermos processar
dados numéricos em um formato diferente do binário, isso também deve ser possível.
Como tal, vamos examinar alguns dos formatos numéricos usados com frequência. Dois dos formatos mais
utilizados são BCD e ASCII. BCD é 'decimal codificado em binário' – duas versões são 'BCD compactado' e BCD
descompactado. Como exemplo do primeiro, um número decimal 56 (digamos) é escrito como binário de quatro bits
empacotado em um único byte como 0101 0110. BCD descompactado significa usar um byte inteiro para representar um
número decimal. Por exemplo, 56 é escrito como dois bytes – 0000 0101(5) 0000 0110(6). Outro formato de número
popular e muito importante é o formato ASCII. Representa um dígito decimal em um byte. Assim, 6 é 0011 0110 ou 36H.
Os dígitos decimais de 0 a 9 têm sua representação ASCII como 30H, 31H … 39H.
Nota As conversões de formato de número foram discutidas em detalhes no Capítulo 0. Se você tiver dúvidas sobre
essas conversões, consulte a Seção 0.6.
Isso foi feito no Exemplo 3.25 para um número BCD compactado de 2 dígitos. O método exato de conversão é detalhado
lá junto com o exemplo. Veremos agora como um BCD compactado de oito bytes é descompactado, convertido em ASCII
e exibido.
No Exemplo 4.14, vemos que um número decimal de oito dígitos é representado em BCD compactado, de modo
que cada dígito decimal tem uma representação de quatro bits. Isso é armazenado como uma palavra dupla (quatro
bytes). No entanto, ao acessá-lo para processamento, um byte de cada uma dessas palavras duplas é movido para AL e
processado. Os passos são:
i) Um procedimento BCD_TO converte BCD compactado em BCD descompactado. ii)
Este procedimento salva CX e AX conforme são usados no procedimento.
iii) Para converter para ASCII, dois bytes BCD descompactados são colocados em uma palavra e logicamente ORed com
3030H.
iv) Após a conversão dos 8 bytes, verificamos que os valores ASCII estão na memória com o dígito mais significativo na
memória mais alta apontada por BX. As instruções da etiqueta STRT em diante são para exibir os dígitos ASCII.
Exemplo 4.14
.MODELO PEQUENO
.DADOS
BCD DD 67450823H ;armazena o número BCD compactado de 4 bytes
ASC DB 8 DUP(?) ;alocar espaço para os 8 bytes
;número ASCII
.CÓDIGO
.COMECE
Machine Translated by Google
BCD_TO ENDP
FIM
A conversão de ASCII para BCD compactado é apenas o inverso de todos esses processos.
Agora, veja o exemplo a seguir, que adiciona dois números BCD de vários bytes, para obter o resultado no
próprio BCD. Os dois números BCD são armazenados como palavras duplas (DD).
Nota Quando eles são armazenados assim, o byte mais baixo do número estará no endereço mais baixo.
Agora, BX e SI apontam para os números BCD a serem adicionados. Para somar, apenas um byte de cada
um dos números é acessado e somado. A soma é armazenada na localização do byte SUM. Aqui também,
o LSB da soma estará no endereço mais baixo.
Exemplo 4.15
.MODELO PEQUENO
.DADOS
BCD1 DD 45679834H ;armazena o primeiro byte BCD como uma palavra dupla
BCD2 DD 93870989H ;armazena o segundo byte BCD como double word
SOMA DB 5 DUP(0) ;aloca 5 bytes de memória para a soma
.CÓDIGO
.COMECE
MOV AH, 0 ;limpar AH
CLC ;limpar bandeira de transporte
LEA BX, BCD1 ;BX para apontar para o primeiro byte BCD
LEA SI, BCD2 ;SI para apontar para o segundo byte BCD
LEA DE, SOMA ;DI para apontar para o local SUM
MOV CX, 04 ;conta para o número de bytes
RPT: MOV AL, [BX] ;copia os bytes do primeiro número para AL
MOV DL, [SI] ;copia os bytes do primeiro número para AL
ADC AL, DL ;adicionar com carry AL e DL
DAA ;faça a correção BCD
MOV [DI], AL ;armazena o resultado de cada adição de byte
INC BX ;ponteiro de incremento BX
INC SIM ;ponteiro de incremento IF
INC DE ;incrementa o ponteiro DI
LOOP RPT ;loop até CX = 0
ADC AH, 0 ;adiciona carry, AH e 0;soma em AH
MOV [DI], AH .EXIT ;armazena AH na memória
FIM
Ao adicionar 4 bytes BCD, existe a possibilidade de um carry, que corresponde ao 5º byte BCD
da soma. Para preservar este transporte final, o registrador AH é usado como mostrado. A soma dos
dois números dados é 0139559823.
ii) Subtração
i) se está dentro de A e F.
Dependendo disso, ele realiza as correções necessárias. Veja os três casos mostrados.
Neste caso, o nibble inferior não está dentro de A e F, e o sinalizador AC não está definido, ou seja, AF = 0.
Então a instrução apenas recorre a fazer o nibble superior de AL para 0. Assim, se a instrução AAA for
usado após a adição, a soma torna-se 09 ou seja, 0000 1001. Para convertê-lo de volta para ASCII, OU com
30H.
37H +
36H
6DH
Nesse caso, o nibble mais à direita é maior que 9 – dentro de A e F – não está mais representando um dígito
decimal. Assim, 6 é adicionado ao nibble mais à direita (como na correção BCD, o número 6 é adicionado
porque essa é a diferença entre decimal e hexadecimal), ele também limpa o nibble superior de AL, define
CF e AF e adiciona 1 para A.H. Assim, se a instrução AAA for usada após a adição, a soma em AL agora é
03 e AH = 01 (se AH tivesse sido apagado anteriormente).
O registrador AX conterá 3133H depois disso, que é o valor ASCII de 13. Esses fatos devem ser levados em
consideração ao adicionar números ASCII multibyte.
Machine Translated by Google
Caso 3
39H +
38H
71H
Aqui, o nibble mais à direita não está dentro de A e F, mas AF = 1. Portanto, 6 é adicionado ao nibble
mais à direita e também limpa o nibble superior de AL, define CF e AF e adiciona 1 a AH . Assim, se a
instrução AAA for usada após a adição, AL = 7, AH = 1, CF = 1 e AF = 1. Em todos os casos, AAA limpa
o nibble superior de AL. Esses fatos devem ser levados em consideração ao adicionar números ASCII
multibyte.
Caso 1
Subtraia '5' de '8'.
38H -
35H
03
Caso 2
Subtraia '8' de '5'.
35H -
38H
FDH
Agora, cabe a você descobrir o que acontece quando '9' é subtraído de '4'. Além disso, observe que as
instruções AAA e AAS também podem ser usadas após a adição ou subtração de números BCD
descompactados.
Machine Translated by Google
Exemplo 4.16
.MODELO PEQUENO
.CÓDIGO
.COMECE
EXIBIR MACRO ;defina macro para exibição
MOV AH, 02
INT 21H
AUTO ;fim da macro
MOV AL, '6' ;AL = 36H
E AL, 0FH ;AL = 06H
MOV BL, '9' ;BL = 39H
E BL, 0FH ;BL = 09H
MUL BL ;AX = 0036H;o valor decimal é 54
AAM ;AX = 0504H, o BCD descompactado de 54
OU AX, 3030H ;AX = 3534H, o valor ASCII de 54
MOV CX, AX ;copia AX para CX
MOV DL, CH ;DL = CH para exibir o MSD
DISP ;chama macro para exibição
MOV DL, CL ;DL = CL para exibir o LSD
DISP ;chama macro para exibição
.SAÍDA
FIM
Este é o algoritmo a ser usado para conversão. Vamos escrever um programa que faça isso. Aqui, os
multiplicandos 1, 10, 100 e 1000 são armazenados no segmento de dados. O valor binário também é
finalmente armazenado na memória de dados.
Exemplo 4.17
.MODELO PEQUENO
.DADOS
BD ASCDAT '6754' ;Valor ASCII de 6754
MULTI DW 01, 0AH, 64H, 3E8H
BINAR DW 0
.CÓDIGO
.COMECE
DIG EQU 4 ;DIG especifica o número de dígitos
MOV CX, DIG ;mover em CX o número de dígitos ;DI para
MOV DI, DIG-1 LEA apontar para LSD do ASCII no.
SI, MULTI ;use SI para apontar para os multiplicandos
Machine Translated by Google
RPT: MOV AL, ASCDAT [DI] ;traz os primeiros dados ASCII para AL
E AX, 000FH ;mascarar AX
MOV BX, PALAVRA PTR[SI] ;obtém o multiplicando para BX
MUL BX ;multiplica AX por BX
ADICIONAR BINAR,AX ;adiciona ao valor binário
DEZ DE ;diminui ponteiro de byte
INC SIM ;incrementa o ponteiro da palavra
INC SIM ;dois incrementos necessários
LOOP RPT ;repete até CX = 0
.SAÍDA
FIM
O programa acima é uma aplicação direta do algoritmo mencionado. Obtemos o valor binário
convertido na palavra localização BINAR. Podemos estender isso para mais números de dígitos também.
Exemplo 4.18
.MODELO PEQUENO
.CODE .STARTUP
MOV AL, + 34
ADICIONAR AL, - 23
.SAÍDA
FIM
Machine Translated by Google
Para o programa acima em que +34 (22H) e -23 (E9H) são números decimais, o cálculo em forma binária:
0010 0010 +
1110 1001
1 0000 1011
Exemplo 4.19
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AL, -28 ADD ;AL = E4H
AL, -78 .EXIT ;AL = B2H
FIM
Computação:
1110 0100 +
1011 0010
1 1001 0110 OF = 0, SF = 1, CF = 1
Exemplo 4.20
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AL, + 100
ADICIONAR AL, +75
.SAÍDA
FIM
Computação:
0110 0100 (64H)
0100 1011 (4BH)
1010 1110 (EXP OF = 1, SF = 1, CF = 0
No caso acima, o sinalizador de estouro será definido porque houve um estouro do bit D6 para D7, e o bit
de sinal está definido. Mesmo que dois números positivos tenham sido adicionados, o bit de sinal indica
uma soma negativa. Assim, AFH deve ser pensado como um número negativo, o que não é correto. O
problema é que a soma é +175, que é muito grande para caber em um registrador de 8 bits. Uma vez que o
sinalizador de estouro está definido, ele indica que o registrador AL ultrapassou o tamanho alocado para
operações assinadas no formato de 8 bits.
Machine Translated by Google
Entendendo que o problema que causou o erro é de inadequação do tamanho do destino, ele pode ser
resolvido estendendo o tamanho de bits dos operandos. Isso pode ser feito por sinal estendendo um byte
para uma palavra e uma palavra para uma palavra dupla. O 8086 possui duas instruções específicas para ele.
Exemplo 4.21
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AL, + 100
CBW
ADICIONAR EIXO, + 75
.SAÍDA
FIM
Computação:
0000 0000 0110 0100 +
0000 0000 0100 1010
0000 0000 1010 1110 OF = 0, SF = 0, CF = 0
Neste caso, a bandeira de estouro não está definida e, portanto, a soma em AX é considerada correta. O bit
de sinal também indica um número positivo.
Nota Em um caso geral, não temos certeza se o resultado da adição/subtração de números assinados
excederá o tamanho de registro permitido para isso. Para acomodar uma correção como no Exemplo 4.21, a
instrução JO ( Jump on overflow) pode ser usada. O programa pode ser escrito de forma que após a operação
de adição ou subtração (conforme o caso), a instrução JO testa o sinalizador de estouro e a instrução CBW
ou CWD é usada somente se o sinalizador de estouro for encontrado para ser definido. Em seguida, pode
ser feito um novo cálculo usando a palavra estendida ou a palavra dupla.
2 JG Pule se maior ZF = 0 e SF = OF
11 JO Saltar se estourar DE = 1
13 JS Saltar se assinado SF = 1
Nota i) Os mnemônicos JE/JZ e JNE/JNZ são aplicáveis tanto para números assinados quanto não assinados e a condição da
bandeira zero sendo definida ou redefinida de acordo também se aplica aqui.
ei) ! = é o símbolo para 'diferente de'.
A lista da Tabela 4.2 mostra as condições das bandeiras de sinal, transbordamento e zero e, sem dúvida,
causa certa confusão. Vamos testar um programa para as várias situações possíveis e verificar o estado dessas
bandeiras.
Exemplo 4.22
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AL, +40
CMP AL, -60 ;depois disso ,OF = 0, SF = 0
CMP AL, +70 ;depois disso ,OF = 0, SF = 1
MOV BL, -20 ;BL = -20
CMP BL, -70 ;depois disso ,OF = 0, SF = 0
CMP BL, -10 ;depois disso ,OF = 0, SF = 1
CMP BL, +10 ;depois disso ,OF = 0, SF = 1
CMP BL, -20 ;depois disso ,OF = 0, SF = 0, ZF = 1
.SAÍDA
FIM
O Exemplo 4.23 encontra o menor de três números com sinal e o armazena em um local de memória. Ele
compara o primeiro número com o segundo número. Se o primeiro número for menor, ele é comparado com
o terceiro número. Caso contrário, o segundo número é comparado com o terceiro número e finalmente o
menor número é identificado e armazenado na memória. Nesse caso, o número negativo -90 é o menor
número.
Exemplo 4.23
.MODELO PEQUENO
.DADOS
NUMS DB + 45, -76, -90
MENOR DB 0
.CÓDIGO
.COMECE
LEA BX, NÚMEROS ;usar BX como ponteiro para os números
MOV AL, [BX] ;pega o primeiro número em AL
INC BX ;incrementa o ponteiro ;compara
CMP AL, [BX] o primeiro no. com o segundo
JLE PRÓXIMO ;se AL for menor ou igual, salta
MOV AL, [BX] ;senão, carregue o segundo nº. em AL
PRÓXIMO: INC BX ;incrementa o ponteiro ;compara
CMP AL, [BX] o segundo nº. com terceiro
JLE FINAL ;se o primeiro não. é menor, pule
MOV AL, [BX] ;move o menor número para AL
FINAL: MOV MENOR, AL .EXIT ;armazenar o menor nº. em memória
FIM
i) IMUL
Tudo o que foi discutido sobre a instrução MUL (Seção 3.4.4) também é válido no caso de IMUL. A única
diferença é que como os operandos são assinados, o produto também é assinado. Outro ponto é que
quando o produto não é grande o suficiente para utilizar todos os registradores alocados para ele, o bit de
sinal é copiado para o registrador superior (AH ou DX conforme o caso) e CF = OF = 0.
ii) IDIV A
operação de divisão com sinal é semelhante à divisão sem sinal, conforme discutido na Seção 3.4.5, exceto
que os operandos e o resultado são assinados. Por isso, se o registrador do quociente for AL, o valor do
quociente deve estar entre -128 e +127. Se o registrador de quociente for AX, este
Machine Translated by Google
o valor deve estar entre -32.768 e +32.767. Se isso for violado, uma mensagem de erro 'dividir estouro'
será exibida na tela.
Agora, vamos usar as instruções de multiplicação e divisão com sinal em um programa. Vamos
calcular (XY—Z2 )/L e armazenar o quociente sozinho. Os valores de X, Y, Z e L são colocados no segmento
de dados conforme mostrado no programa. Para a multiplicação, um procedimento denominado MULT é
definido e utilizado.
Exemplo 4.24
.MODELO PEQUENO
.DADOS
X DB -6
Y DB 25
Z DB 19
L DB -9
QUO DB?
.CÓDIGO
.COMECE
Neste programa, os operandos são números positivos e negativos. Façamos algumas observações.
Uma operação de deslocamento que faz diferença no resultado dependendo do sinal do operando é o
deslocamento aritmético. Existem duas instruções relacionadas a isso. i) Destino SAR, contagem – Shift
aritmética direita.
Isso é semelhante à discussão lógica de deslocamento à direita (SHR) na Seção 3.5.2, mas aqui, ao deslocar à
direita, o bit de sinal é preenchido no MSB. Esta instrução pode ser usada para dividir um número com sinal por
2, para um deslocamento cada.
MOV BL, ÿ 24 ;AL = 1110 1000
SAR BL,1 ; AL = 1111 0100, que é -12
Isso é o mesmo que shift left logic (SHL). Como o deslocamento para a esquerda não envolve nenhum bit de
sinal, o deslocamento lógico e aritmético são os mesmos. Os dois mnemônicos (SAL e SHL) significam o mesmo
e podem ser usados alternadamente.
Exceto a última, essas construções funcionam como em uma linguagem de alto nível (por exemplo, C e C++).
Para a última construção, o loop se repete até o registrador CX = 0.
Agora, vamos nos esforçar para usar essas construções em alguns programas interessantes. O Exemplo
4.25 é um programa simples que recebe dados através do teclado (sem eco) e verifica três condições.
Essas três questões são resolvidas usando as instruções IF, ELSEIF e ELSE e as mensagens apropriadas são
exibidas. O símbolo '&&' é usado para 'e' como em uma linguagem de alto nível.
Exemplo 4.25a
.MODELO PEQUENO
.DADOS
PRIMEIRO DB “O VALOR ESTÁ ENTRE 0 E 5$”
Machine Translated by Google
.CÓDIGO
.COMECE
Vamos ver o que exatamente são essas construções de linguagem de alto nível. Obviamente, eles são
convertidos em instruções de linguagem assembly. Usamos a diretiva .LISTALL para descobrir. O
Exemplo 4.25b mostra a listagem somente do segmento de código até a instrução .ENDIF.
Encontramos o código assembly equivalente para as construções de linguagem de alto nível, que neste
caso são instruções de comparação e salto.
Exemplo 4.25b
0017 B4 08 MOV AH, 08
0019 CD 21 INT 21H
.IF AL> = '0' && AL< = '5'
001B 3C 30 *
cmp al, '0'
001D 72 0E * @C0001
jb
001F 3C 35 *
cmp al, '5'
0021 77 0A * @C0001
e
0023 8D 16 0000 R LEA DX, PRIMEIRO
0027 B4 09 MOV AH, 09
0029 CD 21 INT 21H
.ELSEIF AL < = '6' && AL< = '9'
002B EB 1A * @C0004
jmp
002D *@C0001:
002D 3C 36 *
cmp al, '6'
002F 72 0E * @C0005
jb
Machine Translated by Google
0031 3C 39 *
cmp al, '9'
0033 77 0A * @C0005
e
0035 8D 16 001D R LEA DX, SEGUNDO
0039 B4 09 MOV AH, 09
003B CD 21 INT 21H
.SENÃO
003D EB 08 * @C0008
jmp
003F *@C0005:
003F 8D 16 003A R LEA DX, OUTROS
0043 B4 09 MOV AH, 09
0045 CD 21 INT 21H
.FIM SE
Exemplo 4.26
.MODELO PEQUENO
.DADOS
DAT DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ$'
MES1 DB 0DH,0AH,'CADEIA INVERTIDA: $'
DAT1 DB 27 DUP(?)
.CÓDIGO
.COMECE
MOV BX,OFFSET DAT +25 MOV ;endereço final do DAT
SI,OFFSET DAT1 MOV ;endereço DAT1
CX,26 .WHILE CX! = 0 ;contagem de carga em CX
;loop enquanto CX! = 0
MOV AL,BYTE PTR[BX] ;mover byte para AL
MOV BYTE PTR[SI],AL ;salva AL em DAT1
INC SIM
DEC BX
DEC CX
.ENDW ;fim do loop while
MOV BYTE PTR[SI + 1],'$' ;anexar string com $
MOV DX, OFFSET MES1
MOV AH,09
INT 21H
MOV DX, OFFSET DAT1 ;exibe a string invertida
Machine Translated by Google
MOV AH,09
INT 21H
.SAÍDA
FIM
Para ambos os problemas acima, as construções de linguagem de alto nível são escritas recuadas à esquerda.
Isso é feito apenas para melhorar a legibilidade do programa.
O problema acima pode ser resolvido usando a construção REPEAT … UNTIL. O loop é repetido até
CX = 0. CX tornando-se zero é a condição de parada para o loop.
Há também uma construção UNTILCXZ disponível que pode ser usada neste exemplo. A instrução
UNTILCXZ usa o registrador CX como contador para repetir um loop um número fixo de vezes. Este exemplo
pode ser reescrito usando um loop REPEAT UNTILCXZ também.
Agora, vamos ver um caso de loops aninhados. O Exemplo 4.27 mostra o caso de um loop IF aninhado
em um loop repeat-until. Neste, um caractere deve ser pesquisado dentro de uma string e o número de
ocorrências desse caractere na string deve ser encontrado. Para tornar o programa interativo para o usuário,
as mensagens solicitando o caractere e a string são exibidas usando a função DOS INT 21H 9. Tanto o
caractere quanto a string são inseridos pelo teclado. A string é terminada quando a tecla 'enter' é
pressionada. Th corresponde ao caractere de 'retorno de carro' 0DH e esta é a condição de término do loop
repeat until.
Exemplo 4.27
.MODELO PEQUENO
.DADOS
MES1 DB 0DH, 0AH, 'INSIRA O CARACTER: $'
MES2 DB 0DH, 0AH, 'INSIRA A STRING: $'
MES3 DB 0DH, 0AH, 'NÚMERO DE OCORRÊNCIAS: $'
STRING DB 50 DUP('?')
.CÓDIGO
.COMECE
MOV DX, OFFSET MES1 ;endereço
MOV AH, 09 MES1 ;exibe mensagem
INT 21H ;para o personagem
MOV AH, 01
INT 21H ;digite o caractere
MOV BL, AL ;copia caractere para BL ;endereço
MOV DX, OFFSET MES2 MES2
MOV AH, 09 ;exibe mensagem
INT 21H ;para inserir string
MOV CL, ;inicializar contador
0 .REPEAT ;repetir loop ;digitar
MOV AH, 01 string, um caractere
INT 21H ;de uma vez
Machine Translated by Google
A saída do Exemplo 4.27 para uma string e o caractere 't', inserido através do teclado é mostrado abaixo.
INSIRA O CARACTER: t
INSIRA A STRING: tyu8iolhttttfeerttt
NÚMERO DE OCORRÊNCIAS: 8
C:\masm6.14\BIN>
Agora que vimos o uso das construções de linguagem de alto nível, é óbvio que muitos de nossos
programas anteriores podem ser reescritos usando essas construções.
| As instruções de string são usadas para simplificar a codificação quando os dados em massa são movidos, digitalizados e comparados.
| Em seguida, os registradores SI e DI são usados como ponteiros para o segmento de dados e segmento extra, e o
O sinalizador de direção é usado para incremento/decremento automático.
| Procedimentos são subprogramas que são 'chamados' pelo programa principal para realizar
operações.
| Os procedimentos podem ser intrasegmentares ou intersegmentares e isso fica esclarecido na definição de um procedimento,
usando o prefixo 'perto' ou 'distante'.
| Parâmetros de e para procedimentos podem ser passados por meio de registradores, memória ou pilha.
| As macros são funcionalmente semelhantes aos procedimentos, mas agem de maneira diferente.
| As conversões de formato de número são necessárias, pois são usados números BCD, ASCII e binários
freqüentemente.
| 8086 tem instruções especializadas para lidar com operações de números ASCII e BCD.
| As construções de linguagem de alto nível do MASM tornaram a programação em linguagem assembly mais fácil.
Machine Translated by Google
PERGUNTAS
4. Qual é o registrador de ponteiro a ser usado ao usar o segmento extra em operações de string?
7. Para REPNZ CMPSB, quais são as condições sob as quais o loop é encerrado?
EXERCÍCIO
1. Escreva um programa para mover 100 palavras de 'DE' para 'TO', que são duas áreas no segmento de dados
separados por um espaço de 200 bytes.
3. Armazene uma senha na memória. Digite outra senha pelo teclado e verifique se ela corresponde à senha armazenada. A
senha inserida não deve ser exibida como tal, mas cada letra deve ser exibida como '*'.
4. Escreva um programa de string para um aplicativo que exija que os registradores de ponteiro sejam decrementados automaticamente.
8. Exiba o fatorial de três números. Resolva o problema usando macros, bem como procedimentos.
10. Digite uma sequência de caracteres pelo teclado. Salve-o na memória. Verifique se a string é um palíndromo.
11. Usando macros/procedimentos, escreva um programa para somar 2 números BCD digitados pelo teclado e exiba sua soma.
13. Existem 16 números ASCII armazenados em locais consecutivos na memória. Converta isso em um
número BCD compactado de oito bits.
14. Escreva um programa para somar dois números BCD de dez bytes. A soma deve ser exibida.
15. Dois números BCD 4093H e 2986H são armazenados na memória. Subtraia o segundo número de
o primeiro. Use a instrução DAS.
16. Escreva um programa para adicionar e exibir dois números ASCII '5678' e '3498'.
17. Divida '90' por '9'. Use o AAD e as etapas de programação necessárias.
19. Use AAM para ajudar a converter um número binário de 16 bits no AX para um caractere ASCII de quatro dígitos.
Dica Divida o conteúdo do AX-DX por 100 e use AAM.
20. Escreva um programa que verifique o número de dígitos ASCII presentes no número dado e con
converte-o para o equivalente binário correspondente.
21. Escreva um programa para converter números binários para o formato ASCII para exibição. O programa deve ter
as seguintes características:
a) Mostra o número.
b) Converta o número ASCII e armazene-o na memória.
c) Um procedimento, DISPLAY deve acessar a memória para exibir os números.
22. Existem 10 bytes assinados armazenados na memória, alguns dos quais são negativos e outros são positivos. Encontre o
maior número do lote.
23. Reescreva o Exemplo 4.26 usando as construções REPEAT … UNTIL e REPEAT … UNTILCXZ.
24. Reescreva o Exemplo 4.27 usando as construções .CONTINUE e .BREAK junto com as construções .IF e .REPEAT.
Machine Translated by Google
programação
5 conceitos - iv
| O uso das instruções de entrada/saída do 8086. | Para usar módulos assembly em uma programação C
meio Ambiente.
| A importância da programação modular.
| O uso de diretivas que facilitam
programação.
Introdução
Sabemos que o processador que usamos está conectado tanto à E/S quanto à memória. Até agora, lidamos apenas com
dados sendo lidos e gravados na memória. Acessamos dispositivos de E/S como o teclado e o monitor de vídeo, mas
para isso usamos as interrupções do DOS que são funções já escritas e testadas. Agora, vamos tentar lidar com E/S
diretamente usando as instruções do 8086. Na prática, os dispositivos de E/S não são conectados diretamente ao
processador, mas são conectados através de chips de interface que fornecem sinais de controle para o processador se
comunicar com o processador. periférico (dispositivo de E/S). Muito hardware está envolvido nisso, que será discutido
em detalhes nos Capítulos 9, 10 e 11.
WR
RESULTADO
8086
BARRAMENTO DE DADOS
PORTA
BUS DE ENDEREÇO
ENTRADA
PORTA
RD
Figura 5.1 | Portas de E/S com barramento de endereço e barramento de dados e sinais de controle de leitura e gravação
e) EM
Uso: IN acumulador, porta
Machine Translated by Google
Este é o caso quando os dados são obtidos do dispositivo de E/S – isso implica que o dispositivo é um dispositivo
de entrada. Com esta instrução, é iniciado um ciclo de máquina I/O Read e os dados no dispositivo de entrada são
transferidos para o acumulador do processador.
ii) FORA
Uso: porta OUT, acumulador
Neste caso, os dados são fornecidos a um dispositivo de saída do acumulador com o início de um ciclo de máquina
de gravação de E/S . Em ambos os casos, 'port' implica o endereço da porta, ou seja, o endereço do dispositivo de
E/S. A fonte deve ser sempre o 'acumulador', ou seja, o registrador AL se um dado de 8 bits estiver sendo
transferido, ou o registrador AX se for usado um registrador de 16 bits. Nenhum outro registro pode ser usado. Os
endereços de E/S são limitados a um tamanho de bit máximo de 16 bits. Assim, pode haver no máximo 216 portas
– pode haver 216 portas de entrada e 216 portas de saída, pois a instrução usada para entrada e saída é diferente.
Existem dois formatos disponíveis para E/S
instruções.
Exemplos
EM AL, 45H ;move dados de 8 bits para AL de uma porta de
entrada com endereço 45H
EM EIXO, 12H ;move dados de 16 bits para o AX de uma porta com
endereço 12H
SAÍDA 34H, AL ;move dados de 8 bits de AL para uma porta de saída
com endereço 34H
OUT 0FCH, AX ;move dados de 16 bits do AX para um dispositivo de
saída com o endereço FCH
De forma similar,
Exemplo 5.1
Um 8086 é conectado a duas portas com endereços de 8 bits. O endereço da porta de entrada é 67H e o
endereço da porta de saída é FEH. A porta de entrada envia dados de 16 bits para o processador.
Apenas os 12 bits inferiores devem ser transferidos para a porta de saída. Escreva as linhas de programa relevantes
para isso.
Solução
.MODELO PEQUENO
.CÓDIGO
Exemplo 5.2
Um 8086 é usado para monitorar a temperatura em 20 pontos e enviar alarmes se a temperatura em qualquer
ponto for maior que o máximo permitido. Assim, existem 20 portas de entrada para obter o valor da temperatura
(dos sensores correspondentes) e 20 portas de saída para enviar alarmes. As portas de entrada possuem
endereços que variam de EC00H a EC13H, e os endereços das portas de saída variam de 0200H a 0213H. A
temperatura máxima permitida é MAX e esta é armazenada na memória (aqui tomamos MAX = 65). O envio de
um alarme é feito transferindo o número 01 para a porta de saída correspondente.
Solução
.MODELO PEQUENO
.DADOS
TMPS DB 20 DUP(0)
BD MÁX. 65
.CÓDIGO
.COMECE
MOV CX, 20 ;contagem do número de portas
MOV BX, 0 ;BX = 0
MOV DX, 0EC00H ;endereço da primeira porta i/p no DX
EM AL, DX ;pega dados da porta de entrada para AL
Machine Translated by Google
No programa acima, os dados das 20 portas de entrada são lidos, um de cada vez, usando a instrução IN,
alterando a cada vez o conteúdo de DX. Estes são armazenados na memória de dados. Em seguida, cada um
desses valores de dados é comparado com MAX e se o valor armazenado for maior que MAX, um valor (01) é
transferido para a porta de saída correspondente que faz com que um alarme fique LIGADO. O acesso às portas
de entrada e saída é feito através do DX, cujo conteúdo é alterado conforme necessário.
Por enquanto, discutimos as instruções de entrada/saída do 8086. Nos Capítulos 9, 10 e 11, discutiremos
outros aspectos da programação de entrada/saída e aspectos de hardware associados.
Nesse caso, diferentes arquivos de montagem são testados individualmente, mas devem ser vinculados
juntos. Há muitos problemas a serem resolvidos para uma vinculação e execução bem-sucedidas.
i) Os diferentes módulos que constituem a solução podem estar em diferentes segmentos de código.
ii) Os dados que devem ser usados por um módulo podem ter que ser acessados por vários
módulos e a 'permissão' para isso deve ser indicada.
Machine Translated by Google
iii) Algumas etiquetas usadas em um módulo podem não ser encontradas nele. Nesse caso, deve haver alguma indicação
de que estes estão definidos em algum outro módulo ao qual a ligação é possível e será feita.
Para resolver esses problemas, o MASM possui diretrizes que devem ser incluídas nos programas. Vamos usar alguns
deles.
5.3.1 | PÚBLICO
Quando um item de dados ou um procedimento deve ser acessado por outros módulos, ele é declarado como PÚBLICO.
Por exemplo,
PÚBLICO num1, num2, num3 Isso ;declara que três itens de dados são públicos
Um procedimento chamado MULT pode ter acesso permitido de outros módulos se for declarado como
PÚBLICO muito
5.3.2 | EXTRN
Quando um módulo precisa usar dados e códigos que foram definidos em outro lugar, ele deve usar a diretiva EXTRN
significando que os rótulos usados neste módulo são externos ao módulo. Caso contrário, o montador dará uma mensagem
de erro de 'símbolo indefinido'. O formato geral de uso desta diretiva:
EXTRN num1:byte
EXTRN num2:palavra,num3:palavra
EXTRN multi :far ;um procedimento distante é declarado
Observação Lembre-se de que o MASM não diferencia maiúsculas de minúsculas. O uso de maiúsculas e/ou minúsculas
em todos os casos acima é apenas para melhorar a legibilidade.
Vamos agora executar um programa simples que consiste em dois módulos. Um arquivo 'moda.asm' é um programa
que utiliza dados e um procedimento definido em outro módulo. Portanto, os itens de dados que ele usa foram declarados
com EXTRN, pois não são definidos neste módulo. Após a computação, o resultado é armazenado no segmento de dados
deste módulo.
O segundo módulo é outro arquivo chamado 'modb.asm'. Este módulo contém os dados e o procedimento que o
primeiro módulo utiliza. Portanto, eles são declarados como PÚBLICOS. O que os dois módulos juntos fazem é adicionar
dois bytes – um recebido pelo teclado e outro armazenado no segmento de dados do segundo módulo. A soma é
armazenada no segmento de dados do primeiro módulo.
(Finalmente, esses segmentos de dados podem ser os mesmos.)
Agora, um ponto a ser ponderado é se ambos os módulos estão no mesmo segmento de código. Se for utilizado o
modelo de memória pequena, eles estarão no mesmo segmento de código (na montagem, isso pode ser verifi cado – o
valor de CS será o mesmo para as instruções de ambos os módulos). Se nós quisermos
Machine Translated by Google
o segundo módulo para estar em um segmento de código diferente, temos que usar modelos de memória
diferentes de tiny, small ou compact (consulte a Tabela 2.2). Vamos usar o modelo grande aqui. Esses
arquivos são montados e vinculados como mostrado. Os nomes dos arquivos correspondentes aos dois
módulos são denominados MODA.ASM e MODB.ASM.
Exemplo 5.3
MODA.ASM
FIM
MODB.ASM
ml moda.asm modb.asm
(o primeiro nome do arquivo deve corresponder ao módulo que chama os outros módulos).
Exemplo 5.4
C:\MASM6~1.14N\BIN>ml moda.asm modb.asm
Microsoft (R) Macro Assembler Versão 6.14.8444
Copyright (C) Microsoft Corp 1981–1997. Todos os direitos reservados.
Montagem: moda.asm
Montagem: modb.asm
C:\MASM6~1.14N\BIN>
Nota No arquivo de lista, o endereço das linhas de código que usam dados/programas externos tem a letra 'E' nele.
Para depuração use o comando debug moda.exe. Então a seqüência de passos de ir de um segmento de código para
o outro e retornar pode ser claramente observada.
Agora vamos examinar outro programa, que é um programa de verificação de senha. No Exemplo 5.5, há uma
senha armazenada (PW1). Outra senha é inserida através do teclado (PW2) e salva. O armazenamento da primeira
senha e a inserção da segunda usando um procedimento chamado READ, está em um módulo (5.5b). Assim as duas
senhas e o procedimento READ são declarados como PUBLIC no módulo (5.5b) significando que podem ser acessados
de qualquer módulo. O segundo módulo (5.5a) acessa essas senhas, compara-as e autentica a senha digitada caso
ela coincida com a primeira. As mensagens apropriadas são exibidas. Observe que a senha PW2 é inserida sem eco.
Exemplo 5.5a
.MODEL HUGE ;use um modelo enorme
.DADOS
MES1 DB 'SENHA ERRADA$'
MES2 DB 'PROCESSAR$'
Machine Translated by Google
Exemplo 5.5b
.CÓDIGO
LEITURA ;declara READ como público
PÚBLICA .STARTUP
LEIA PROC FAR ;defina o procedimento READ
LEA BX, PW2 ;BX para apontar para PW2
MOV DL, 6 ;DL = 6, o número de caracteres
INICIAR: MOV AH,08 ;digite o caractere sem eco
INT 21H
MOV [BX], AL ; salva o personagem na memória
INC BX ;incrementa o ponteiro de memória
DEC DL ;diminui a contagem
INÍCIO JNZ ;salta se DL! = 0
CERTO ;Retorna
Machine Translated by Google
Discutimos apenas dois exemplos com dois módulos sendo vinculados e executados. A mesma sequência pode
ser testada com muitos módulos ligados entre si.
Existem alguns programas que precisamos com bastante frequência. Por exemplo, toda vez que fazemos nossos
cálculos (em forma binária), gostaríamos de exibir nosso resultado. Neste caso, teremos que incluir o
procedimento de 'conversão e exibição de binário para ASCII' como parte de nosso programa de cálculo. No
entanto, isso pode ser feito de uma maneira diferente. Escreva o programa de conversão como um procedimento
far, em outro módulo, declare-o como 'público' e acesse-o a partir do programa de cálculo usando a diretiva
'extrn'. Isso foi feito nos Exemplos 5.6a e 5.6b. O primeiro é o módulo de chamada que acessa o segundo módulo
que contém o procedimento de 'conversão e exibição de binário para ASCII' chamado CONV. Este procedimento
é o mesmo do programa do Exemplo 3.22.
Exemplo 5.6a
Este é um programa que pega duas palavras, adiciona-as e chama o procedimento externo chamado 'CONV'
para exibir a soma.
.MODELO GRANDE
.DADOS
NÚMERO PÚBLICO
NUM DW?
DADOS1 DW 1234H
DADOS2 DW 0FC4H
.CÓDIGO
EXTRN CONV: FAR ;o procedimento de conversão está em outro lugar
.COMECE
MOV AX,DATA1
ADICIONAR EIXO, DADOS2
MOV NUM, AX
CONV. CHAMADA ;chamar o procedimento de conversão
.SAÍDA
FIM
Exemplo 5.6b
Este módulo contém o procedimento denominado CONV, que foi declarado como PÚBLICO para que outros
módulos possam utilizá-lo.
.MODELO GRANDE
.DADOS
EXTRN NUM:WORD ;NUM está definido em outro lugar
CONTAGEM DW 0
Machine Translated by Google
.CÓDIGO
CONV PÚBLICA ;declarar o procedimento como público
.COMECE
CONV PROC FAR ;conversão de binário para ASCII
MOV AX, NUM
MOV DX, 0
MOV CX, 10
REPETIR: DIV CX
PRESSIONE DX
MOV DX, 0
CONTAGEM INC
CMP AX, 0
ETC
DISP: POP DX
ADICIONAR DL, 30H
MOV AH, 02
INT 21H
CONTAGEM DE DEZ
JNZ DISP
CERTO
CONV ENDP
.SAÍDA
FIM
Nota A explicação dos passos neste programa é fornecida junto com o Exemplo 3.22.
Assim, vemos que uma aplicação importante da programação modular é a utilização de
procedimentos frequentemente utilizados que já foram escritos, testados e armazenados em um módulo
diferente.
Exemplo 5.7a
#include<iostream.h>
#include <conio.h>
int main()
{
clscr();
asm {
mover ah,01
int 21h ;digite um caractere do teclado
mov cl, al ;mover para cl
mov dl, 0ah ;caractere para 'nova linha'
mov ah, 02 ;exibe nova linha
int 21h
mov dl, 0dh ;caractere para 'retorno de carro'
mov ah, 02 int ;exibe 'retorno de carro'
21h
mov dl, cl ;exibe o caractere que foi preservado em cl
mov ah, 02
int 21h
obter();
retornar 0;
}
Outra maneira de escrever módulos assembly é usar a palavra-chave 'asm' antes de cada linha do código
assembly embutido. O Exemplo 5.7b é a versão reescrita do Exemplo 5.7a, neste formato.
Exemplo 5.7b
#include<iostream.h>
#include <conio.h>
int main()
{
clscr();
{
asm mov ah, 01
asm int 21h ;digite um caractere do teclado
asm mov cl, al ;mover para cl
asm mov dl, 0ah ;caractere para 'nova linha'
asm mov ah, 02 ;exibe nova linha
asm int 21h
asm mov dl, 0dh ;caractere para 'retorno de carro'
asm mov ah, 02 ;exibe 'retorno de carro'
asm int 21h
Machine Translated by Google
Exemplo 5.8
#include<iostream.h>
#include <conio.h>
int main()
{
clscr();
caractere a;
asm {
mover ah,01
int 21h ;digite o primeiro número com echo
mov a,al ;movê-lo para um
mov dl, '+' ;exibe '+'
mov ah, 02
int 21h
mov ah, 01 ;digite o segundo número com echo
int 21h
mov ah, 0 ;ah = 0
add al, a ;adiciona os dois números ASCII
aaa ;ajuste ASCII após a adição
add ax, 3030h ;converte a soma de volta para ASCII
mov bx, ax mov ;salva a soma ASCII em bx
dl, '=' mov ah, ;exibe '='
02
int 21h
mov dl, sutiã ;exibe o caractere ASCII superior
mov ah, 02
int 21h
mov dl, bl ;exibe o caractere ASCII inferior
mov ah, 02
Machine Translated by Google
int 21h }
getch();
retornar
0; }
Vemos que as construções de C como 'for' e 'while' podem ser usadas no shell C. O próximo programa usa um loop.
O módulo de montagem executa apenas as funções de entrada e saída de entrada e exibição. Veja o Exemplo 5.9.
Exemplo 5.9
#include<iostream.h>
#include<conio.h> int
main() { clrscr(); caracter i,j
= 2; for (i = 0; i < = 5; i++)
asm { mov al, j add al, 30h
mov dl, al mov ah, 02 int
21h } getch(); retornar 0; }
Exemplo 5.10
#include<iostream.h>
#include<conio.h> int
main() { clrscr(); char
const*MESS ="Esta é
minha casa\n$"; asm{ mov
ah, 09 mov dx, MESS int 21h } getch(); retornar 0; }
Machine Translated by Google
| No uso de uma porta de entrada, RD é o sinal de controle importante. O ciclo de máquina iniciado é o ciclo de máquina de leitura de
E/S.
| No uso de uma porta de saída, WR é o sinal de controle importante. O ciclo da máquina iniciado é o I/O. Ciclo da máquina de
gravação.
| Uma porta de E/S pode ter 8 ou 16 como largura de seu barramento de dados.
| Uma porta de E/S pode ter 8 ou 16 como largura de seu barramento de endereço.
| Existem dois esquemas de interface de E/S, ou seja, E/S mapeada em memória e E/S mapeada em E/S.
| Se o endereço for de 8 bits, deve-se usar o endereçamento de porta fixa; se o endereço for 16 bits, porta variável
endereçamento deve ser usado.
| Uma porta de E/S pode ter apenas um tamanho máximo de endereço de 16 bits.
| O 8086 pode endereçar 216 portas de entrada e 216 portas de saída. Existem directivas que permitem
programas em diferentes módulos para serem ligados entre si.
| Na programação modular, a diretiva PUBLIC indica que o referido item de dado ou procedimento é acessível a outros módulos.
PERGUNTAS
8. Por que não usamos o modelo pequeno quando temos chamadas intersegmentares?
9. Se não usarmos a diretiva EXTRN para um rótulo definido em outro lugar, qual mensagem de erro é esperada
e porque?
EXERCÍCIO
1. Em um sistema de monitoramento de temperatura 8086, quatro pontos são conectados como uma porta de entrada com endereço
56H. Se os dados nestas linhas ultrapassarem o número 1000 (binário), um alarme deve ser enviado. Isso é feito enviando o
caractere 'A' para uma porta de saída com endereço 9FC3H. Escreva um programa para isso.
2. Teste um pino de dados de uma porta de entrada continuamente. Se estiver baixo, envie um caractere 'N' para uma porta de saída
com endereço 78H e continue monitorando o pino. Quando o pino de entrada estiver alto, envie o
Machine Translated by Google
caractere 'Y' para a porta de saída e pare de monitorar o pino da porta de entrada. O endereço da porta de
entrada é 90CDH.
3. Escreva um programa que coloque dois valores na pilha (defina pilha aqui). Chame um procedimento em um
módulo diferente que acessa os valores da pilha, os soma e também os multiplica (consulte o Exemplo 4.10).
Em seguida, use um procedimento em outro módulo para exibir a soma e o produto.
Mensagens apropriadas podem ser incorporadas na tela.
4. Escreva módulos para resolver o seguinte problema. O primeiro módulo introduz a partir do teclado dois
números decimais de 'dois dígitos'. Esses números devem ser multiplicados e o produto deve ser exibido na
forma decimal (ou seja, ASCII). Assim, este módulo chama dois procedimentos externos armazenados em
dois módulos diferentes – o primeiro para converter ASCII para formato binário (consulte o Exemplo 4.17) e o
segundo para converter binário para ASCII e exibir (consulte o Exemplo 3.22).
5. Resolva este problema usando diferentes módulos que contêm procedimentos apropriados.
a) Digite 10 números decimais de dois dígitos através do teclado.
b) Converta-os para binários e armazene-os na memória.
c) Encontre o maior número.
d) Mostra o maior número.
6. Consulte o problema nº. 5 acima. Classifique os números acima em ordem decrescente e crescente e exiba os
números classificados.
o hardware
6 estrutura de 8086
Até agora lidamos exclusivamente com os aspectos de programação do 8086. Agora é hora de dar uma olhada nos aspectos de
hardware do processador.
i) 8088 possui um barramento de dados externo de 8 bits, enquanto o 8086 possui um barramento de dados de 16 bits.
ii) A fila de instruções do 8088 é de 4 bytes, enquanto o 8086 tem uma fila de 6 bytes.
iii) Para 8088, pino no. 28 (no modo mínimo) é um pino M / IO , enquanto que para 8086, a polaridade de
o pino é M / IO .
Os diagramas de pinos de ambos os processadores são apresentados nas Figuras 6.1a e 6.1b. Vemos que ambos os processadores
são empacotados como DIP de 40 pinos (pacote dual-in-line). Vê-se também que alguns pinos possuem funções duplas, e isso
corresponde a dois modos de operação – modos mínimo e máximo. O modo mínimo é usado quando o 8086/8088 é usado em
sistemas de processador único, e o modo máximo é usado quando o sistema é um sistema multiprocessador, no qual o 8086/8088 é
um dos processadores. Agora, nem 8086 nem 8088 são usados em PCs, por causa do advento do
GND 1 40 VCC
A14 A15 GND 1 40 VCC
2 39
AD14 2 39 AD15
A13 3 38 A16/S3
AD13 3 38 A16/S3
A12 4 37 A17/S4
AD12 4 37 A17/S4
A11 5 36 A18/S5
AD11 5 36 A18/S5
A10 6 35 A19/S6
AD10 6 35 A19/S6
A9 7 34 SS0 (ALTO)
AD9 7 34 BHE/S7
A8 8 33 MN/MX
AD8 8 33 MN/MX
AD7 9 32 RD AD7 9 32 RD
8088 8086
AD6 10 31 AGUARDE (RQ/GT0)
CPU AD6 10 CPU 31 RQ/GT0 (AGUARDE)
AD5 11 30 HLDA (RQ/GT1) AD5 11 30 RQ/GT1 (HLDA)
AD4 12 29 WR (TRANCAR) AD4 (WR)
12 29 TRANCAR
Figura 6.1a | Diagrama de pinos da CPU 8088 b Diagrama de pinos da CPU 8086
processadores avançados da mesma família. No entanto, discutiremos os aspectos de hardware do 8086, porque é o
processador básico da família x86 e os recursos dos processadores avançados são extensões ascendentes dos recursos
do 8086. Como tal, entender os recursos do 8086 é muito fundamental para entender os processadores avançados da
família x86.
endereço e dados, no diagrama de pinos. Vemos um conjunto de 16 pinos designados como AD. ou seja, AD0–AD15.
Estes são os pinos de endereço/dados. A notação 'AD' significa que esses pinos são usados tanto para endereço quanto
para dados. Eles são multiplexados para dados e endereço, o que significa que em um determinado momento eles
carregam endereço e em outros momentos carregam dados. A razão para ter pinos multiplexados foi necessária para
reduzir o número de pinos do chip e essa restrição foi mais rigorosa nos primeiros dias de desenvolvimento do
microprocessador. Lembre-se, 8086 tem apenas uma contagem total de pinos de 40.
Como o barramento de dados e o barramento de endereço devem ser separados e como o 'endereço' deve estar
disponível o tempo todo, as linhas de dados de endereço devem ser 'desmultiplexadas', ou seja, separadas. Isso é feito
pelo uso de travas, aproveitando também os recursos de temporização dos ciclos de barramento.
Machine Translated by Google
1 GND VCC 40
2 AD14 AD15 39
3 AD13 A16/S3 38
4 AD12 A17/S4 37
5 AD11 A18/S5 36
6 AD10 A19/S6 35
7 AD9 BHE/S7 34
8 AD8 MN/MX 33
9 AD7 RD 32
10 AD6 SEGURAR 31
8086
11 AD5 HLDA 30
12 AD4 WR 29
13 AD3 TENHO 28
14 AD2 DT/R 27
15 AD1 OS 26
16 AD0 MAS 25
17 NMI ENQUANTO 24
18 INTR TESTE 23
19 CLK PRONTO 22
20 GND REINICIAR 21
BHE/S7 BHE
8 A16/S3–A19/S6
eu
0 UMA
8 T
A0–A19
6 C
AD0–AD15 H
MAS
Barramento de endereços
Barramento de dados
D0–D15
35 a 38 Resultado
A19 / S6 – Linhas de endereço A19 a A16, que são
A16 / S3 multiplexadas com sinais de status S6 a S3 .
A função dos bits de status é a seguinte:
S6 – sempre 0
S5 – condição do sinalizador de interrupção (IF)
3
S4 e S mostram o segmento atual em
use como abaixo:
S4 S3
0 0 Segmento Extra
0 1 Segmento de pilha
1 0 Código ou nenhum segmento
1 1 Segmento de dados
(contínuo )
Machine Translated by Google
(contínuo )
Machine Translated by Google
GND —
1, 20 'Terra' – O ponto comum deve ser conectado a dois
pinos. Dois pinos de aterramento são usados para
evitar a necessidade de conectá-los internamente,
devido a possíveis ruídos no roteamento interno dos
pinos
18 DENTRO
Solicitação de interrupção - isso é usado por Input
um dispositivo externo para interromper o
processador, que responde, somente se o
sinalizador de interrupção (IF) estiver definido,
abaixando a linha INTA e iniciando uma entrada de
ciclo de máquina de 'reconhecimento de interrupção'
24 ENQUANTO
'Interrupt Acknowledge' é um sinal baixo ativo Resultado
reconhecendo a solicitação de interrupção colocada no
pino INTR
A ideia de desmultiplexação já foi discutida na Seção 6.1.2. Agora, vamos entrar nos detalhes mais finos. Para garantir que o endereço esteja disponível
na memória ou nas linhas de endereço de E/S durante todo o ciclo do barramento de leitura/gravação, as 20 linhas de informações de endereço e a
linha BHE devem ser travadas, e a saída da trava constituirá o endereço ônibus. Assim, 21 linhas devem ser travadas. Obviamente, ICs de trava
externa terão que ser usados. Uma trava IC muito popular é a trava transparente octal de três estados 74LS373. Como um IC pode atender apenas a
8 linhas, 3 dessas travas são necessárias para a desmultiplexação. A Fig 6.4 mostra o diagrama de pinos deste CI.
Machine Translated by Google
1D G 1T
2D 2º trimestre
3D 3T
4D 4T
74LS373
5D 5T
6D 6T
7D 7º trimestre
8D CO 8º trimestre
A folha de dados deste CI especifica que 'as oito travas do 74LS373 são travas tipo D transparentes, o que significa que enquanto
a habilitação (G) for ALTA, as saídas Q seguirão as entradas de dados (D). Assim, o sinal ALE é conectado ao pino G do IC. O
OC (controle de saída) é aterrado para operação normal. Caso contrário, as linhas de saída são tri-state. O IC também fornece
uma saída em buffer, o que significa que ele tem a capacidade de acionar barramentos de alta capacitância que são normalmente
encontrados e a capacidade de acionamento de corrente das linhas de endereço é aumentada para que mais cargas TTL possam
ser acionadas.
Nota A série de CIs LS (Low Power Schottky) oferece uma redução significativa na potência, bem como aumentos na velocidade
em relação ao TTL.
A Fig 6.5 mostra o diagrama completo do 8086, conectado a três chips de trava. As saídas do
travas constituem o barramento de endereços.
Na Fig 6.5, as linhas de dados D0 –D15 são mostradas disponíveis diretamente dos pinos AD0 a AD15. No entanto, na prática,
essas linhas não têm capacidade de acionamento de corrente suficiente para muitas (mais de 8 a 10) cargas TTL e a capacidade
de acionar cargas capacitivas. A maioria dos dispositivos de memória são chips MOS, que possuem entradas capacitivas, que
precisam ser carregadas ou descarregadas quando ocorrem mudanças no nível lógico. Se a saída de pinos estiver alta, o
processador não pode fornecer a corrente necessária para isso. Assim, são usados buffers/drivers de linha que aumentam a
capacidade de condução atual desses pinos. Além disso, essas linhas também devem ser isoladas quando não estiverem em
uso. Portanto, os buffers devem ser buffers de três estados.
As linhas de dados são bidirecionais – a direção depende se os dados estão sendo lidos ou gravados.
A Fig 6.6 mostra um buffer tri-state bidirecional octal popular, o 74LS245. Para 16 linhas de dados, dois desses CIs são
necessários. Dois pinos do 8086 atuam como pinos de habilitação e direcionamento a serem conectados ao buffer. A linha DT /R
é alta para escrita de dados e baixa para leitura de dados. Este pino do 8086 está conectado ao pino DIR (Direção) do buffer. Isso
fixa a direção da transferência de dados. Outro pino DEN do processador é conectado à linha Enable (G ) do buffer. Somente se
este pino estiver em nível baixo, as linhas de saída do buffer serão habilitadas, caso contrário as linhas serão tri-state. A
temporização do ciclo do barramento garantirá a ativação desses sinais no momento adequado para a transferência de dados.
Em breve chegaremos à discussão dos ciclos de ônibus.
Antes de entrar na discussão sobre a temporização do barramento, vale a pena mencionar que os sinais de controle associados
RD, WR e M/ IO também podem ser armazenados em buffer, mas como são sinais de saída enviados pelo 8086, essas linhas são
unidirecionais e portanto, o buffer IC74LS244 será suficiente para uso aqui. Isto é um
Machine Translated by Google
BHE/S7
CO BHE
A19/S6 A19
A18/S5 A18
'373
A17/S4 A17
A16/S3 A16
G
A15
A14
A13
A12
A11 Endereço
A10 Ônibus
A9
A8
A7
A6
A5
A4
A3
8 A2
0 A1
8 A0
AD15 D15
AD14 D14
AD13 D13
AD12 D12
AD11 D11
AD10 D10
AD9 D9
AD8 D8 Dados
AD7 D7 Ônibus
AD6 D6
AD5 D5
AD4 D4
AD3 D3
AD2 D2
AD1 D1
AD0 D0
MIN/MX
+5V
A1 G B1
A2 B2
A3 B3
A4 B4
74LS245
A5 B5
A6 B6
A7 B7
A8 B8
VOCÊS
buffer octal de três estados unidirecional. Assim, o diagrama do processador com o barramento de dados em buffer e os sinais
de controle é dado na Fig 6.7.
O CI gerador de clock executa algumas funções a mais do que apenas fornecer a frequência do clock ao processador.
Discutiremos apenas algumas funções básicas que estão em uso para um sistema de modo mínimo. Veja o diagrama de
conexão na Fig 6.10. Observe que o cristal está conectado entre os pinos X1 e X2 .
6.1.8 | Preparar
O pino de saída READY de 8284A é conectado ao pino de entrada READY de 8086. Este pino é usado para superar as
inconsistências de tempo que são possíveis quando um periférico/dispositivo de memória lento é conectado ao processador.
O dispositivo lento pode não conseguir concluir sua leitura ou gravação dentro do período normal de tempo do processador.
Machine Translated by Google
Ônibus
RD
1A3 1Y3 WR
WR
VOCÊ ESTÁ
8086 A1 B1 D15
A2 B2 D14
A3 B3 D13
74LS245
AD15 A4 B4 D12
AD14 A5 B5 D12
AD13 A6 B6 D10
AD12 A7 B7 D9
A8 B8 D8
AD11
AD10 G VOCÊS
AD9 Barramento
dados
buffer
em
de
AD8
AD7 A1 B1 D7
AD6 A2 B2 D6
AD5 A3 B3 D5
AD4 A4 74LS245
B4 D4
AD3 A5 B5 D3
AD2 A6 B6 D2
AD1 A7 B7 D1
AD0 A8 B8 D0
G VOCÊ
DT/R
A
RD
IORD
MEMRD
M/I0
MEMBRO
WR IOWR
CSYNC 1 18 VCC
PCLK 2 17 X1
AEN1 3 16 X2
4 15 ASYNC
RDY1
RDY2 6 13 F/C
7 12 OSC
AEN2
CLK 8 11 RES
GND 9 10 REDEFINIR
X1 X2
8284A
PRONTO
RDY
REDEFINIR
RES
CLK
CLK
REDEFINIR
PRONTO
8086
Nesse caso, ele pede tempo extra para completar sua atividade, ou seja, estados extras de 'espera' são inseridos
no ciclo do ônibus. Esses estados de espera extras são inseridos quando o sinal READY está baixo. Para periféricos/
memória lentos, um gerador de estado de espera pode ser adicionado ao sistema. Se os estados de espera não
forem necessários, READY será considerado alto quando for amostrado. No entanto, por que o READY estaria
conectado ao IC do gerador de clock? Isto é para sincronizá-lo com o sinal do relógio. READY pode aparecer a
qualquer momento, mas o 8284A o envia para o 8086 apenas na borda de fuga do relógio.
6.1.9 | Reset Um
sinal RES baixo ativo do barramento de controle é enviado para o 8284 que o sincroniza com a borda de fuga do
relógio. A maioria dos sistemas inclui uma linha que vai para todos os componentes do sistema e possivelmente
controlada por um botão do operador (ou logo após ligar), o que causa um sinal baixo no pino RES do gerador de
clock. O circuito de reset do 8284A garante que o
Machine Translated by Google
os requisitos de temporização de reset de 8086 são atendidos, ou seja, a linha RESET de 8086 deve permanecer
alta por pelo menos 4 períodos de clock. O 8086 encerrará as operações na borda alta de RESET e permanecerá
inativo enquanto RESET estiver em nível HIGH. Uma alta no pino RESET do processador faz com que todos os
componentes do sistema sejam resetados, e dentro dele, a fila de instruções, PSW, DS, SS, ES e IP são limpas.
CS obtém um valor de FFFFH e com IP = 0000, a primeira instrução será executada a partir do local FFFF0H. No
entanto, normalmente, esse endereço será encontrado em uma seção de memória somente leitura, e o código
aqui será uma instrução de salto para um programa para carregar o sistema operacional. Esse programa é
chamado de carregador de bootstrap.
a energia é ligada pela primeira vez, o 8086 deve ser reiniciado. Isso é chamado de power on reset e há um RC
Figbotão
mostra o circuito de 'power on reset'. Observe o circuito no pino RES . circuito e um interruptor de 6.11 que
também.
Suponha que o interruptor do botão de pressão esteja na condição aberta agora. Quando o 8086 é ligado pela
primeira vez, a energia é aplicada. Então o capacitor no circuito começa a carregar como mostrado na Fig 6.12.
Assim, VC aumenta e a tensão no RES aumenta.
Dentro do chip 8284, este RES é a entrada para um gatilho Schmitt invertido, conforme mostrado na Fig 6.13.
Até que a tensão VC aumente para VH, a saída do gatilho Schmitt é alta. Uma vez que cruza o valor de VH, ele
vai para baixo. O pulso alto da saída do gatilho Schmitt é o pulso RESET a ser aplicado ao 8086. Na Fig 6.13,
ele é aplicado à entrada D de um flip fl op e, portanto, aparece na saída fl ip fl op, em sincronismo com o relógio.
Especifica-se que o pulso de reset 8086 deve ser alto e deve ter um período de pelo menos 4 ciclos de
clock. Como isso é garantido? Isso é garantido simplesmente projetando a constante de tempo do circuito RC.
Vamos tentar um cálculo simples.
O gatilho Schmitt passa para baixo, uma vez que sua entrada cruza 1,7 V (conforme suas especificações).
A equação para o carregamento do capacitor é:
Vc = Vcc [1-exp (-t / RC)].
Se Vc deve ser de pelo menos 1 V, t = 50 m s e Vcc = 4,5 V, então RC = 188 m s.
Então, se C = 10 m F, então R = 18 K.
Estes estão próximos dos valores que usamos na Figura 6.11.
Com isso, estamos projetando um pulso de reset de 50 m s, que é maior do que os requisitos mínimos do
pulso de reset para a frequência de clock de 5 MHz mostrada na Fig 6.11. A redefinição
8284 8086
5MHz
X1 CLK CLK
15MHz ÷3
X2
F/C
VCC
CSYNC
10K REDEFINIR REDEFINIR
VC
RES
10UF
Reiniciar
Outros dispositivos
5V
VC
VH
REDEFINIR
PULSO
t=4T
REDEFINIR
Schmitt D
VC
FF PARA
Acionar
RES 8086
CLK
Figura 6.13 | A geração do pulso de reset usando um gatilho Schmitt (dentro do 8284 IC)
a saída do gerador de clock pode ser usada para resetar outros dispositivos no sistema junto com o
reset 8086, e seu período de tempo t = 4T (pelo menos) onde T é o período de clock do processador.
Por que o interruptor de botão? Para iniciar um novo ciclo de reset – se a chave for pressionada,
o capacitor descarrega, e para reiniciar, todo o processo deve ser reiniciado.
Ao usar um cristal para geração de frequência, o pino F/ C do IC 8284 deve ser aterrado. Se este
pino for alto, o pino EF1 deve ser conectado a um oscilador externo e um pino CSYNC é usado para
fornecer sincronização neste caso. Como estamos usando um cristal em nosso circuito, os pinos F/ C
e CSYNC estão aterrados na Fig 6.11.
Machine Translated by Google
mencionado que todas as atividades no barramento do sistema são sincronizadas pelo relógio do
sistema que fornece o tempo básico. Agora, quais são as atividades no ônibus?
Vamos listá-lo.
i) Leitura da memória / IO
Estas são obviamente duas atividades fundamentais de ônibus. Dependendo do tipo de atividade, diferentes sinais de
controle são ativados. Qualquer ciclo de leitura ou escrita é chamado de ciclo de barramento. Para 8086, um ciclo de
barramento leva 4 estados T, onde um estado T é definido como o 'período' do relógio. Se a frequência de clock for 10
MHz, um estado T = 0,1 m s ou 100 ns. Um ciclo de barramento também é chamado de ciclo de máquina. Durante um
ciclo de máquina, uma operação específica – digamos, leitura ou escrita é realizada. Assim, podemos ter os seguintes
ciclos básicos de máquina:
e) Leitura de memória
Há também o 'Ciclo de máquina de reconhecimento de interrupção', mas isso será discutido no Capítulo 8.
Seção 0.2.5, foram listadas as etapas envolvidas em um ciclo típico de leitura da máquina . Vamos relembrá-los.
i) Colocar no barramento de endereços, o endereço do local cujo conteúdo deve ser lido. Esta acção
é executado pelo processador.
ii) Afirme o sinal de controle de leitura que faz parte do barramento de controle.
iii) Aguarde até que o conteúdo do local endereçado apareça no barramento de dados.
v) Desative o sinal de controle de leitura. A operação de leitura terminou e o endereço no barramento de endereços não
é mais relevante.
Esta sequência é seguida no ciclo da máquina de leitura de 8086 também. No entanto, aqui, temos que examinar os sinais
exatos do processador. Muitos sinais de controle são necessários e são mostrados no diagrama de temporização. Consulte
o diagrama de temporização do ciclo da máquina de leitura na Fig 6.14 ao ler as etapas fornecidas abaixo. Este diagrama
é relevante tanto para 'leitura de memória' quanto para 'leitura de E/S'. No diagrama, o tempo é marcado na direção
horizontal e as atividades nos pinos de 8086 em pontos correspondentes no tempo são mostradas. Algumas das linhas
são sinais únicos como ALE, RD, WR etc, enquanto outras são grupos de sinais como o barramento de endereços e o
barramento de dados. M/ IO é uma linha única, que possui um dos dois estados possíveis em um ciclo de máquina.
'Linhas cruzadas' mostram que os dados nessas linhas se tornam válidos naquele momento e também que os níveis
lógicos nas linhas mudam.
Os estados T são rotulados como T1 , T2 , T3 e T4 . Cada estado T é definido a partir do nível de 50% da borda de fuga
do relógio até o próximo ponto correspondente no trem de relógio.
i) Em T1 , o endereço do local a ser acessado é colocado nas linhas AD0 a AD15 e A16 / S3 a A19 / S6 .
O BHE é alto ou baixo dependendo do tipo de dados (byte/palavra) a ser
acessado.
Machine Translated by Google
T1 T2 T3 T4
CLK
BHE/S7,
A19–A16, BHE S7–S3
A19–A16/S6–S3
Flutuador Flutuador
DE ANÚNCIOS
15–AD0
AD15–AD0 Entrada de dados
MINHA
MAS
DT/R
RD
o o
PRONTO
ii) Em T1 , o sinal ALE fica alto por um ciclo de clock, e em sua borda de fuga, a informação de endereço é travada e disponível
na saída das travas (Consulte a Seção 6.1.2).
iii) Se for uma 'leitura de memória', o sinal M/ IO é alto de T1 a T4 . Se for 'I/O read', este sinal é baixo.
Também o DT/ R é baixo de T1 a T4 indicando que os dados devem ser 'recebidos' pelo processador (já que é um ciclo de
leitura).
iv) Em T2 , as informações de endereço são removidas de AD0 para AD15 e o barramento é tri-state (floated). As informações de
endereço são removidas de A16 / S3 para A19 / S6 e BHE / S7 também, e essas linhas agora carregam informações de
status.
v) Em T2 , o sinal RD (que é o sinal de controle READ) fica baixo. A linha inclinada mostrada no barramento de dados é indicativa
de uma relação 'causa-efeito' – aqui, quando o sinal de controle READ fica baixo, as linhas de saída da memória saem do
estado 'flutuante'.
vi) Para um ciclo de leitura normal, os dados válidos aparecem nas linhas de dados após o período definido como o
'tempo de acesso' da memória/IO.
vii) Em T2 , o DEN fica baixo para habilitar as saídas do buffer do barramento de dados.
viii) Ao final de T2 , o sinal READY é amostrado e se estiver alto, o ciclo do barramento prossegue normalmente. Este é o caso
mostrado neste diagrama.
ix) O ciclo de clock T3 é permitir 'tempo de acesso' para trazer dados da memória/IO e colocá-los no barramento de dados. Assim,
após os dados aparecerem no barramento de dados, eles são transferidos para o 8086 (para os registradores relevantes)
no final de T3 . x) Em T4 , todos os sinais de barramento são desativados em preparação para o próximo ciclo de
barramento. Este ciclo de máquina termina com T4 e o próximo ciclo de máquina está programado para iniciar.
Machine Translated by Google
Se nenhum estado de espera for necessário, será suficiente manter o pino READY de 8086 alto.
Outra forma seria conectar os pinos RDY1 e RDY2 em baixo e os pinos AEN1 e AEN2 em alto, o que
desabilitará permanentemente esta função. Para mais detalhes sobre estes pinos, consulte a folha de
dados do gerador de clock IC 8284A. Para inserir estados de espera, o READY pode ser reduzido a
qualquer momento (Fig 6.15), mas deve ser encontrado no final de T2 .
T1 T2 T3 TW T4
CLK
PRONTO
X1 X2
CLK 8
CLK
8284A PRONTO 0
RES PRONTO
Relógio 8
REDEFINIR
Gerador REDEFINIR 6
RDY
Estado de espera
Gerador
Figura 6.16 | Inserção de um gerador de estado de espera para adicionar estados de espera
Machine Translated by Google
Exemplo 6.1
Qual é a duração do ciclo de barramento em um microcomputador baseado em 8086, se a frequência de clock for 12 MHz e
três estados de espera forem inseridos?
Solução
= 4* T = 4* 83 ns = 332 ns.
A duração dos estados de espera é, TW = 3* T = 249 ns.
Assim, o ciclo de barramento estendido Tbus-ciclo + TW = 332 + 249 = 581 ns.
i) Colocar no barramento de endereços, o endereço do local onde os dados devem ser gravados.
iii) Confirme o sinal de controle de gravação que faz parte do barramento de controle.
Para o 8086, os sinais de controle para um ciclo de máquina de escrita são os mesmos que em um ciclo READ, exceto que
WR é usado no lugar de RD . Também o sinal DT/ R será alto (para 'transmissão de dados') para escrita.
Este é o caso, o ciclo completo da máquina de gravação não é mostrado aqui – apenas o tempo de colocação do endereço
e dados nos barramentos, e a redução do sinal de controle de gravação são mostrados aqui.
Consulte a Figura 6.17. O ciclo de barramento de gravação também usa 4 estados T normalmente, mas pode ser estendido adicionando estados
de espera, se necessário.
A palavra 'interromper' implica que algo que está sendo feito deve ser temporariamente paralisado, de modo a retomar outra
atividade. Este é o caso de um processador também. Quando o processador está executando
T1 T2 T3 T4
CLK
Endereço/
Endereço Status
Status
Endereço/
Endereço Dados a serem gravados
Dados
WR
alguma atividade, um dispositivo externo pode pedir atenção colocando um sinal em uma linha de 'pedido de
interrupção'. Então o processador para o que está fazendo e atende ao pedido do dispositivo de interrupção.
Quando o processador recebe uma solicitação de interrupção na linha INTR, ele responde diminuindo o INTA
(linha de confirmação de interrupção) e entra em um ciclo de máquina de confirmação de interrupção.
NMI (Non Maskable Interrupt) é outra linha na qual um dispositivo externo pode fazer uma solicitação
de interrupção. Uma diferença entre os dois é que para que uma solicitação de interrupção na linha INTR
seja reconhecida e atendida, o sinalizador de interrupção deve ser definido (IF = 1), enquanto isso não é
necessário para uma solicitação na linha NMI. Os detalhes do processamento de interrupção serão discutidos
no Capítulo 8. Observe o diagrama de pinos (Fig. 6.2) para esses pinos. (Também discutiremos por que o
pino RESET também pode ser chamado de pino de interrupção.)
6.3.2 | DMA
DMA significa 'acesso direto à memória'. Até aqui, vimos o processador se comunicando com a memória ou
E/S, ou seja, a comunicação sempre envolvia o processador. É possível enviar dados na memória
diretamente para E/S ou vice-versa sem envolver o processador? Por exemplo, podemos precisar imprimir
um grande bloco de dados que está na memória. Esses dados podem ser enviados para o dispositivo de
saída (impressora) da memória. Nesse caso, não há necessidade de envolver o processador na transferência
de dados. Isso é chamado de 'acesso direto à memória'. No entanto, como o processador está no sistema,
ele deve ser isolado desse processo. Isso significa que, quando ocorrer DMA, a conexão do processador à
memória e E/S é bloqueada, ou seja, os barramentos do processador devem ser tri-state (no estado de alta
impedância), deixando o caminho aberto para que os dados sejam transferidos diretamente entre E/S e
memória. A Fig 6.18 mostra o cenário típico. A transferência de dados ocorre entre a memória e a E/S, em
qualquer direção. O processador não pode fazer nenhuma operação relacionada ao barramento, pois seus
barramentos estão no estado flutuante. Todo este processo é gerenciado e controlado por um controlador
DMA, que discutiremos em detalhes no Capítulo 11. Neste ponto, o que precisa ser entendido é que quando
a operação DMA deve ser feita, o controlador DMA coloca um pedido DMA em o pino HOLD de 8086. Este
é essencialmente um pedido de permissão para assumir o controle do barramento do sistema. Como o DMA
é um serviço de alta prioridade, o processador interrompe tudo o que está fazendo e reconhece a solicitação
levantando a linha HLDA (hold reconhece) e o DMA é iniciado. Veja a Fig 6.2 para esses pinos. A Fig 6.19
mostra o tempo associado ao HOLD e
MEMÓRIA
S
S
S
T
E
8086 FLUTUADOR
M
B
DENTRO
E/S
AGUARDE HLDA
DMA
T4 ou T1
Ciclos
CLK
AGUARDE
HLDA
Linhas HLDA. O pino HOLD é amostrado em cada borda de subida do clock, e o sinal de
reconhecimento é ativado no final do ciclo atual da máquina, ou seja, em Neste
T4 . estado, o endereço,
dados e pinos de controle do 8086 estão no estado de alta impedância, e isso continua até que a
solicitação HOLD seja retirada pelo dispositivo solicitante.
6.3.3 | TEST
Este pino pode ser usado como alternativa às interrupções. No entanto, normalmente, este pino
não é usado no modo mínimo de operação onde o 8086 opera em um ambiente de processador
único. No modo máximo, quando um coprocessador aritmético também está presente no sistema,
este pino é necessário para sincronizar as atividades de ambos os processadores. Os dois
processadores normalmente podem executar instruções separadas, mas se o 8086 precisar de um
resultado do coprocessador antes de prosseguir, ele executa uma instrução WAIT, que amostra o
pino TEST . Isso ocorre porque este pino está conectado ao pino BUSY do coprocessador, que é
alto quando o coprocessador está executando instruções. Então o 8086 entra em um estado ocioso
onde ele simplesmente espera até que o TESTE fique baixo (isso acontece quando o resultado
requerido é obtido do coprocessador). Depois disso, o 8086 pode continuar sua sequência normal de operações. Se o TEST
estiver baixo, a instrução WAIT é um NOP para 8086. A comunicação entre o 8086 e o coprocessador
é discutida em detalhes no Capítulo 13.
Este sinal ativo baixo é usado para ativar o banco de memória de ordem superior, cujos detalhes
são discutidos no Capítulo 7. Agora que todos os sinais no modo mínimo foram discutidos, a
configuração do modo mínimo pode ser observada e compreendida a partir da Fig. 6.20.
Outro ciclo de máquina é o ciclo de máquina HALT. O processador entra neste ciclo de máquina
em resposta a uma instrução HLT (Halt). No modo mínimo, o processador emite um sinal ALE sem
outros sinais de controle. No modo máximo, o sinal do processador faz com que o controlador de
barramento (será discutido na Seção 6.4) gere o sinal ALE. Como nenhum outro sinal é gerado, os
ciclos do barramento são interrompidos. Para tirar o processador deste estado, deve ser emitido
um sinal de interrupção ou RESET.
Machine Translated by Google
Fonte de energia
VCC GND
Endereço/barramento de dados
DENTRO
AD0–AD15, A16/S3–AS19/S6
ENQUANTO
Interromper
Interface TESTE
NMI
MAS
REDEFINIR
8086 BHE/S7
MINHA
DMA AGUARDE
DT/R Memória/E/S
Interface Ao controle
HLDA RD
VCC WR
Modo A
Selecionar PRONTO
MN/MX
CLK
Relógio
Na configuração do modo máximo, pin nos. 26, 27 e 28 são designados como S Nestes 0,
S eS .
1 2
pinos, o 8086 emite um código que especifica o tipo de ciclo de barramento a ser iniciado.
Machine Translated by Google
A listagem dos códigos, ciclos de máquina correspondentes e os sinais de controle importantes gerados pelo 8288 são mostrados na
Tabela 6.2.
1 GND VCC 40
2 AD14 AD15 39
3 AD13 A16/S3 38
4 AD12 A17/S4 37
5 AD11 A18/S5 36
6 AD10 A19/S6 35
7 AD9 BHE/S7 34
8 AD8 MN/MX 33
9 AD7 RD 32
10 AD6 RQ/GT0 31
8086
11 AD5 RQ/GT1 30
12 AD4 BLOQUEIO 29
13 AD3 S2 28
14 AD2 S1 27
15 AD1 S0 26
16 AD0 QS0 25
17 NMI QS1 24
18 INTR TESTE 23
19 CLK PRONTO 22
20 GND REINICIAR 21
S2 S1 S0
0 1 1 Parar NENHUM
1 1 1 Inativo NENHUM
Machine Translated by Google
IOB 1 20 VCC
CLK 2 19 S0
S1 3 18 S2
DT/R 4 17 MCE/PDEN
MAS 5 16 A
8288A
AEN 6 15 CEN
MRDC 7 14 ENQUANTO
AMWC 8 13 IORC
MWTC 9 12 AIOWC
GND 10 11 IOWC
8284
Relógio
Gerador
CLK MRDC
MWTC
CLK 8 2
S0 IORC
8086 S0
S1 8 IOWC
S1
S2 8 DT/R
S2 A
MAS
T4 ou T1
CLK
RG/GT
na mesma linha. Aliás, existem dois desses pinos e em um sistema de modo máximo, se as solicitações
de barramento forem recebidas em ambos os pinos, o pino RQ0 / GT0 terá prioridade. Isso pode
acontecer se houver dois outros processadores no sistema além do 8086.
6.4.4 | LOCK
Este é um sinal de saída do 8086. Se este processador quiser impedir que outros mestres de
barramento acessem o barramento, este sinal será declarado baixo. O 8086 pode usar uma instrução
com um prefixo LOCK para fazer com que o sinal LOCK do hardware seja ativado. Por exemplo, se o 8086 quiser
Machine Translated by Google
para reter o barramento até que uma transferência de string seja completada, ele pode usar a instrução (digamos)
LOCK REP MOVSB. Assim, o processador não precisa abandonar o barramento após um ciclo de barramento,
como pode ser o caso se o prefixo LOCK não for usado. Em vez disso, o barramento é retido até que a operação
de string completa termine.
Discutimos todos os pinos de modo máximo de 8086 e o diagrama, com todos os sinais de controle, é
mostrado na Fig 6.25
vamos decidir o que queremos dizer com a palavra 'ciclo de instrução'. O tempo que o processador leva
para executar uma instrução é chamado de ciclo de instrução e é especificado em termos do número de
ciclos de clock necessários para fazê-lo. No entanto, isso não é tão direto quanto parece. Vamos
examinar as questões importantes nisso. A operação da CPU é apenas 'buscar, decodificar e executar'.
Uma vez que uma instrução é buscada e está pronta para execução, ela será decodificada imediatamente,
e depois disso, a execução pode ser iniciada. O ciclo fetch-execute pode ser decomposto em 6 estágios.
CLK
Interromper S0 MRDC
Interface CLK S1 MWTC
DENTRO S2 8288 IORC
S0
TESTE Ônibus IOWC
NMI S1 Controlador
ENQUANTO
REDEFINIR
S2 A
DT/R
MAS
MAS
DT/R
8086
A
MIN/MX AD0–AD15–
A16/S3–A19/S1
TRANCAR
BHE
RD
PRONTO
QS1, QS0
Ônibus local
Ao controle
RQ1/GT1 RQ0/GT0
FI – Instrução de busca
DI – Instrução de decodificação
O tempo para todas essas atividades deve constituir o 'ciclo de instrução'. Se, por exemplo, buscarmos uma instrução
ADD que é uma instrução de 2 bytes, os primeiros 8 bits especificam esta operação. Os outros bits identificam os
operandos de origem e destino de nossa instrução. A instrução ADD pode ter um operando de memória ou um operando
imediato. Se um endereço de memória ou operando imediato for especificado, haverá bytes opcionais seguindo a instrução
que deverá ser buscada. Pode haver também a necessidade de calcular o endereço do operando. A BIU irá separar o tipo
de operação dos operandos e buscar quaisquer operandos da memória se necessário, e após isso, a execução é feita. Na
fase de execução, qualquer instrução envolvendo carregamento ou armazenamento na memória causará um ciclo de
leitura ou gravação.
Uma instrução que movimenta dados apenas entre dois registradores, ou deve executar uma instrução mais complicada
com operandos disponíveis dentro do processador, é feita apenas na Unidade Lógica e Aritmética (ALU).
Agora, vamos olhar para o 'ciclo de busca de instruções' mais uma vez. A instrução está na memória e buscá-la
requer um ciclo de 'leitura de memória' que leva 4 estados T. No entanto, em 8086, 'buscar e executar' são sobrepostos,
ou seja, as instruções são buscadas durante a fase de execução de uma instrução anterior e, portanto, a instrução atual
está normalmente disponível na fila de instruções quando está pronta para execução. O resultado é que, na maioria dos
casos, o tempo normalmente necessário para buscar instruções “desaparece”, pois a Unidade de Execução (EU) executa
instruções que já foram pré-buscadas pela BIU. Assim, o tempo do ciclo de instrução não inclui o tempo necessário para
buscar a instrução. Entretanto, para instruções que possuem operandos de memória não especificados diretamente, há
um tempo envolvido no cálculo do 'endereço efetivo'. Tome o caso de um modo de endereçamento, por exemplo, modo
indexado baseado ou modo indexado baseado em relativo. A BIU leva tempo para fazer o cálculo do endereço, e esse
tempo também é incluído no ciclo de instrução.
Outro fator para que ocorra um atraso extra é se um operando que é uma palavra cujo endereço está alinhado com
um endereço ímpar, tem que ser acessado. Nesse caso, pode ocorrer mais um ciclo de leitura/gravação na memória, em
comparação com uma palavra que está em um endereço par (a mecânica disso é discutida no Capítulo 7). Isso não é
levado em consideração nos cálculos seguintes.
Agora, observe alguns tempos de execução na Tabela 6.3. Nas três primeiras instruções, todos os operandos são
operandos de registradores, e o tempo de execução é apenas o tempo necessário para realizar a operação na ULA.
Observe que o MUL requer bastante tempo comparado ao ADD, porque é uma instrução complexa que envolve muitas
etapas. A quarta instrução está no modo de endereçamento imediato. Na quinta instrução, há um operando de memória e
o tempo de execução é dado como 9 + EA, onde EA é o tempo de cálculo do endereço efetivo. O valor de EA para
diferentes modos de endereçamento é dado na Tabela 6.4. Para as instruções 6 e 7, os tempos de execução são 16/4 e
17/5. Essas instruções são instruções de desvio condicional. A primeira figura dá o tempo de execução se a ramificação
for tomada e o segundo número corresponde ao caso em que a ramificação é encerrada. Quando um desvio é feito, a fila
de instruções deve ser limpa e recarregada.
É por isso que se gasta mais tempo quando se pega um 'ramo', em contraste com o caso de execução na sequência
normal.
Em suma, se todas essas informações forem fornecidas, estaremos em condições de calcular o 'ciclo de instrução'
de uma instrução e observar que o tempo para 'busca de instrução' não precisa ser
Machine Translated by Google
2 MOV AX, BX 2
3 MUL BX 133
4 MOV BX, N 4
2 Registro indireto 5
3 Registrar parente 9
aqui incluído. Os tempos de ciclo de instrução para cada instrução estão incluídos junto com o conjunto de instruções, no
Apêndice C.
Quantos ciclos de clock são necessários para executar o segmento de programa acima? A instrução MOV leva 4 clocks. A
instrução LOOP leva 17 ciclos para repetir e 5 para sair do loop. Assim, temos totalmente 4 + (17 × 100) ÿ12 = 1692 ciclos
(12 é subtraído, pois a última execução da instrução LOOP leva 5 ciclos em vez de 17). Em um sistema com um clock de 12
MHz, um período de clock é de 0,083 m s, o que resulta em um atraso total de
Machine Translated by Google
140 m segundos de atraso. Observe também que a maior parte do atraso ocorre na repetição da
instrução LOOP. Assim, o atraso causado pela instrução periférica (MOV CX, 100) pode ser desprezado.
Esta ideia pode ser usada para fixar o valor de N de modo a obter um valor de atraso desejado. Para
aumentar o atraso, podemos usar a instrução NOP (Sem operação) que não possui operandos e nenhuma
função exceto executar dentro de 3 ciclos de clock. A instrução NOP é normalmente usada para reservar
espaço nos programas, para instruções que podem precisar ser adicionadas posteriormente. Aqui nós o
usamos para criar um atraso – qualquer número de instruções NOP pode ser adicionado.
Exemplo 6.2
Escreva um programa para criar um atraso de 1 ms.
Solução
Instrução Nº de ciclos
MOV CX, N 4
AQUI: NOP 3
LOOP AQUI 17/5
Como a maior parte do atraso ocorre dentro do loop, o total de ciclos de atraso é = [(3 + 17) × N] ÿ12.
Tempo total de atraso = 1 ms = 20 N × 0,083 m segundos
1m seg
Para atraso de 1 ms, o valor de N = = 602 ou 25AH
× segundos)
(20 0,083 ÿ
Esse valor de N se inserido no programa nos dará um atraso de 1 ms. Há uma pequena porcentagem de
erro nisso, por ter que deixar de fora as instruções periféricas, mas para a maioria das situações isso pode
ser negligenciado, pois o atraso que obtemos é apenas aproximado. O valor máximo que pode ser carregado
em um registrador é FFFFH, e se forem necessários atrasos maiores, um loop de atraso aninhado pode ser
usado como mostrado abaixo.
Exemplo 6.3
Escreva um loop de atraso com os valores apropriados da contagem para obter um atraso de 1 segundo.
Solução
O programa é
Instruções Ciclos
MOV BX, N1 4
LÁ: MOV CX, N2 4
AQUI: LOOP AQUI 17
DEC BX 2
JNZ LÁ 16
O laço interno é aquele que corresponde à instrução LOOP. Ele repete N2 vezes, que é a contagem no
registrador CX. A instrução LOOP mais alguns overheads (causados pelas instruções MOV CX, N2 e
DEC BX) repetem N1 vezes, que é a contagem do loop externo.
Machine Translated by Google
Assim, um grande atraso pode ser obtido. Para calcular N1 e N2, a melhor maneira seria fazer N2 = FFFFH e
obter um valor correspondente para N1.
Para um atraso total de 1 segundo,
Ciclos totais = N1 × [17 × N2 + 4 + 2 + 16] = N1 [22 + 17 N2]
Se N2 = FFFFH, ou seja, 65.535, o cálculo chega a 1114117 × N1
× 0,083 = 1.000.000 m s
92471,711 × N1 = 1000000
N1 = 10,81
Nota Nenhum valor é subtraído para levar em conta o número reduzido de ciclos quando um loop é encerrado. Assim,
este cálculo é apenas aproximado, mas o erro é insignificante.
Exemplo 6.4
Gere uma onda quadrada de frequência 1 KHz na porta de saída com endereço 78H
Solução
JMP NOVAMENTE
O programa acima assume que um programa chamado DELAY_1MS foi escrito e usado como um procedimento junto
com isso. Este procedimento é como os programas dos Exemplos 6.2 ou 6.3, com uma contagem que dá um atraso de
1 ms.
Se um CRO estiver conectado a qualquer pino do barramento de dados da porta de saída, uma onda quadrada
contínua pode ser observada.
Esta é uma aplicação de atraso de software, mas em casos práticos, é mais provável que usemos chips
temporizadores dedicados para gerar ondas quadradas de qualquer frequência, o que é mais fácil de programar e
fornece atrasos mais precisos.
No Capítulo 5, o Exemplo 5.2 obtém 20 valores de temperatura de 20 portas de entrada. Normalmente deve haver
um atraso de tempo entre cada medição, e um atraso de software pode ser usado lá.
Só é necessário escrever um procedimento para um atraso específico e chamar esse atraso entre cada medição.
Detalhes mais detalhados de como exatamente isso é feito serão discutidos no Capítulo 9.
Machine Translated by Google
| Os processadores 8088 e 8086 são semelhantes na maioria dos aspectos, exceto por três diferenças.
| Existem dois modos de operação para o 8086, que são designados como modo mínimo e
modo máximo.
| O barramento de endereços do processador é multiplexado com o barramento de dados e, portanto, para usar esses
barramentos separadamente, a desmultiplexação deve ser feita.
| O barramento de endereço, barramento de dados e barramento de controle devem ser armazenados em buffer para aumentar a capacidade de condução do
os onibus.
| Um gerador de clock externo é usado para fornecer o clock e sincronizar os sinais de reset e pronto com o clock.
| Um ciclo de máquina é uma atividade de barramento durante a qual uma operação específica é executada.
| Os estados de espera são inseridos nos ciclos da máquina para acomodar memória lenta ou periféricos.
| Existem pinos no 8086 nos quais outros processadores podem solicitar o serviço do barramento do sistema.
| É importante saber quantos ciclos são gastos para a execução de cada instrução.
| O atraso causado pela execução da instrução pode ser usado para criar loops de atraso.
PERGUNTAS
1. Liste as diferenças entre 8086 e 8088.
3. Por que os buffers/drivers de linha são usados nas linhas de endereço, dados e controle?
18. Quais são os sinais de controle que não estão disponíveis no 8086 no modo máximo?
19. Por que o tempo para buscar uma instrução não está incluído no tempo do ciclo de instrução de
uma instrução?
EXERCÍCIO
1. Desenhe o barramento de dados de multiplexação e buffer, barramento de endereço e os sinais de controle de leitura/gravação
com travas e buffers conectados.
2. Desenhe um diagrama lógico usando portas NAND para obter os sinais IORD, IOWR , MEMRD e MEMWR de
os três sinais do processador M/IO , RD e WR .
3. Desenhe um ciclo de máquina de gravação de memória mostrando o estado de todos os sinais importantes.
6. Em um ciclo típico de máquina de gravação, liste as atividades que ocorrem durante cada um dos quatro estados T.
8. Escreva um programa para gerar uma onda quadrada no LSB do barramento de dados de uma porta de saída com
endereço F767H.
memoryandi / o 7
decodificação
Introdução
No capítulo anterior, discutimos a estrutura de hardware do 8086 e alguns CIs que devem ser usados junto com
ele. Agora vamos nos aprofundar um pouco – o foco deste capítulo será na forma como a memória e a E/S são
conectadas ao processador.
Comecemos pela memória. Sempre que falávamos sobre ler ou escrever de memória, referia-se a um
endereço. Assumindo que a memória é organizada em bytes, pensa-se que cada local na memória que pode
armazenar um byte de dados tem um endereço único. O espaço de endereço total de 8086 é de 00000 a FFFFFH.
Como é que cada local recebe um endereço único?
Outra questão é que o espaço de endereçamento total de 1 MB não é obtido como um único chip de RAM –
também não é inteiramente RAM. A ROM também faz parte da memória e vários chips de RAM e ROM juntos
constituem a memória total, ou seja, o espaço total de endereço.
Além disso, quando o processador é usado, seu espaço de endereço é particionado de forma que
determinados intervalos de endereços sejam padronizados para determinadas aplicações específicas. Assim, o
IBM PC tem um mapa de memória padrão – se não for padronizado, é provável que surjam problemas de
incompatibilidade. Este capítulo tenta encontrar respostas para todas essas dúvidas e questionamentos. A
suposição aqui é que o espaço de memória e o espaço de E/S são disjuntos (consulte o Capítulo 5), ou seja, o
esquema de interface de E/S usado é 'E/S periférica ou isolada'. Isso permite que a memória use todo o 1 MB de espaço para si mesma.
de endereço (A0 a ANÿ1 ) depende do número de localizações que contém. Por exemplo, se for
A0
D0
BATER
D M–1
AN-1
MEMBRO MEMRD
SELECIONAR
é especifi cado para ser uma RAM de 256 × 8, ou seja, tem 8 linhas de dados e uma capacidade de
armazenamento de 256 localizações – portanto, precisa de 8 linhas de endereço como 256 = 28 .Th ink dos
seguintes casos então – a 1 K × 8 RAM precisa de 10 linhas de endereço, pois 1K = 1024 = 210, uma RAM de 2
K × 8 tem 11 linhas de endereço e assim por diante. Assim, é a capacidade do chip que decide o número de linhas de ende
Chegando aos outros pinos dos chips, os sinais baixos ativos WE devem ser conectados ao sinal MEMWR do
lado do processador. Somente se este pino estiver ativado, a operação de escrita pode ser feita no local
endereçado. WE habilita os buffers de três estados de entrada das linhas de dados da RAM. Para leitura, o pino
MEMRD (do lado do processador) deve ser conectado ao pino OE (output enable) do chip de memória para
leitura. Quando este pino está baixo, as linhas de saída são ativadas; caso contrário, eles permanecem tri-state.
Assim, o OE destina-se a habilitar os buffers de três estados de saída da RAM.
Alguns dispositivos de RAM têm apenas um único pino para leitura ou escrita, que é R / W. Isso é bom,
pois é óbvio que apenas uma das atividades (leitura ou gravação) pode ocorrer por vez. O pino CS (chip select)
ou CS (chip enable ou S (Select)) é o pino que habilita o chip de memória. Nenhuma atividade é possível se
este pino estiver inativo, pois o chip permanece desligado. Como esse pino é ativado? Será ativado somente se
o endereço colocado no barramento de endereços do processador for um dos endereços da faixa de endereços
deste chip. Quando esta condição é satisfeita, um pulso de seleção é obtido da saída do 'decodificador de
endereço' e o chip de memória é ligado para leitura ou escrita. É durante um ciclo de leitura ou escrita de
memória que o pulso de seleção é obtido, ou seja, quando é necessária a leitura ou escrita no chip específico e
o endereço é colocado no barramento de endereços.
Um chip ROM é semelhante, exceto que não possui o pino WE , pois só pode ser lido. As ROMs utilizadas
geralmente são as EPROM, que possuem um pino para permitir a programação do chip (PGM).
Você deve ter notado que a maioria dos sinais de controle discutidos aqui e nos capítulos anteriores estão ativos
em nível baixo. Este é um conceito TTL. As capacitâncias parasitas dos pinos de controle podem ser carregadas
por tensões de ruído, e isso pode fazer com que os sinais ultrapassem o limite de nível 'alto' conforme definido
para TTL - portanto, se os sinais de controle estiverem ativos em alto, isso pode causar disparos incorretos .
Por outro lado, um disparo de sinal baixo ativo acontecerá somente quando a linha for baixada deliberadamente
pelo controlador.
Machine Translated by Google
Exemplo 7.1
Quantas linhas de endereço e dados são necessárias para os chips de memória com a
seguinte organização? e) 256 × 4
1K × 16 iv) 32 K
× 8 v) 128 K × 8
Solução
i) 256 × 4 significa que tem 4 linhas de dados e 256 posições de memória, cada uma com 4 bits de largura. 256 = 28 .
Assim, são necessárias 8 linhas de endereço.
ii) 512 × 8
iii) 1K × 16.
iv) 32 K × 8
v) 128 K × 8
na qual um chip de memória de 2 K × 8 é mostrado. Este chip de memória possui 11 linhas de endereço, que são conectadas
diretamente às 11 linhas inferiores do barramento de endereço do processador. Agora as 9 linhas restantes do barramento de
endereços do processador são conectadas às entradas de uma porta NAND cujo pino de saída alimenta o pino CS do chip de
memória. Assim, é óbvio que o chip é selecionado (habilitado) apenas se todas as linhas de entrada da porta NAND forem
altas – o que significa que A11–A19 do endereço tem que ser alto para que o chip de memória seja selecionado e ativado . A
porta NAND funciona assim como o decodificador de endereço para a memória. Ele fixa o intervalo de endereços do chip.
Exemplo 7.2
i) Descubra o intervalo de endereços que o chip de memória na Figura 7.2 contém. ii) Repita o mesmo
A0
8086
A0–A10
A10 MEMÓRIA
Endereço
Bus
de
A11 2K x 8
A19
CS
SELECIONAR
o
A19 o
A18 o
A17 o
o
A16 SELECIONAR
o o
A15
o
A14
A13 o
A12 o
A11 o
Solução
As linhas de endereço de A10 a A0 podem variar de 000 0000 0000 a 111 1111 1111. As linhas de
endereço A19 a A11 devem ser sempre 1111 1111 1 para que este chip seja selecionado. Como tal, o
intervalo inferior e superior dos endereços no chip são vistos como:
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 1 1 1 1 1 1 1 1 0 0 0 0 000000 0
1 1 1 1 1 1 1 1 1 1 11 1 111111 1
Assim, o intervalo de endereços do chip é FF800H a FFFFFH ou seja, 2048 bytes ou seja, 2 K bytes.
Machine Translated by Google
Se a lógica na porta NAND for modificada como na Fig 7.3, a faixa de endereços será:
para
• Assim, a idéia básica da decodificação de endereço é decodificar as linhas de endereço extra não utilizadas do
processador para especificar o intervalo de endereços.
• Quando mais chips devem ser interfaceados, decodifique as linhas de endereço extras para um intervalo diferente para
cada grupo.
• Qualquer porta lógica/lógica pode ser usada para realizar a decodificação de endereços. A partir da saída do decodificador
de endereço, o valor lógico correto deve ser obtido para ligar o chip. Assim, o pulso de 'seleção' obtido da lógica de
decodificação de endereço pode ser alto ou baixo, dependendo do requisito do pino de seleção do chip do chip de
memória.
Os primeiros dois tipos de decodificadores de endereço serão discutidos em detalhes aqui. O último tipo segue o mesmo
princípio – apenas, os dispositivos utilizados são 'programáveis' ou 'reprogramáveis'. Isso traz mais fl exibilidade ao design.
O projeto do decodificador de endereços é então feito usando técnicas avançadas de projeto envolvendo linguagens de
descrição de hardware e ferramentas CAD. Isso está além do escopo deste livro e, portanto, não é abordado aqui.
Exemplo 7.3
Projete um decodificador de endereço usando lógica OR para uma RAM de 32 K × 8. Encontre o espaço de endereço deste
chip de memória.
Solução
A Fig. 7.4 mostra a 'lógica de decodificação' do endereço. Como é uma RAM de 32 K, possui 15 linhas de endereço. Assim,
as 15 linhas inferiores do barramento de endereço do processador são conectadas às linhas de endereço da RAM.
As 5 linhas superiores A15–A19 são usadas para decodificação de endereço. Aqui as linhas são dadas como entrada para
a porta OR. Quando o endereço no barramento de endereço corresponde a A15 a A19 estando todos em 0 lógico, o
decodificador dá o pulso SELECT ao pino CS do chip de memória e assim ele é selecionado.
O endereço mais baixo é:
32K x 8
A0 D0
Barramento de dados
Barramento de endereços BATER
A14 D15
CS
A19
SELECIONAR
A15
Exemplo 7.4
Encontre o espaço de endereço dos seguintes chips com o circuito de decodificação de endereço, conforme
mostrado nas Figs 7.5a e 7.5b.
e) 8K × 8 EPROM
ii) 8K × 8 RAM
Solução
Ambos os chips de memória são de 8 K de capacidade. Portanto, eles têm 13 linhas de endereço. As 7 linhas restantes do
barramento de sistema do processador são usadas para decodificação de endereço.
i) Na Figura 7.5a, para que o chip EPROM seja selecionado, os valores de A19 a A13 devem ser 1111 101.
Assim, os endereços mais baixo e mais alto no chip:
para
ii) Na Figura 7.5b, para o chip de RAM a ser selecionado, os valores de A19 a A13 são 0001 111. Assim, os
endereços mais baixo e mais alto no chip:
para
A0 PGM A0
A0 A0
EPROM BATER
D0 D0 D0 D0
8K x 8 8K x 8
A12
A12 A12 D7
A12 D7
D7 D7
VOCÊ ESTÁ CS VOCÊ ESTÁ NÓS CS
A19 o
A18 o o
A19
A17 o SELECIONAR
A18 SELECIONAR
A16
A15 o
A17
A14
A16
A15
A13 o
A14
A13
Figura 7.5a | EPROM com decodificador de endereço b RAM com decodificador de endereço
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
1 1 1 1 1 1 1 1 1 0 0 0 0 000000 0
1 1 1 1 1 1 1 1 1011 1 111111 1
Machine Translated by Google
(uma)
Y0 o
UMA
Selecionar
B Y1 o
Entradas 7
C Y2 o
4
Y3 o
eu
S Y4 o
1 Y5 o
G2A 3 Y6 o
Permitir
8
G2B Y7 o
Entradas
G1
(b)
Entradas
Permitir Selecionar Saídas
G1 G2* CBA Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
X H X X X H H H H H H H H
eu X X X X H H H H H H H H
H eu eu eu eu eu H H H H H H H
H eu eu eu H H eu H H H H H H
H eu eu H eu H H eu H H H H H
H eu eu H H H H H eu H H H H
H eu H eu eu H H H H eu H H H
H eu H eu H H H H H H eu H H
H eu H H eu H H H H H H eu H
H eu H H H H H H H H H H eu
A10
A11
A12
1 1 0
UMA BC CS
A13
o 7 o
A14 G2A Y3
4
eu
A15
o S
A16 G2B BATER
1
1K×8
3
A17
G
8
A18 1
A19
A0–A9
O intervalo de endereços é
para
Subtraindo FF800H de FFFFH, obtemos 3FFH que é 1023, o que significa que existem 1023 + 1 endereços neste
chip. Assim, existem localizações de 1024 bytes (1 K) no chip.
Exemplo 7.5
A figura mostra uma RAM e uma ROM conectadas a um decodificador de endereços, que é um decodificador de 3 a
8. Encontre o espaço de endereçamento de cada um desses chips.
Solução
Apenas 4 linhas do barramento de endereço devem ser usadas para decodificação de endereço, pois as 16 linhas restantes
devem ser conectadas a cada um dos chips de memória de 64 K.
Para a ROM, A19 a A16 devem ser 1001 (A19 = 1, CBA = 001). Assim, o intervalo de endereços deste chip é de
90000H a 9FFFFH. Da mesma forma, para a RAM, A19 a A16 devem ser 1100 (A'9 = 1, CBA =
100). Assim, o intervalo de endereços deste chip é C0000H a CFFFFH.
ROM
A0–A15
64K×8
AB C
CS
SELECIONAR
o
A19 G1 Y1
G2A
Y4 o
G2B
BATER
A0–A15
64K×8
SELECIONAR
CS
Na conexão de hardware entre uma memória e um processador, as linhas de endereço de ordem inferior são
conectadas diretamente às linhas de endereço de memória e as linhas de ordem superior são usadas para
endereçamento. Descobrimos que em todas as nossas discussões até agora, os endereços gerados são
únicos e não criam ambiguidade. Isso também é chamado de decodificação exaustiva. No entanto, às vezes,
para reduzir o hardware usado, apenas algumas das linhas de endereço superiores são usadas para
decodificação e isso é chamado de decodificação de endereço parcial. Isso pode ser usado, se houver certeza
de que o sistema precisará de muito menos memória do que 1 MB completo do espaço de endereçamento
(veja a Figura 7.9). Aqui, dois chips de memória de 16 KB são decodificados usando apenas a condição da
linha A14 . Para a RAM, A14 deve ser 0 e para ROM, A14 deve ser 1 para que os respectivos chips sejam
habilitados. As linhas de endereço A15 a A19 são 'don't cares', o que significa que cada um desses chips pode
ser acessado usando vários endereços diferentes que serão mapeados para o mesmo local físico. Com efeito,
isso faz com que a 'memória de reversão' ou 'memória de mapeamento múltiplo' exista. Suponha que tentamos
ler a partir do local mais baixo da RAM, usamos o endereço físico 00000. No entanto, os mesmos dados
podem ser lidos usando um endereço F8000H ou E0000H. Na verdade, 32 endereços diferentes podem ser
usados para ler esses dados. Isso ocorre porque 5 bits do endereço, ou seja, A15 a A19, são 'não se importa'
25 = 32. Assim, esta é a quantidade de memória de realimentação que existe.
Isso causa algum problema? Na verdade não, mas se a memória do sistema precisar ser expandida,
o hardware terá que ser modificado. Como regra, a decodificação de endereço parcial é perfeitamente
segura para um sistema pequeno que não precisa de expansão de memória.
Exemplo 7.6
Desenhe um circuito de decodificação usando decodificação parcial para uma RAM e EPROM de tamanho 8 K × 8.
Para decodificação, use apenas as linhas de endereço A13 e A14. Qual é o tamanho de sua memória foldback?
Solução
Veja a Fig. 7.10. Para a RAM, é obrigatório que apenas as linhas de endereço A13 e A14 sejam 00.
Os endereços podem variar conforme mostrado abaixo. Como 5 linhas de endereço são 'não se importa', existem 32 linhas diferentes
adicione resses com os quais cada local pode ser acessado.
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
XXXXX 0 000 0 0 0 0 000000 0
XXXXX 0 0 1 1 1 1 1 1 111111 1
Para a EPROM, só é obrigatório que as linhas de endereço A13 e A14 sejam 11. Os endereços podem
variar conforme mostrado abaixo. Como 5 linhas de endereço são 'não se importa', existem 32 endereços
diferentes com os quais cada local pode ser acessado.
A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
XXXXX 1 100 0 0 0 0 000000 0
XXXXX 1 1 1 1 1 1 1 1 111111 1
Machine Translated by Google
A0–A13
16K × 8 16K × 8
BATER ROM
CS CS
o
A14
A0–A12
8K x 8 8K x 8
BATER EPROM
CS CS
A14 o
A13 o
Mantendo esses conceitos em mente, vejamos como a memória é organizada para o 8086. Um dado
de 16 bits pode ser obtido acessando dois chips de memória em paralelo, cada um com 8 bits cada da
palavra (veja a Figura 7.11). É assim que a memória é organizada no 8086. Uma palavra de 16 bits é
obtida pela concatenação de dois bytes em dois 'bancos de memória', ou seja, a memória é organizada em
dois bancos – um, o banco superior ou banco superior com os dados correspondente ao byte superior D8
–D15, e o outro, o banco inferior ou banco inferior que possui as linhas de dados O
D0banco
–D7 . superior também
é chamado de banco de memória ímpar, porque tem os endereços ímpares mapeados para ele – da
mesma forma, o banco inferior é chamado de banco par (veja a Figura 7.12). Lembre-se que uma palavra
de 16 bits tem um byte com endereço ímpar e um byte com endereço par. Se apenas um byte deve ser
acessado, ele pode estar no banco ímpar ou par. Assim, para ler/escrever um byte, apenas um dos
bancos deve ser acessado, mas para acessar uma palavra, ambos os bancos de memória devem
ser acessados. No segundo caso, o byte no endereço lógico fornecido e o byte no próximo endereço são
acessados. Por exemplo, se a instrução for MOV AX, [0002] os endereços lógicos envolvidos são 0002 e 0003 – um b
MEMÓRIA-1 MEMÓRIA-2
Barramento de endereços
Barramento de endereços
D0–D7 D8–D15
Barramento de dados
D0–D15
Figura 7.11 | Memória de 16 bits realizada usando dois chips de memória de 8 bits
FFFFD FFFFC
8 bits 8 bits
D15–D8
D7–D0
Endereço Ímpar Endereço par
00003 00002
00001 00000
o banco par e um byte no banco ímpar. Para uma instrução MOV AX, [0001] os endereços são 0001 e 0002 –
novamente, ambos os bancos devem ser acessados para obter a palavra completa. Como os dois bancos são
diferenciados? Um endereço par implica que o LSB de seu endereço, ou seja, A0 é baixo.
Assim, A0 pode ser usado para habilitar o banco par. Para habilitar o banco alto (ímpar), o 8086 gera um sinal
BHE (Bus High Enable) que diminui sempre que o byte endereçado estiver no banco alto (ímpar). Na Fig
7.13, veja como esses dois sinais são usados junto com a saída do decodificador de endereço, para habilitar
os dois bancos de forma independente. O BHE é habilitado se e somente se o endereço no barramento de
endereços for para acessar um byte no banco alto. É por isso que é designado como habilitação 'BUS
HIGH'. A0 é freqüentemente chamado de (BLE) (Bus Low Enable) porque é usado para habilitar o banco baixo.
A Fig. 7.13 mostra um caso em que duas RAMs de 32 K × 8 formam a memória de 16 bits. Assim, a
memória total é de 64 K × 8 bytes. 32 K RAM precisa de 15 linhas de endereço. Dos 20 bits de endereço do
barramento de endereço do processador, A0 é usado para habilitar o banco par. A1 a A15 são conectados aos
pinos de endereço A0 a A14 de cada chip de RAM. O restante das linhas de endereço é usado para
decodificação de endereço. A0 e BHE são usados para selecionar cada um dos bancos separadamente.
Agora veja a Tabela 7.1 e observe como e quando o BHE cai. O que emerge da tabela é que, para acesso
ao byte, o BHE vai alto se o referido byte estiver no banco alto (ímpar). Quando uma palavra cujo endereço
lógico é par: tanto A0 quanto BHE são baixos simultaneamente. Assim, para a leitura ou escrita de tal
palavra, é necessário apenas um ciclo de máquina.
A0
BHE
A16–A19
Endereço
Decodificador
CS CS
BATER BATER
32K x 8 32K x 8
Barramento de endereços
A1 –A15
D0–D7 D8-15
Barramento de dados
D0–D15
Figura 7.13 | Bancos de memória com o respectivo banco habilita sinais, junto com o decodificador
Machine Translated by Google
Tabela 7.1 | Status dos Sinais de Controle para Acesso ao Banco de Memória
Nº de ciclos de
Endereço Instrução típica Tipo de dados BHE A0 Banco acessado
máquina
Para acessar uma palavra cujo endereço é ímpar, são gastos dois ciclos de máquina. Consulte a instrução de exemplo MOV AX,
[0001] na Tabela 7.1. Isso significa que os endereços efetivos a serem acessados são 0001 e 0002. Quando o endereço 0001
(endereço físico correspondente a este) é colocado no barramento de endereços, A0 não é baixo. Assim, apenas o endereço do
banco superior é acessado neste ciclo de máquina.
Apenas um byte é lido neste ciclo de máquina. Para obter o próximo byte do banco par, mais um ciclo de máquina deve ser usado.
É por isso que foi mencionado (Seção 6.6) que para acessar um operando de palavra de um local ímpar, um tempo de
máquina de ciclo de máquina extra deve ser adicionado ao tempo de ciclo de instrução.
Assim, é vantajoso (em termos de velocidade) alinhar todas as palavras em endereços pares. Muitos montadores otimizados
fazem isso automaticamente. Caso contrário, existe uma diretiva chamada EVEN que faz isso.
Tome o caso quando o segmento de dados tem 7 bytes e uma palavra. Os bytes são armazenados nas posições 0000 a
0006. Obviamente, a palavra será alinhada no próximo endereço, que é ímpar. Se a diretiva EVEN for usada, o contador de
localização é incrementado em 1 e a palavra é armazenada na localização 0008. Isso é ilustrado na definição de segmento de
dados a seguir.
.DADOS
NUMS DB 7 DUP(05)
ATÉ ;incrementa o contador de localização para 0008
WDR DW 2345H
No entanto, isso obviamente desperdiça um espaço de byte e a memória é fragmentada. Esta situação não pode ser evitada se
a velocidade for otimizada.
Assim, vemos que organizar a memória em dois bancos de memória causa um fardo adicional.
Então, por que o sistema de memória é projetado dessa maneira?
O que está sendo tentado é que, quando apenas um byte for acessado, apenas o banco em que
esse byte reside, deve ser habilitado – o outro banco deve permanecer desabilitado.
Qual é o problema se ambos os bancos estiverem habilitados para todo e qualquer acesso?
A resposta é que não haverá nenhum problema no caso de uma operação de leitura, mas pode causar estragos em uma
operação de escrita. Veja os seguintes casos:
Observe a instrução acima que inicia um ciclo de leitura. É o caso de ler um byte. Apenas o banco par (baixo)
precisa estar habilitado para leitura. No entanto, mesmo que o banco alto também esteja habilitado, isso não
importa. Os dados presentes nas linhas D8 a D15 não serão utilizados pelo processador. Leva em AL apenas os
dados das linhas D0 a D7 e ignora os dados do barramento superior. No entanto, o processo de escrita cria um
problema. Observe o caso da seguinte instrução de escrita:
MOV [0000], AL
Isso deve fazer com que apenas o banco par seja habilitado. Se o banco ímpar (superior) também for habilitado,
os níveis lógicos nas linhas de dados D8 – D15 serão gravados no local habilitado no banco superior, o que não
é admissível. Assim, quando apenas um 'byte' deve ser escrito na memória, é importante garantir que
apenas um dos bancos de memória esteja habilitado.
Outra abordagem é usada para habilitar bancos de memória, gerando strobes de gravação separados.
Agora que o problema foi identificado como associado à 'escrita', há outra maneira de resolvê-lo, e é gerando
estroboscópios de gravação separados.
Podemos usar a lógica mostrada na Fig 7.14. Quando houver a necessidade de escrever um byte no banco
de ordem superior (superior), somente o sinal HWR (High write) será habilitado – da mesma forma para escrever
um byte no banco inferior, somente aquele banco será habilitado, mas para escrevendo uma palavra, ambos os
bancos são habilitados. Apenas o sinal de controle de gravação é levado em consideração – a leitura de dados
indesejados não é um problema, pois o processador retira do barramento de dados, apenas o byte que ele
precisa. Neste esquema, os sinais LWR e HWR são aplicados apenas aos pinos WR dos respectivos bancos de
memória. Sinais de seleção de banco separados do circuito de decodificação de endereço não são usados.
A Tabela 7.2 mostra o mapa de memória do IBM PC, a primeira versão do PC fabricado pela IBM com o
processador 8088, que possui um espaço total de endereçamento de memória de 1 MB. Para uma memória de 4
GB (FFFFFFFFH) do PC x86 atual, o mesmo mapeamento de memória é seguido, com RAM na extremidade
inferior e área ROM na extremidade superior.
Foi mencionado no Capítulo 5 que existem dois esquemas para interface de porta de E/S. O esquema mais
simples é 'E/S mapeada na memória', mas isso faz com que a E/S invada o espaço de endereço da memória.
Portanto, a maioria dos sistemas prefere o outro esquema que é designado como 'E/S isolada', 'E/S periférica' ou
'E/S mapeada de E/S'. Limitaremos nossa discussão apenas a esse esquema. Embora nosso processador tenha
20 bits para endereço, a E/S usa apenas 16 bits. Assim, os endereços de porta de E/S podem variar de 0000 a
FFFFH e o espaço total de E/S é de apenas 64 K, ou seja, podemos usar 65.536 endereços de E/S diferentes.
No entanto, como as instruções de entrada (IN) e saída (OUT) são separadas,
BHE
HWR
MEMBRO
LWR
A0 (BLE)
00000 a 9FFFFH 640 mil BATER RAM do usuário – com algumas áreas com alocações
especiais como 1 K (00000 a 003FFH) para tabela de
A0000H para BFFFFH 128 mil VDR RAM de exibição de vídeo com partes alocadas
para buffers de vídeo e outros aplicativos de
vídeo
C0000H para EFFFFH 192 mil ROM Área de expansão de memória para ROM
F0000H a FFFFFH 64 mil ROM BIOS ROM, disco rígido e ROM de outros periféricos
Portas de entrada
Entrada de dados
8
0
8 Saída de dados Barramento de dados
Portas de saída
pode ter 64 K portas de entrada e 64 K portas de saída. Isso é bastante, praticamente. Agora, lembre-se (Seção 5.2.1) que as portas com
endereços de porta de 8 bits usam 'endereçamento de porta fixo', enquanto os endereços de porta além disso precisam usar o 'esquema
de endereçamento de porta variável'. Veja a Fig. 7.16, que mostra que os endereços de E/S acima de 00FFH devem usar 'endereçamento
de porta variável'. A faixa inferior de endereços de E/S de 00 a FFH pode usar 'endereçamento de porta fixa'. Outro ponto a ser lembrado
é que qualquer porta pode ter um barramento de dados de 8 ou 16 bits.
A Fig 7.15 mostra as portas de entrada e saída conectadas ao barramento de dados do processo. Observe que os dados são
enviados 'out' para portas de saída e os dados são recebidos 'in' através das portas de entrada.
FFFFH
FFH
Porta fixa/porta variável
Endereçamento
0000 00
Resultado
Dispositivo
Endereço SELECIONAR
CLK
Decodificador o
Barramento de endereços
ROBUSTO
Barramento de dados
IOWR
Sistema
Barramento de dados
pulso de seleção. ii) Para escrever no dispositivo de saída, o sinal IOWR deve estar ativo. iii) Quando
ambas as condições acima são verdadeiras, os dados no barramento de dados são travados. iv) Todas as
um sistema com 8 LEDs conectados aos 8 bits inferiores do barramento de dados do barramento de dados 8086.
Os LEDs devem acender e apagar com um atraso de 1 segundo entre cada ação de comutação.
Solução
Q0
7
4
D0
D0 eu
Barramento de dados de 8086 8 LEDs
S
D7 3
D7
7
3
R
G CO Q7
A0 o
A1 e
A2
Selecionar
A3
A4
A5
A6
A7
o
IOW
O pino G precisa de um pulso de alto nível para travar os dados de suas entradas D em suas saídas Q.
OC deve ser amarrado ao terra para habilitar os pinos de saída da trava. ii) Resistores limitadores de
corrente são conectados aos cátodos dos LEDs iii) O decodificador de endereço especifica um endereço de
8 bits de F8H para a porta. iv) O programa para ligar e desligar os LEDs:
Dados do sistema
Ônibus
SELECIONAR
TSB
E
Endereço
Barramento de endereços
Decodificador
Entrada
Dispositivo
IORD
é isolado do barramento quando não está selecionado. Um simples switch pode ser uma porta de entrada, e o
teclado alfanumérico usado em PCs também é uma porta de entrada. A Fig 7.19 mostra uma porta de entrada básica.
pulso de seleção. ii) Para ler do dispositivo de entrada, o sinal IORD deve estar ativo iii) Quando as duas
condições acima são verdadeiras, o buffer tri-state correspondente é habilitado e os dados são transferidos para o
processador.
Levando em consideração todos esses requisitos, vamos projetar um sistema com dois conjuntos de switches
atuando como duas portas de entrada. O buffer tri-state 74LS244 é usado (consulte a Fig 7.20). Possui duas entradas
de habilitação baixa ativas 1OE e 2OE. Quando ambos estão baixos, os dados nas entradas A aparecem nas saídas
Y. No entanto, se os pinos de habilitação estiverem altos, a saída será tri-state.
1 VOCÊ 1 20 VCC
1A0 2 19 2OE
2Y0 3 18 1Y0
1A1 4 17 2A0
2A1 5 16 1Y1
74LS244
1A2 6 15 2A1
2Y2 7 14 1Y2
1A3 8 13 2A2
2Y3 9 12 1Y3
GND 10 11 2A3
Figura 7.20 | Diagrama de pinos funcional do buffer de três estados octal 74LS244
Machine Translated by Google
Exemplo 7.8
Encontre os endereços dos dois dispositivos de entrada mostrados na Figura 7.21 e escreva um programa para ler os dados
de cada uma dessas portas e movê-los para alguns outros registradores.
Solução
i) Dois conjuntos de 8 chaves S0 a S7 são conectados ao barramento de dados através de dois buffers tri-state e esta
configuração funciona como duas portas de entrada.
ii) O endereço das portas é de 8 bits, pois apenas as linhas de endereço A0 a A7 foram consideradas para decodificação.
O endereço da primeira porta é 7EH e o da segunda é 3EH.
iii) O endereço no barramento de endereços decide qual das portas de entrada será selecionada. O buffer tri-state garante
que a porta não selecionada seja isolada do barramento.
Assim, após a leitura de ambas as portas, as configurações do switch ficam disponíveis em BL e CL. Esses dados podem
ser usados para processamento e/ou exibição.
Até agora, usamos endereços de 8 bits para dispositivos de E/S. No entanto, os computadores pessoais também usam
endereços de 16 bits. Nesse caso, apenas o circuito de decodificação muda. Linhas de endereço A0 a A15
deve ser usado pelo decodificador de endereço para gerar o pulso de seleção do dispositivo. O outro ponto a ser lembrado
é usar 'endereçamento de porta variável' ao escrever instruções de E/S para portas com endereços de 16 bits.
Até agora discutimos apenas portas de E/S com barramento de dados de 8 bits. No entanto, o barramento de dados de 16
bits também é possível para portas de E/S. O que se torna diferente então? A resposta é que a situação é semelhante ao
caso dos bancos de memória. Lembre-se do conceito de bancos de memória. Se cada uma das portas de 16 bits também
precisa ser acessada como duas portas de 8 bits, temos que ter bancos de E/S de 8 bits. Então podemos ter bancos de E/
S também, com 8 bits no banco superior e 8 bits no banco inferior. Para ler uma palavra, ambos os bancos podem ser
habilitados, usando os bits A0 e BHE . A Fig 7.22 mostra a parte superior e
bancos de E/S inferiores.
Nota Aqui os endereços podem ter apenas um tamanho máximo de 16 bits, enquanto para a memória os endereços são de
20 bits.
A maioria das portas de E/S usadas para PCs tem dados de 8 bits de largura, mas existem portas de 16 bits, como
vídeo e portas de conversão analógica para digital. Se uma porta é, por definição, uma porta ampla de 16 bits, não são
necessários usos de sinais de seleção de banco separados – a porta pode ser selecionada diretamente pela decodificação
de endereço e pelos sinais de leitura/gravação de E/S. Isso ocorre porque os dados são sempre lidos ou escritos como uma
palavra de 16 bits, e o acesso a bytes não é necessário.
Machine Translated by Google
TSB-1
S0
7
4
eu Y0
D0 - D7
Y7
S7 S2
4
Porta-1 4
o
1OE 2OE
SELECIONAR
IORD
o
TSB-2
S0 7 Y0
4
Y7
eu
S7 S2
4
4
Porta-2
A0 1OE 2OE
o
A1
A2
SELECIONAR
A3 o
A4
A5
A6
o IORD
o
A7
Figura 7.21 | Dois conjuntos de switches atuando como duas portas de entrada de 8 bits
0005
0003 0004
0001 0002
D15 D8 D7 D0
| A E/S mapeada na memória faz com que o espaço de E/S invada o espaço de endereço de memória do
processador.
| Sinais de controle baixo ativos evitam disparos acidentais por tensões de ruído ou conexões abertas.
| O sinal BHE fica baixo quando o byte endereçado está no banco superior da memória.
| O LSB do barramento de endereços, ou seja, A0 é usado para habilitar o banco baixo de memória.
| Todas as portas de entrada precisam de um buffer de três estados para conectá-lo ao barramento do sistema.
| Todas as portas de saída precisam de uma trava para manter os dados de saída, até que sejam alterados pelo próximo OUT
instrução.
| Um endereço de E/S pode ter 16 bits de tamanho, caso em que o 'endereçamento de porta variável' é necessário para
escrever instruções de E/S.
PERGUNTAS
2. Nomeie os pinos importantes em uma RAM típica e explique a função de cada um.
3. Encontre os números de dois chips ROM padrão e dois chips EPROM, juntamente com a forma como os chips
estão organizados (quantos endereços e linhas de dados).
4. Por que os sinais baixos ativos são preferidos para uso como sinais de controle?
5. O que significa o termo 'decodificação de endereço' no que diz respeito à memória, bem como aos dispositivos de E/S?
8. Por que strobes de gravação separados são usados para bancos de memória, mas não strobes de leitura?
9. Sempre que os LEDs são conectados às linhas de saída de dados, é precedido por travas. Por quê?
10. Qual é o intervalo de espaço de endereço para E/S em um sistema baseado em 8086?
EXERCÍCIO
1. Projete um decodificador de endereço para dois chips de RAM e dois chips de ROM, cada um organizado como chips de 1K × 8.
Use portas para o circuito de decodificação e especifique o intervalo de endereços de cada chip.
2. Repita o problema acima usando o chip 74LS159 (2 a 4 decodificadores) como decodificador de endereços.
3. Usando um decodificador 3 × 8, projete a configuração de decodificação para oito chips de RAM de tamanho 8 K × 8. Indique
o espaço de endereçamento de cada chip.
4. Para os seguintes circuitos de decodificação (Fig 7.23a e 7.23b), encontre o intervalo da memória
endereços.
Machine Translated by Google
A19 O
A18
A17
A16 O
SELECIONAR
A15
A14
A13
Figura 7.23a
A19 O
O
A18 O
A17
O
A16
SELECIONAR
A15 O
O
A14
Figura 7.23b
5. Projete um sistema de memória usando decodificação de endereço parcial para 4 chips de RAM de tamanho 1K x 8 cada.
6. Desenhe um diagrama usando bancos de memória para uma memória de 16 K × 16. Desenhe o circuito de decodificação e
use strobes de gravação para habilitar os pinos WE dos bancos.
7. Projete um sistema de E/S no qual existam dois switches conectados como uma porta de entrada. O status desses interruptores
deve ser lido e alimentado aos LEDs correspondentes conectados no lado da saída. Desenhe o diagrama de hardware para
isso e escreva um programa para fazer isso. O endereço das portas deve ser projetado.
8. Projete um sistema de E/S no qual um contador de entrada conte de 0 a 9, depois volte para 0 e repita essa sequência. Esta
contagem deve ser exibida em um LED de sete segmentos. Projete a configuração com portas de entrada e saída.
Machine Translated by Google
Machine Translated by Google
a interrupção
8 estrutura de 8086
| A maneira como a tabela de vetores de interrupção é organizada | Como o teclado do PC e seu controlador estão organizados.
para 8086.
| A idéia de interrupções de software. | Como usar as interrupções do BIOS para acesso ao teclado.
Introdução
A palavra 'interromper' nos traz à mente muitas situações. Pode ser que estejamos em casa fazendo algo bastante
importante e interessante e de repente a campainha toca. Não há outra opção a não ser ir até a porta e atender a pessoa
que nos interrompeu – pode ser que o visitante precise apenas de alguns minutos do nosso tempo – mas também pode
acontecer que o visitante precise que saiamos e fazer alguma coisa para ele. Em ambos os casos, a tarefa em que
estávamos está suspensa temporariamente. Passamos algum tempo atendendo à tarefa solicitada pelo visitante, após
o que voltamos à tarefa suspensa. Esta é uma situação da vida real que acontece com bastante frequência e, sendo
seres sociais, nenhum de nós consegue fazer qualquer uma de nossas tarefas ininterruptamente.
Este é exatamente o caso do processador também. Como o processador está conectado a vários periféricos e
também porque possui vários programas armazenados em sua memória, há muito pouca chance de ele conseguir
realizar uma única tarefa sem interrupção. Além disso, realizar uma tarefa apenas quando 'solicitado' é a forma mais
eficiente de usar as capacidades do processador. Vejamos desta forma. O teclado é um periférico conectado ao
processador – isso significa que o processador espera que uma tecla seja pressionada a qualquer momento. Uma opção
é o processador fazer 'polling', ou seja, o processador continua verificando se uma tecla foi pressionada.
Quando uma tecla é pressionada, o processador passa à tarefa de identificar a tecla. No entanto, se o processador
estiver 'polling' para um pressionamento de tecla, obviamente está esperando e não fazendo mais nada. Isso é apenas
um desperdício de tempo do processador. Uma maneira melhor de organizar a configuração seria deixar o processador
fazer alguma tarefa e 'interrompê-la' somente quando uma tecla for pressionada. Quando uma interrupção 'pressionar tecla' é
recebido, o processador executa a 'rotina de serviço de interrupção' (ISR) que é o processo de identificação da
tecla que foi pressionada. Esta é, em essência, a filosofia das interrupções e ajuda a utilizar o processador com a
máxima eficiência.
As etapas i a vi constituem as ações antes de chegar à rotina de serviço de interrupção e as etapas viii a xi
ocorrem ao retornar da interrupção.
Vamos entrar nos detalhes das etapas na lista acima. Veja a Figura 8.1
R. O primeiro passo faz parte da ação de salvar o 'contexto' do programa atual. Primeiro, o status da bandeira
é salvo na pilha para recuperação posterior. Isso ocorre porque o ISR pode alterar o status das bandeiras.
B. O segundo passo é garantir que esta rotina de interrupção não seja interrompida por outras interrupções
recebidas na linha INTR. (Veremos mais adiante que para que as interrupções na linha INTR sejam
reconhecidas, é obrigatório que o sinalizador de interrupção seja definido).
C. O terceiro passo é garantir que o programa executado não pare após a execução de cada instrução (isso
acontece se o sinalizador Trap estiver definido).
Machine Translated by Google
PROGRAMA PRINCIPAL
PUSH
INT LIMPAR SE ISR
LIMPAR TF
EMPURRAR CS
ENVIAR IP
CET SRI
POP IP
POP CS
D. O quarto e quinto passos são para salvar na pilha o endereço da próxima instrução na seqüência atual, assim
como é feito no caso de uma chamada distante. Eles serão retirados da pilha após o término do processamento
da interrupção. Tanto o IP quanto o CS são salvos, porque o novo programa adotado será em um segmento
de código diferente.
E. O sexto passo é o controle sendo transferido para um local em um segmento de código diferente.
É por isso que é designado como um 'salto distante'.
F. A rotina de serviço de interrupção, que é o programa no qual ocorreu o salto, será agora retomada para
execução. A última instrução de um ISR é uma instrução IRET que causará a reversão das ações anteriores.
G. No oitavo e nono passos, primeiro o IP e depois o CS são retirados da pilha. Assim, o endereço da próxima
instrução na sequência normal está de volta nos registradores necessários.
H. Na décima etapa, o registrador de bandeira é restaurado. , e, portanto, o status original de todas as bandeiras é
É óbvio que o número de vetores de interrupção em um sistema é o mesmo que o número de interrupções
que o sistema pode processar. O 8086 tem 256 vetores de interrupção e como cada vetor é especificado
por 4 bytes, isso implica que 256 × 4 = 1024 bytes (1K) de memória são alocados para armazenar os
vetores de interrupção. Esses 256 vetores são armazenados em uma tabela chamada 'Interrupt Vector
Table' (IVT) na RAM do sistema das localizações 00000 a 003FFH, ou seja, até 0000: 03FF. Consulte a Figura 8.2a.
Cada vetor de interrupção é numerado de 0 a 255 e, como tal, cada interrupção também é numerada da
mesma maneira. Esses números, portanto, acabam sendo o que pode ser chamado de 'números de tipo'
das interrupções. Assim, existem interrupções designadas como Int 0, Int 1, Int 2……Int 255. Como é óbvio
na Fig 8.2a, esses números mostram a posição do vetor de interrupção correspondente na tabela de
vetores de interrupção. Assim, o vetor de INT 0 é a 1ª entrada no IVT o de INT 1 é a segunda entrada… o
de INT 6 é a 7ª entrada e assim sucessivamente. Como cada vetor de interrupção tem 4 bytes, a localização
de memória correspondente ao vetor de INT n é obtida como n × 4 ou seja, para INT 1, o endereço do
primeiro byte de seu vetor é 1 × 4 = 0004, para INT 0 é 0000 e assim por diante, como visto na Fig 8.2a.
Na verdade, é assim que o 8086 reage a uma interrupção com um número de tipo.
Ele multiplica o número do tipo por 4, obtém o endereço de seu vetor de interrupção e carrega IP e
CS com esses novos valores e começa a executar o ISR que localizou.
CS
INT 255 VETOR
3FC IP
000C
CS
INT 2 VETOR
0008 IP
CS
0004 INT 1 VETOR
IP
CS
INT 0 VETOR
0000 IP
CS ALTO
CS BAIXO
IP ALTO
IP BAIXO
byte
Exemplo 8.1
Encontre o endereço (no IVT) do vetor de interrupção de INT 61H. Encontre o endereço físico do ISR correspondente
a esta interrupção se o vetor for 0F00:9872.
Solução
0FH
0186H 00
98H
0184H 72H
Endereço
Foi mencionado no Capítulo 6 que após 'ligar', o processador acorda no endereço FFFF0H.
Este é o ponto de entrada para o BIOS na ROM (Ref Tabela 7.2). O BIOS contém um conjunto de rotinas que fornecem
suporte ao dispositivo. Essas rotinas verificam, verificam e inicializam vários dispositivos, e também estabelecem duas
áreas de dados, uma das quais é a tabela de vetores de interrupção das localizações 00000 a 003FFH.
Uma interrupção parece executar ações semelhantes a uma instrução CALL distante. Porém, difere em alguns pontos.
Uma interrupção faz com que o registrador flag seja empurrado na pilha além dos valores CS e IP. Ele limpa a
armadilha e os sinalizadores de interrupção. A ação de apagar os flags não está associada a uma CHAMADA, mas
faz parte da resposta automática devido a uma interrupção. Além disso, observe que o ISR termina com IRET em vez
de uma instrução RET. A instrução IRET garante que o registrador flag também seja retirado da pilha, em vez de
apenas o CS e o IP.
no endereço especificado no IVT. O que poderia ser um possível ISR para esta condição? Uma possibilidade é apenas exibir
uma mensagem indicando 'dividir estouro' e esperar que o programador corrija seus dados/programa. Outra possibilidade é
escrever como ISR, um programa que aumenta o tamanho do registrador de quociente, para que o problema seja corrigido
sem intervenção do usuário. Cabe ao projetista do sistema decidir como o manipulador de erros deve ser escrito.
Este segmento de programa configura o sinalizador de trap que faz com que INT 1 ocorra.
Nota O sinalizador Trap será redefinido como parte da resposta de interrupção, para que o ISR possa ser executado sem
parar após cada linha do programa. No entanto, ao voltar para o programa principal, quando os sinalizadores são exibidos de
volta, a condição definida do sinalizador Trap será recuperada e, portanto, a etapa única pode ser continuada para o programa
principal até que o sinalizador Trap seja redefinido novamente.
Esta é a interrupção do ponto de interrupção, que é útil para depuração. Precisaremos definir pontos de interrupção (parar
após executar um grupo de instruções) e verificar o conteúdo de registradores e memória após executar instruções até o
ponto de interrupção. Como definir pontos de interrupção é um aspecto importante da depuração, a interrupção de ponto de
interrupção é especial, pois é uma instrução de byte único com o código CCH. Quando definimos pontos de interrupção na
depuração, o que realmente está acontecendo é que esse código (CCH) é inserido e executado na posição do programa
onde o ponto de interrupção está definido. Assim como no passo único, o ISR será escrito para despejar o registro e o
conteúdo da memória na tela de vídeo.
Machine Translated by Google
A última linha deste segmento de programa pode passar o controle para o ISR escrito para INT 3, se o over flow fl ag
for definido pelo resultado da adição. Caso contrário, INTO atua como uma instrução NOP.
Os números dos tipos podem variar de 0 a 255. Esta é uma forma muito importante e interessante de utilizar
procedimentos cujos vetores são inseridos no IVT. Assim, o usuário pode escrever qualquer procedimento como um
ISR, armazená-lo em algum endereço da memória e chamá-lo usando a instrução INT n. Antes de utilizá-lo desta
forma, o usuário deve no entanto inserir os valores de CS e IP de seu ISR no IVT no local correspondente a INT n.
Antes de utilizá-lo desta forma, o usuário deve no entanto inserir os valores de CS e IP de seu ISR no IVT no local
correspondente a INT n.
As rotinas de serviço de interrupção de hardware podem ser testadas usando interrupções de software. Veja o
caso do NMI, que é uma interrupção de hardware. Isso é vetorizado para a localização 0000:0008, ou seja, corresponde
4 0000:0010 Transbordar
para digitar o número 2. A rotina correspondente a esta interrupção de hardware pode ser testada usando a
instrução INT 2. Com efeito, uma interrupção de hardware no pino NMI e a instrução de software INT 2 nos levam
ao mesmo endereço absoluto. Da mesma forma, o efeito de um erro 'dividir por zero' pode ser simulado
escrevendo a instrução INT 0 que assume o controle do ISR que foi escrito para o erro 'dividir por zero'.
O formato de uma instrução de interrupção é INT n onde n só pode ser um byte. O opcode para INT é 'CD',
novamente um byte – por exemplo INT 5 tem o opcode CD 05. Assim, uma instrução de interrupção tem 2 bytes,
exceto a interrupção de ponto de interrupção INT 3 que tem o código apenas CC. Esse recurso é dado a essa
interrupção porque a configuração de pontos de interrupção é feita com muita frequência na depuração, e ter
apenas um byte significa uma grande economia de espaço de memória.
8.4.1 | NMI
Esta é uma interrupção acionada por borda positiva, mas também é necessário ter uma duração no estado alto
de mais de dois ciclos de clock. Qualquer transição de alta velocidade de NMI é travada no chip e será atendida
no final da instrução atual. Esta é uma interrupção não mascarável, pois não depende da configuração do
sinalizador de interrupção (IF). Ele não pode ser mascarado ou impedido de ser ativado. É uma interrupção do
tipo 2, o que significa que seu vetor é obtido do local correspondente na tabela de vetores de interrupção. O NMI
atende a aplicações da mais alta prioridade, como falha de energia.
8.4.2 | DENTRO
Este é o pino de interrupção não vetorizado do 8086, o que significa que quando um pedido de interrupção é
recebido neste pino, ele não é direcionado automaticamente para nenhuma entrada específica na tabela de
vetores de interrupção. Outro recurso dessa interrupção é que o sinalizador de interrupção (IF) deve ser definido
para que uma solicitação de interrupção na linha INTR seja atendida. Quando o processador é reinicializado,
todos os sinalizadores são apagados e o IF também. Deve-se garantir que o IF seja definido pela instrução STI
se as interrupções nas linhas INTR devem ser reconhecidas.
INTR é uma interrupção acionada de alto nível. Para ser respondida, a linha deve estar alta durante o
período de clock anterior ao final da instrução atual. Durante qualquer resposta de interrupção,
Machine Translated by Google
T1 T2 T3 T4 T1 T2 T3 T4
MAS
ENQUANTO
FLUTUADOR
interrupções adicionais na linha INTR são bloqueadas, porque limpar o IF é parte da resposta de interrupção do
processador. Agora vamos ver a sequência de ações após uma solicitação de interrupção nesta linha. Ao ser
interrompido, o processador entra em um estado de 'interrupção de reconhecimento' que faz com que ocorram dois
ciclos de 'interrupção de reconhecimento de máquina'. Durante o primeiro ciclo de máquina, o endereço/
os barramentos de dados são flutuantes e o pino INTA (interromper reconhecimento) fica baixo em T2 e permanece
baixo até T4 . Esta é uma indicação para o dispositivo de interrupção de que seu pedido de interrupção foi aceito
pelo processador. No segundo ciclo de máquina, mais uma vez a linha INTA é baixa de T2 a T4, e então o dispositivo
de interrupção coloca o 'número do tipo' da interrupção nas linhas de dados inferiores (D0 a D7 ), que sai do fl oat
doença. O processador aceita esse número, multiplica por 4 e acessa a tabela de vetores de interrupção naquele
local.
Na Fig 8.3, o sinal ALE também é mostrado. Na verdade, este sinal não tem papel no ciclo INTA, mas é incluído
apenas para mostrar que no primeiro estado T de qualquer ciclo de máquina, o sinal ALE é ativado.
VCC
1
D0
0
D1 7
8 0
D2 4
0 0
D3 eu
0
8
D4 S 0
6
D5 2 0
D6 4 1
D7 4
VOCÊ É VOCÊ
ENQUANTO
o número do tipo aparece na saída do TSB, o barramento do 8086 está no estado de alta impedância e então nada
acontece. No entanto, durante o segundo ciclo de máquina, quando a linha INTA é abaixada, as linhas D0 a D7 do
processador são habilitadas, e os ajustes do switch do TSB são transferidos para as linhas de dados D0 a D7 do 8086,
constituindo o número do tipo . Assim, entende-se que essa interrupção INTR agora é vetorizada para o tipo 81H (para a
Fig 8.4).
Assim, o INTR é um pino de interrupção através do qual uma interrupção pode ser canalizada para qualquer local
do IVT e, assim, facilitar a fl exibilidade para uso em qualquer aplicação. Também é possível que mais de um dispositivo
possa colocar pedidos de interrupção nesta linha, e cada um deles pode ter que ser associado a diferentes números de
tipo. Tudo isso exige a necessidade de hardware extra para gerenciar as possíveis interrupções que chegam neste pino
de vários periféricos. Isso é feito por um chip periférico chamado Programmable Interrupt Controller (PIC) 8259, cujos
detalhes serão apresentados no Capítulo 10. O pino INTR junto com o PIC é usado em PCs para gerenciar vários
dispositivos de hardware.
Quando o pino de reset é ativado, o processador reseta e o controle desvia para o endereço absoluto FFFF0H. Assim, o
reset tem um ponteiro ou vetor específico – que é exatamente o modo como uma interrupção funciona. Assim, RESET às
vezes é incluído na lista de interrupções de hardware junto com NMI e INTR.
Para um PC, o processo de reinicialização também ocorre quando o sistema é ligado. Observemos alguns pontos
sobre 'ligar'. De fato, o endereço FFFF0H é designado como o 'vetor de reinicialização ao ligar'. Este endereço (FFFF0H)
está na ROM e contém uma instrução de salto distante para o início do 'código de reinicialização' do chip BIOS. Para
encontrar esse vetor, vá para a unidade C do prompt de comando, digite 'debug' e obtenha o conteúdo do local de
redefinição. Isso é mostrado abaixo.
C:\>depurar
-dff ff:0000
FFFF:0000 EA 5B E0 00 F0 30 36 2F-32 30 2F 30 35 00 FC 00. [...06/20/05...
Os primeiros 5 bytes, constituem o código assembly para a instrução de salto, ou seja, JMP (EA)
F000:E05B. Os próximos oito bytes foram originalmente chamados de “RELEASE MARKER” pela IBM,
Machine Translated by Google
pois eles sempre contêm a data de lançamento do código, ou seja, BI0S (que é 20 de junho de 2005 para este PC).
Veja o código ASCII deste marcador:
Considere um caso em que o INTO, NMI e INTR ocorrem simultaneamente. Por causa do mecanismo de prioridade
embutido, a interrupção interna (INTO) será usada para manutenção primeiro. Um passo na resposta de interrupção
seria desabilitar IF. Portanto, o INTR não será abordado agora.
No entanto, o NMI pode interromper o ISR atual, pois seu funcionamento não depende da configuração do IF.
Assim, o NMI interromperá o INTO ISR. O resultado final é que efetivamente o NMI é atendido antes da interrupção
interna. Isso é bom, porque o NMI atende à prioridade mais alta. Depois que o NMI ISR é processado, o INTO ISR
é executado e, depois de concluído, a solicitação no INTR é tratada.
As rotinas do DOS são mais de 'alto nível' em comparação, e usam rotinas do BIOS para acesso periférico. Agora
usaremos algumas interrupções do BIOS, a primeira delas é INT 10H, que é para aplicativos de vídeo, principalmente
relacionados à exibição de vídeo.
4 CPU - Estouro
UMA
Cascata reservada (IRQ 2) do controlador de interrupção escravo
15 Não usado
8.6.4 | História
Em 1981, a IBM lançou o MDA (adaptador de vídeo monocromático) que só podia dar uma tela em preto e
branco. Posteriormente, apareceu o CGA (adaptador gráfico colorido), que também podia processar cores.
Melhorias em relação ao CGA, para exibição em cores, são o EGA, VGA e XGA. Esses sistemas de exibição
de nível superior também podem 'emular' os inferiores. Assim, se tivermos VGA em nosso PC, também
podemos fazê-lo funcionar em um modo correspondente a MDA ou CGA. Para telas coloridas, CGA é o
menor denominador comum e aqui, usaremos o modo correspondente a este padrão, mesmo que a tela que
temos em nosso PC seja VGA ou XGA. A configuração do modo pode ser feita usando interrupções do BIOS
com números de função especifi cados. Veja o que cada uma dessas designações de exibição denota.
CGA: Este é o modo básico dos displays coloridos, vamos nos concentrar no CGA.
A Tabela 8.3 mostra os detalhes do modo de texto para CGA. Apenas os modos de texto foram mostrados e
correspondem ao padrão CGA. A VRAM mostrada na Tabela 7.2 especifica um espaço de memória na RAM
de 128 KB da localização A0000H a BFFFFH. Uma parte disso é usada para armazenar os dados a serem
exibidos. Todos os modos de cor em CGA possuem memória de vídeo para iniciar a partir do B8000H.
Veja a terceira linha que corresponde ao modo 2. Ela mostra uma tela composta por 25 linhas e 80 colunas,
o que significa que 2000 elementos podem ser exibidos na tela. Cada elemento de exibição de texto deve ter
dados de 2 bytes – um byte para o caractere ASCII e um byte para
Machine Translated by Google
o atributo de cor. Isso levará 4 KB para uma página de exibição. A memória de 16K é totalmente alocada
para isso e, portanto, 4 páginas podem ser usadas a qualquer momento. Cada exibição começa em um
limite de 4K, no endereço – B800:0000, B800:1000, B800:2000 e assim por diante. Apenas uma página
pode ser exibida por vez, chamada de página ativa, mas é possível alternar para outras páginas razoavelmente rápido.
Observe que quando a resolução da tela é menor, mais páginas são possíveis (25 × 40 dos modos 0 e 1
têm 8 páginas). Para exibição monocromática, a alocação de memória de vídeo começa em B000:0000. Em
nossas discussões à frente, usaremos a tela colorida com tamanho 25 × 80.
80 colunas
C
Aumentando os endereços de memória
(2 Bytes/Elemento)
(0,0)
C
(24,79)
Atributo Personagem
B EU Valor ASCII
INTENSIDADE
ANTECEDENTES (RGB)
PISCAR
Agora consulte a Tabela 8.5. Isso mostra as 16 cores possíveis que podem ser obtidas para o primeiro plano.
Somando R, G e B dá apenas 8 cores, mas quando a intensidade é outro parâmetro, 16 cores são obtidas. Com intensidade
somada (I = 1) e quando a intensidade não é somada (I = 0), obtêm-se duas tonalidades diferentes da mesma cor, Por
exemplo, na quinta linha da tabela, a cor especificada é vermelha com o bit I igual a 0. Para o mesmo valor de RGB, quando
I = 1, a cor fica vermelha clara. Para o fundo, apenas 8 cores são possíveis e isso é dado na Tabela 8.6.
Referindo-se à Tabela 8.4, no atributo byte, 'I' e 'B' aplicam-se apenas ao primeiro plano (texto).
'I' significa intensidade e 'B' significa piscar. O que está piscando? Piscar acontece quando o atributo de fundo é substituído
pelo primeiro plano, a cada dois segundos. Assim, no byte de atributo,
D7 D6 D5 D4 D3 D2 D1 D0
B RGB I GB
0 0 0 0 Preto
0 0 0 1 Azul
0 0 1 0 Verde
0 0 1 1 Ciano
0 1 0 0 Vermelho
0 1 0 1 Magenta
0 1 1 0 Marrom
0 1 1 1 Branco
1 0 0 0 Cinza
1 0 0 1 Azul claro
1 0 1 0 Luz verde
1 0 1 1 Ciano claro
1 1 0 0 Luz vermelha
1 1 0 1 Magenta claro
1 1 1 0 Amarelo
1 1 1 1 Branco brilhante
Machine Translated by Google
0 0 0 Preto
0 0 1 Azul
0 1 0 Verde
0 1 1 Ciano
1 0 0 Vermelho
1 0 1 Magenta
1 1 0 Marrom
1 1 1 Branco
se MSB = 1, corresponde a 'piscando'. Além disso, se as cores do plano de fundo e do primeiro plano forem as mesmas, o
caractere exibido será invisível.
Veja a atribuição de bit do byte de atributo na Tabela 8.4.
Exemplo 8.2
Encontre o byte de atributo para os seguintes casos de exibição em modo de texto.
iii) Piscando com fundo ciano com texto marrom (primeiro plano)
Solução
i) Para fundo preto, os valores RGB são 000, e como piscar não é mencionado, é 'normal'. Assim, o nibble correspondente
ao fundo é 0000. Devem ser os bits D7 a D4 do byte de atributo.
usando diferentes números de função a serem carregados em AH. Além disso, cada função requer
que vários bytes de informação sejam carregados em registradores especificados. O Apêndice D
fornece a lista de funções de INT 10H. Nesta seção, usaremos alguns deles (mas não todos) para
várias aplicações.
Esta função é para definir o 'modo de vídeo' – o número da função é colocado em AH e o modo de vídeo em
AL. Esta função é para definir o modo de vídeo. Também limpa a tela.
Exemplo 8.3
.MODELO PEQUENO
.CÓDIGO
.COMECE
Exemplo 8.4
.MODELO PEQUENO
.CÓDIGO
.COMECE
Isso rola para cima 0 linhas e uma tela em branco cheia de cor ciano é vista. Qualquer texto
escrito na tela será de cor preta. O ponto inicial é 0:0 (canto esquerdo da tela), e o ponto final é
o canto direito, ou seja, o ponto (24, 79).
Este número de função também pode ser usado para criar uma janela de tamanho desejado
dadas as coordenadas da janela.
MOV AH, 06 ;número da função
MOV AL, 9 ;número de linhas a serem roladas para cima
MOV BH, 61H ;fundo marrom, primeiro plano azul
MOV CH, 15 ;coordenada da linha inicial = 15
MOV CL, 20 ;coordenada da coluna inicial = 20
MOV DH, 23 ;coordenada da linha final = 23
MOV DL, 60 ;coordenada da coluna final = 60
O segmento de programa acima cria uma janela com as coordenadas indicadas.
Agora, se duas janelas forem criadas, repita o segmento do programa acima com um conjunto
diferente de coordenadas e uma cor diferente (para maior clareza de compreensão). Como o atributo
de uma janela permanece inalterado até que outra operação o altere, podemos definir várias janelas
diferentes ao mesmo tempo.
Há outra função 'Scroll Down screen', com a função número 07. Ela funciona de forma semelhante
à função 06, exceto que rolar a tela para baixo faz com que as linhas inferiores rolem para fora e as
linhas em branco apareçam no topo.
O segmento de programa acima exibe 'S', nove vezes começando na posição do cursor.
Machine Translated by Google
Nota Esta função não avança o cursor. Portanto, se tentarmos exibir a palavra 'Hello' na posição do cursor, os
caracteres serão exibidos um em cima do outro, a menos que avancemos o cursor após a exibição de cada
caractere.
Exemplo 8.5
O programa a seguir faz o seguinte:
i) Define o modo de vídeo e limpa a tela.
Solução
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AH, 06 ;número da função para rolar para cima ;nº de linhas =
MOV AL, 10 10
MOV BH, 61H ;fundo marrom, primeiro plano azul
MOV CH, 5 ;coordenada da linha inicial = 5
MOV CL, 20 ;coordenada da coluna inicial = 20
MOV DH, 14 ;coordenada da linha final = 14
MOV DL, 60 ;coordenada da coluna final = 60
INT 10H ;cria a janela de rolagem
Você pode notar que este programa usa todas as funções do BIOS 10H discutidas anteriormente para limpar a
tela (AH = 0), criar uma janela de rolagem (AH = 06), definir a posição do cursor (AH = 02) e exibir o caractere '*'
na posição do cursor (AH =
09) 10 vezes.
Machine Translated by Google
Lembre-se de que a posição do cursor não avançou por isso. Então, como escrevemos uma
sequência de caracteres diferentes? Devemos fixar um valor inicial para a posição do cursor e então
avançar o cursor para cada novo caractere a ser exibido.
Exemplo 8.6
Escreva um programa para exibir 'HELLO' verticalmente para baixo no centro da tela.
Solução
Aqui devemos exibir uma string verticalmente para baixo. Para isso faremos o seguinte:
ii) Em seguida, incremente a coordenada de linha do cursor e exiba o próximo caractere ali.
Repita isso para toda a corda.
iii) Para evitar escrever um programa longo, vamos usar duas macros – uma para definir o cursor
(SET_C) em diferentes coordenadas de linha (a coordenada de coluna é mantida constante em
38) e outra para exibir os diferentes caracteres em cada posição do cursor (DISP).
iv) A saída deste programa é uma exibição vertical de HELLO, com texto azul piscando sobre fundo marrom. O
marrom e o piscar juntos farão com que o fundo pareça amarelado. A posição do cursor está em (15, 38)
após a exibição.
.MODELO PEQUENO
.DADOS
COL DB 38 ;especifique a coordenada da coluna de
cursor
.CÓDIGO
.COMECE
.SAÍDA
FIM
Exemplo 8.7
Em seguida, vamos escrever um programa simples para tornar a tela verde ao pressionar a tecla 'G'.
Solução
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AH, 01 ;interrupção do DOS para entrada do teclado
INT 21H ;o código da tecla pressionada está em AL
CMP AL, 'G' ;compara AL com o código da tecla 'G'
CRIANÇA ETC ;se não for igual, pula para LAST
ÚLTIMO:
.SAÍDA
FIM
No Exemplo 8.7, a interrupção DOS 21H com AH = 01 é usada para entrada de teclado. O valor ASCII do
caractere da tecla pressionada será obtido em AL, que é comparado com 'G'.
Na função display, não carregamos nenhum caractere em AL para ser exibido. Isso porque o
atributo byte em BH é definido com o mesmo foreground e background. Assim, qualquer que
seja o caractere em AL, ele não será visível. Damos uma contagem de CX = 2000, que é o
número de caracteres na tela, ou seja, 25 × 80 (2000) caracteres podem ser exibidos.
Machine Translated by Google
Exemplo 8.8
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AH, 0
MOV AL, 3
INT 10H ;é usado para limpar a tela
vi) O conteúdo de AX é o atributo byte (AH) e o caractere da barra de espaço (AL). A exibição de
caracteres da barra de espaço é uma exibição 'em branco'. Assim, a tela tem apenas a cor de
fundo, ou seja, verde.
No Exemplo 8.9, a mensagem 'HELLO WORLD' é exibida no centro da tela.
A cor de fundo é definida como verde piscando (indicado pelo número A9H). Por causa de 'piscando', o
verde desta tela pode ser observado diferente do verde do Exemplo 8.10. 20H corresponde ao código ASCII
da tecla da barra de espaço (sem caractere).
Machine Translated by Google
Primeiro, a tela inteira fica verde, definindo a cor de fundo como verde e o primeiro plano em branco,
preenchendo-o com o código de barras de espaço. Em seguida, a mensagem a ser exibida é exibida
começando no meio da tela, localizando o 2000º ponto (centro da tela 25 × 80). Lembre-se de que cada
caractere ocupa dois bytes de armazenamento.
Exemplo 8.9
.MODELO PEQUENO
.CÓDIGO
.COMECE
MESG DB 'HELLO WORLD'
i) O primeiro plano e o fundo da tela ficam verdes e em branco, assim como foi feito em
Exemplo 8.10. Esta é a primeira parte do programa.
ii) Em seguida, cada caractere é trazido para AL usando a instrução LODSB. Para usar esta instrução, o
segmento de dados deve conter os dados de origem (a mensagem) e o SI deve apontar para ele. Isso
foi feito aqui.
iii) O byte de atributo já está em AH. O caractere a ser exibido, juntamente com o atributo
(em AH) está agora em AX.
Machine Translated by Google
iv) O conteúdo do AX agora é armazenado na memória de vídeo, usando STOSW. A DI deve apontar para o
2000º local da memória de vídeo, pois é aí que o armazenamento do conteúdo do
AX deve começar.
v) As instruções LODSB e STOSW são executadas até CX = 0. Lembre-se que para utilizar a instrução LODSB,
a mensagem deve estar no segmento de dados e deve ser apontada pelo SI. Aqui, o segmento de dados
é o mesmo que o segmento de código, pois estamos usando o modelo minúsculo.
vi) Assim, encontramos a string HELLO WORLD exibida em uma tela verde.
Teclas de caracteres Temos primeiro as teclas de caracteres de a a z, e acima delas estão as teclas numéricas.
Todas essas teclas têm dupla função, pois são pressionadas junto ou sem a tecla shift. Estas são as teclas mais
comumente usadas e mais familiares para nós.
Teclas de função Essas teclas marcadas de F0 a F12 e localizadas na linha superior do teclado eram
amplamente usadas com muitos programas DOS mais antigos. Eles ainda são muito populares como atalhos
de teclado. Às vezes, eles são usados em combinação com outras teclas como as teclas Ctrl, Alt ou Shift.
O menu de ajuda de qualquer programa conterá atalhos com tais combinações.
Tecla Enter (Return) Esta tecla é usada para inserir comandos ou mover o cursor para o início da próxima
linha. Se fizermos uma escolha, de um conjunto, esta chave especifica a escolha.
Tecla Escape É usada para sair de um programa, ou sair para uma tela anterior. Também é útil sair de
situações difíceis como muitos de nós já experimentamos.
Tecla ALT (Alternativa) Esta tecla é usada em combinação com outras teclas como teclas de caracteres ou
teclas de função e é conforme definido, usada em vários programas. Por exemplo, no compilador TC++, Alt +F9
é o comando para compilar.
Tecla Ctrl (controle) Esta tecla também é usada em combinação com outras teclas e é definida para
determinados programas. Por exemplo, no MS Word Ctrl+c copia os dados e Ctrl+v cola os dados copiados.
Isso não é necessariamente válido para todos os programas – por exemplo, não para o editor TC++, de qualquer maneira.
Machine Translated by Google
Tecla Caps Lock A tecla Caps Lock é uma tecla de alternância. Pressioná-lo uma vez o liga. Pressioná-lo
novamente o desliga. Alguns teclados de computador têm uma luz ou indicador que mostra quando o Caps Lock
está ativado. Quando o Caps Lock estiver ativado, todas as letras digitadas serão maiúsculas. A tecla Caps Lock
em um teclado de computador afeta apenas letras. Não tem efeito sobre as teclas numéricas ou de símbolos.
Num Lock e teclado numérico A maioria dos computadores de mesa possui um teclado numérico. É neste
teclado numérico que se visualizam as teclas page Down, page Up e outras teclas de seta. A Num Lock é uma
tecla de alternância, que quando ligada permite a digitação de números. Quando esta tecla é desligada as outras ,
opções de cada tecla serão ativadas, por exemplo Pg Dn e Pg Up. Observe que existem outras teclas também no
teclado numérico.
Chave do Windows A maioria dos computadores baseados em Windows tem uma chave 'Windows'. Ele está
marcado com um símbolo do Microsoft Windows e está na linha inferior do teclado, e pode haver duas dessas
teclas em cada lado da tecla da barra de espaço. Pressionar esta tecla abrirá o menu iniciar. Pode ser usado em
combinação com outras teclas para alguns atalhos. Por exemplo, Windows + d minimizará todas as janelas abertas
e mais uma tecla dessas as maximizará.
Chave de aplicativo Outra chave, que a maioria de nós pode não ter notado é uma chave que tem o símbolo de
uma página com várias linhas. Isso é chamado de chave do aplicativo e funciona como um clique com o botão
direito do mouse. Tente usá-lo no meio da digitação, usar essa tecla é muito mais fácil do que ter que chegar ao
mouse e clicar nele.
Os PCs anteriores tinham um teclado de apenas 83 teclas, mas agora o teclado padrão tem 101 teclas,
incluindo os caracteres alfanuméricos. O teclado que estamos assumindo é o teclado PS/2 e não os que usam o
conector USB (há algumas diferenças neste caso). Vamos resumir alguns dos pontos em relação ao teclado.
O microcontrolador dentro do teclado é programado para detectar se uma tecla foi pressionada e identificar a tecla,
no caso de uma tecla ser pressionada. Quando uma tecla é pressionada, o microcontrolador envia para a placa-
mãe um 'código de varredura' exclusivo para cada tecla. Um pressionamento de tecla geralmente é seguido por
uma liberação de tecla e essa 'liberação' faz com que outro código de varredura seja enviado, que é diferente
da tecla pressionada da mesma tecla. Pressionar e soltar teclas também são chamados de 'make' e 'break'.
Os códigos de verificação de fazer e quebrar são diferentes para uma chave. Eles diferem em 80H. Por exemplo,
se o código make scan de um caractere for 9, seu código break scan será 89H. Aliás, o código scan não tem
nada a ver com o ASCII ou outros valores de qualquer chave, mas é um código único definido pela IBM .
(Tabelas 8.7 a 8.9, no final deste capítulo, fornecem os códigos de varredura para as 101 teclas de um PC).
Machine Translated by Google
Bytes de Status do Teclado Ao verificar esta lista de códigos de varredura, será visto que o código de varredura
de uma tecla é o mesmo, quer a tecla seja um alfabeto em letras minúsculas ou maiúsculas. Além disso, é o
mesmo se a tecla shift foi pressionada ou não, ou se o Caps lock está ativado ou desativado . Consulte a lista de
códigos de varredura nas Tabelas 8.7 a 8.10. O código de varredura de * e 8 que estão na mesma tecla é '09'.
O código de varredura de g e G é 22H. Como isso é contabilizado?
A resposta é que existem dois bytes de status do teclado que são mantidos nas áreas de dados do BIOS
40:17 e 40:18. O primeiro byte de status mantém o status atual das teclas modificadoras do teclado. Os bits têm
os seguintes significados, conforme mostrado na Figura 8.6a. Se uma tecla de alternância estiver ativada, o bit
correspondente será 1. Por exemplo, para uma tecla caps lock ativada, o bit correspondente será 1, caso
contrário, será zero. Para as teclas shift, alt e ctrl, '1' indica que as teclas correspondentes foram pressionadas.
O segundo byte de status do teclado especifica se as teclas correspondentes estão 'atualmente' inativas.
i) O ISR lê o código de varredura da Porta 60H e identifica a tecla pressionada. Existem três possibilidades
para isso.
a) A tecla pode corresponder a teclas especiais como shift, alt, control etc. Nesse caso, o bit correspondente
no byte de status (Fig 8.6a) será definido.
b) O segundo caso é que a chave pode corresponder a um caractere ASCII e então o código de varredura
de 8 bits e o valor ASCII são armazenados no buffer do teclado (que é uma área de 32 bytes na área
de dados do BIOS a partir de 0040:001E).
c) Outro caso é quando não há código ASCII para a tecla – isto é para as teclas de função F1 a F12. Neste
caso, o ISR salva o código de varredura no buffer e também coloca 00 no lugar do código ASCII.
ii) Ao soltar a chave, ela envia um código de varredura diferente, e isso é verifi cado pelo ISR e
confi rmada para ser uma versão chave.
iii) Existe a possibilidade de a tecla continuar sendo mantida pressionada. Se for encontrado por mais de meio
segundo, o ISR o identifica como uma nova tecla pressionada e envia seu código de varredura de acordo.
Repetir a mesma chave é referido como 'typematic' na literatura da IBM.
Em seguida, vamos usar algumas interrupções de software relacionadas ao teclado. Já usamos algumas
interrupções do DOS para acesso ao teclado. Agora vamos nos familiarizar com algumas interrupções do BIOS
para funções do teclado. O tipo de interrupção de software 16H foi alocado para o teclado.
Machine Translated by Google
D3 Alt pressionado
D2 Ctrl pressionado
teclas de função (F0 a F12) que não possuem valores ASCII, AL = 0. Se nenhum caractere estiver disponível
no buffer do teclado, a função aguarda o pressionamento de uma tecla.
ii) AH = 01 ou AH = 11H. O primeiro número de função é para o teclado mais antigo. O segundo é o equivalente
para o teclado aprimorado. Esta função é semelhante à anterior, exceto que se nenhum caractere estiver
disponível no buffer do teclado, ele não espera o pressionamento de uma tecla. Ele simplesmente define ZF
(ZF = 1) e retorna.
iii) AH = 02 ou AH = 12H. O primeiro número de função é para o teclado mais antigo. O segundo é o equivalente
para o teclado aprimorado. Esta função retorna o primeiro byte de status do teclado no registrador AL. Este
byte de status também está disponível na área de dados do BIOS 0040:0017.
Exemplo: 8.10
Explique o que o programa a seguir faz.
.MODELO PEQUENO
.CÓDIGO
.COMECE
.SAÍDA
FIM
Solução
i) A função com AH = 10H, aguarda uma tecla pressionada. Se a tecla pressionada for 8, então AL = 38H e AH =
09. O valor 09 é o código de varredura de 8 e 38H é seu valor ASCII de 8.
A tecla 8 também representa o caractere '*' que é exibido quando a tecla shift também é pressionada. Então
AH = 09 e AL = 2AH que é o valor ASCII de '*'. Assim, o código de varredura é o mesmo para ambos os
caracteres, mas seus valores ASCII são diferentes.
Se a tecla pressionada for F5, o conteúdo de AL = 0, pois as teclas de função F0 a F12 não possuem valores
ASCII. O conteúdo de AH = 3FH que é o código de varredura da tecla F5.
-d0040:0017
0040:0010 62-00
Exemplo 8.11
O programa a seguir preenche a tela com a tecla pressionada. Se nenhuma tecla for pressionada, ele continua esperando
por uma tecla pressionada.
.MODELO PEQUENO
.CÓDIGO
.COMECE
NO_KEY: MOV AH, 11H ;função para aguardar chave
INT 16H
JZ NO_KEY ;se ZF = 1, nenhuma tecla pressionada, continue esperando
CHAVE: MOV AH, 10H ;função para levar em AL a chave
INT 16H
MOV CX, 2000 ;número de caracteres para preencher a tela
DISP: MOV DL, AL ;move o caractere ASCII para DL
MOV AH, 02 ;número da função para exibir o conteúdo DL
INT 21H ;DOS interrupt 21H
VER LOOP ;exibe até CX = 0
.SAÍDA
FIM
O programa do Exemplo 8.11 usa a função INT 16H 11H. Esta função verifica se existe um caractere no
buffer do teclado. Se não houver nenhum caractere e nenhuma tecla pressionada, ele define o sinalizador
Zero. O estado do sinalizador Zero é usado para aguardar o pressionamento de uma tecla. Quando uma
tecla é pressionada, este loop é encerrado e leva para AL, o valor ASCII da tecla pressionada (usando
BIOS INT 16H function10H). Em seguida, o conteúdo de AL é movido para DL e a função DOS INT 21H
é usada para exibi-lo 2000 vezes, de modo a preencher toda a tela.
Agora que tivemos uma exposição razoavelmente boa aos meandros associados à tela de vídeo,
teclado e às interrupções do BIOS associadas a eles, podemos usá-los para manipular os vetores de
interrupção do PC.
Um termo associado a interrupções é 'ligar uma interrupção'. Isso significa apenas o mecanismo de
instalação de um vetor de interrupção no IVT. A parte complicada disso é que o número de tipo que
planejamos usar pode já estar em uso para outra rotina de interrupção. Este ISR é temporariamente
mantido de lado quando instalamos um novo vetor correspondente ao mesmo número de tipo. Para
instalar um vetor de interrupção, o montador precisa endereçar a memória absoluta e a maneira mais
fácil de fazer isso é usando certas funções de interrupção do DOS. Agora, vamos passar por todo o
processo de hooking interrupts.
de memória livre continua sendo reduzido. No entanto, existem programas que são mantidos 'residentes' na
memória, mesmo depois de executados e abandonados. Assim, quando for ser executado novamente, não será
necessário trazê-lo do disco novamente. Isso é bastante confortável para o programa específico, mas a desvantagem
é que a memória livre é consumida por esses programas. Esses programas são intitulados 'Programas Terminar e
permanecer residente (TSR)'. Existe uma função específica de interrupção 21H que torna um programa residente.
A maioria desses programas TSR são invocados por interrupções, e vamos ver como isso é feito.
Defina uma entrada na Tabela de vetores de interrupção para um novo endereço. Entrada: DS:DX aponta para a
rotina de tratamento de interrupção que será inserida na tabela; AL = o número da interrupção
Em seguida, temos que fazer com que nosso ISR seja apontado pelo vetor de interrupção que decidimos.
Isso é feito pela função 25H.
Encerre o programa ou processo atual, mas torne-o residente na memória e tente definir a alocação de memória
atual para o número de parágrafos especificado em DX. Entrada: AL = código de retorno e DX = número de
parágrafos solicitados.
A função 31H torna nosso ISR residente na memória. O número de parágrafos (16 bytes
chunks) que nosso programa ocupa deve ser especificado em DX.
Espera-se que o programa para instalação de um gancho de interrupção seja um programa com e, portanto,
procedemos da seguinte maneira.
Exemplo 8.12
Aqui, o novo ISR chamado 'NEW60' deve ser instalado como uma interrupção do tipo 60H. O ISR é um programa
para tornar a tela cheia em ciano em cores com preto em primeiro plano.
.MODELO PEQUENO
.CÓDIGO
.COMECE
JMP INÍCIO
VELHO DD?
NOVO60 PROC FAR
MOV AH, 06 ;número da função
MOV AL, 00 ;sem caractere
MOV BH, 30H ;fundo ciano, primeiro plano preto
Machine Translated by Google
iv) A função AH = 35H obtém o antigo IP e CS em BX e ES. Estes são salvos em 'OLD'
que é uma localização de palavra dupla.
Exemplo 8.13
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AH, 0 ; número da função para configurar o modo de vídeo
MOV AL, 3 ;modo 3
INT 10H ;é para limpar a tela
INT 60H ;execute o ISR agora instalado como Tipo 60H
.SAÍDA
FIM
O Exemplo 8.13 tornará a tela ciano colorida, porque INT 60H é invocado.
Observação
i) Uma coisa a notar é que a instalação do novo ISR será perdida se o sistema for fechado ou reinicializado.
Se você sair da janela de comando, terá que reinstalá-la novamente, ou seja, execute o programa do
Exemplo 8.14 novamente, se desejar usar o programa do Exemplo 8.15.
ii) Nunca use as funções DOS INT 21H em um programa TSR, porque o DOS não é reentrante, e seu uso
em programas TSR causará estragos.
A reentrada é uma técnica útil de economia de memória para sistemas de compartilhamento de tempo multiprogramados.
Um procedimento de reentrada é aquele em que vários usuários podem compartilhar uma única cópia de
um programa durante o mesmo período. Um programador escreve um programa reentrante certificando-se
de que nenhuma instrução modifique o conteúdo de valores de variáveis em outras instruções dentro do
programa. Cada vez que o programa é inserido para um usuário, é obtida uma área de dados na qual se
guardam todos os valores das variáveis desse usuário. A área de dados está em outra parte da memória do
próprio programa. Quando o programa é interrompido para permitir que outro usuário use o programa, as
informações sobre a área de dados associada a esse usuário são salvas. Quando o usuário interrompido
do programa recebe novamente o controle do programa, as informações na área de dados salvos são
recuperadas e o programa pode ser reinserido sem a preocupação de que o usuário anterior tenha alterado
alguma instrução dentro do programa.
Agora, vamos fazer o mesmo com interrupções de hardware. Vamos escolher a interrupção de hardware
com o tipo número 09 que foi alocada ao teclado na linha IRQ1. Substituiremos a sequência normal de
teclado associada a esta interrupção de hardware por outro programa e esse programa será ativado com
uma tecla de atalho.
O que é uma tecla de atalho? Ele é definido como uma sequência de teclas definida pelo usuário que
executa um comando ou faz com que o sistema operacional mude para outro programa. Vamos usar uma tecla
de atalho no Exemplo 8.14, a maioria das quais é semelhante ao Exemplo 8.14. Os pontos importantes são:
(primeiro byte de status do teclado) que deve ser '1' se a tecla Alt for pressionada. Então a porta A do 8255
(com endereço 60H) é testada para o código de varredura de F10 (que é 44H). Se ambas as condições
forem verdadeiras, o novo ISR será executado.
iii) Se for constatado que a tecla de atalho pressionada não é a correta, o controle passa para OVER, que
recupera o valor antigo de CS e IP para a interrupção tipo 9. Isso é muito importante, porque o teclado fica
bloqueado (até uma reinicialização) se a rotina normal do teclado não for restaurada.
iv) Depois que nosso TSR é executado, o controle também volta para OVER pelo mesmo motivo, pois
Afirmado acima.
v) O ISR ativado por tecla de atalho é semelhante ao Exemplo 8.5 que traz uma janela de vídeo.
Nota Os códigos de leitura das teclas estão listados nas Tabelas 8.7 a 8.9.
Exemplo 8.14
.MODELO PEQUENO
.CÓDIGO
.COMECE
JMP INÍCIO
VELHO DD?
NOVOINT9 PROC FAR ;o ISR a ser instalado
EMPURRAR MACHADO
ACIMA: POP AX
JMP CS:ANTIGO
NEWINT9 ENDP
O Exemplo 8.15 é um programa semelhante, exceto que as teclas de atalho a serem invocadas são
Ctrl+F3. O ISR para esta tecla de atalho é copiado do Exemplo 8.8. Ele acessa a memória de vídeo
diretamente e faz com que a tela inteira fique verde.
Exemplo 8.15
.MODELO PEQUENO
.CÓDIGO
.COMECE
JMP INÍCIO
VELHO DD?
ACIMA: POP AX
JMP CS:ANTIGO
NEWINT9 ENDP
Machine Translated by Google
O próximo é um programa TSR ativado pela combinação de teclas de atalho ctrl+alt+i. Imprime a palavra
'ANURAG' na cor verde em uma janela vermelha com o tamanho especificado no programa. Como as
interrupções do DOS não podem ser usadas, a string não é exibida usando a interrupção do DOS com a
função número 09. Em vez disso, uma macro é usada com funções do BIOS para imprimir caracteres
únicos. Veja o Exemplo 8.16.
Exemplo 8.16
.MODELO PEQUENO
.CÓDIGO
.COMECE
JMP INÍCIO
VELHO DD?
CSET MACRO ;macro para definir a posição do caractere.
MOV AH, 02 ;função não para definir o cursor
MOV BH, 0 ;página nº = 0
INC DL
INT 10H
AUTO
MOV DL, 20
MOV DH, 2
DISP 'A'
DISP 'N'
DISP 'U'
DISP 'R'
DISP 'A'
DISP 'G'
CSET
MOV CL, 4
SHR DX, CL
INC DX
MOV AX, 3100H ;tornar o programa residente
INT 21H
FIM
A vantagem dos programas TSR que funcionam com uma tecla de atalho é que, como o programa reside
na memória, ele pode ser invocado enquanto estamos fazendo outra coisa. A desvantagem dos programas
TSR no DOS é que dá aos usuários acesso direto ao hardware e periféricos que podem causar estragos.
01 Esc 15 29 ~e' 3D F3
02 !e1 16 U e u 2A Desvio à esquerda 3E F4
03 @ e 2 17 Eu e eu 2B |e\ 3F F5
04 #e3 18 O e o 2C ZeZ 40 F6
05 $e4 19 P e p 2D { e [ Xex 41 F7
06% e 5 1A 2E Cec 42 F8
07 ^e6 1B }e] 2º andar VeV 43 F9
08 &e7 1C Digitar 30 BeB 44 F10
09 *e8 1D Ctrl 31 Nen 45 Num Lock
0A (e 9 1E Um e um 32 M e m 46 ScrollLock
0B )e0 1F Ses 33 <e , 47 7 e Casa
0C _ e- 20 D e d 34 > e. 48 8 e seta para cima
0D + e = 21 Fef 35 ?e/ 49 9 e PgUp
0E espaço para trás 22 GeG 36 Deslocamento para a direita
4A -(cinzento)
† Tabela 8.7–8.9: Reimpressão cortesia da International Business Machines Corporation, copyright © International
Business Machines Corporation.
Machine Translated by Google
| Sempre que o processador está executando uma tarefa, ela pode ser interrompida por outros programas ou periféricos solicitando serviço.
| Associado a qualquer interrupção está uma rotina de serviço de interrupção e um vetor de interrupção.
| O 8086 possui uma tabela com tamanho 1K para armazenar todos os seus 256 vetores de interrupção.
| Certos vetores de interrupção são reservados pela Intel para propósitos específicos.
| Para exibição em modo texto, cada caractere precisa de dois bytes, um para o código ASCII e outro para o
atributo.
| Os programas TSR são úteis, mas como o hardware e as tabelas de vetores de interrupção são acessados diretamente, eles
podem causar estragos se não forem usados com cuidado.
PERGUNTAS
1. Por que os flags de interrupção e trap são apagados como parte da resposta de interrupção?
12. Por que as interrupções do DOS não podem ser usadas em programas TSR?
EXERCÍCIO
3. Escreva um programa para criar janelas de exibição de três tamanhos e cores, ao mesmo tempo.
4. Escreva um programa para escrever uma string 'WELCOME HOME' horizontalmente em uma tela azul. Escreva o profissional
grama usando
a) funções do BIOS, b)
acessando a memória de vídeo diretamente.
5. Modifique o programa acima de forma que seja ativado pressionando apenas uma tecla específica.
6. Use a função BIOS 16H para o programa acima para verificar uma chave específica.
7. Escreva um programa para imprimir os nomes de três alunos em três linhas com seus números de rolo, à esquerda dos nomes.
Isso deve ser impresso em uma pequena janela vermelha na parte superior da tela do vídeo.
8. Escreva programas TSR para obter a tela acima com diferentes combinações de teclas de atalho.
Machine Translated by Google
Machine Translated by Google
periférico
9 interface-i
Neste capítulo, você aprenderá
| A necessidade de usar hardware dedicado para interface | O princípio do motor de passo e como ele é controlado
periférica. pela CPU.
| A arquitetura e recursos de programação do chip 8255. | Interface de teclado hexadecimal com o 8086.
| A interface de multiplexação dinâmica
| O método de interfacear um ADC com o 8086. LEDs com o 8086.
| Os métodos de geração de diferentes formas de onda | Em todos os casos acima, o 8255 é usado como
usando um DAC. controlador de interface paralela.
| A maneira pela qual um LCD pode ser usado para exibir
caracteres ASCII.
Introdução
No Capítulo 6, fizemos um estudo dos recursos de hardware do 8086. No Capítulo 7, os métodos pelos
quais a memória e as portas são conectadas ao 8086 foram esclarecidos. Um ponto que deve estar claro
agora é que o processador está conectado à memória e aos dispositivos de E/S através do endereço/
dados e linhas de controle. Lembre-se de que o processador é apenas um dispositivo de computação. Ele
calcula o que se espera dele e o transfere para o mundo externo – em essência, o mundo externo é externo
ao processador – a memória e os dispositivos de E/S são externos ao processador. O gerenciamento de
memória para 8086 é feito usando os sinais de controle de leitura e gravação, e a E/S também é acessada
usando esses sinais. No entanto, os dispositivos de E/S são de diferentes variedades, funções, recursos,
especificações e assim por diante. Por exemplo, um teclado é muito diferente de um monitor de vídeo. A
questão é que o 8086 não possui o hardware necessário para gerenciar cada um deles de acordo com
seus requisitos e especificações especiais. Assim, fica claro que os dispositivos de E/S precisam de algum
hardware extra para permitir a interface com o processador. É neste contexto que vários chips de interface
foram projetados. Todos esses chips são programáveis no sentido de que podem funcionar de maneiras
diferentes conforme necessário, 'programando-os', usando instruções 8086. Assim, existem chips separados
para gerenciamento de transferência paralela de dados, transferência serial de dados, teclado, interrupções
e temporizadores, por exemplo. Vamos agora entrar nos detalhes da interface de vários dispositivos de E/
S para o processador usando esses chips de interface de propósito especial.
Características
4. Porta serial compatível com RS232C padrão trazida para um conector macho tipo D de 9 pinos.
5. Contador/temporizador de 16 bits de 3 canais usando 8253 terminando em um conector de pino de E/S (um canal
nel usado para geração de baud rate).
6. Endereço, dados e sinais de controle totalmente armazenados em buffer terminados em um cabeçalho de 50 pinos para interface.
7. 8 nos. de linhas de interrupção trazidas para um conector de 10 pinos usando 8259 inter programáveis
controlador quebrado.
O que se deve entender a partir dessas especificações é que a freqüência de clock do processador utilizado é de 4,77 MHz e que
suas linhas de dados, endereço e controle estão em buffer e disponíveis em um conector de 50 pinos. RAM e ROM estão disponíveis
na placa. O treinador também possui um controlador de interrupção programável (8259) e um chip temporizador 8253. Possui um
teclado AT. O kit pode ser conectado à porta serial de um PC. Assim, a maneira mais conveniente seria escrever nosso programa
no PC (usando um editor), montá-lo e vinculá-lo usando MASM e, em seguida, baixar o arquivo hexadecimal resultante para a RAM
na placa de treinamento. Então, o processador na placa do treinador executará o programa e fornecerá os resultados adequadamente.
O treinador também tem o que é chamado de 'programa de monitoramento' para gerenciar toda a configuração.
Com esta breve introdução, iniciaremos nossa discussão sobre os vários periféricos e os chips de interface correspondentes.
A sequência seguida será apresentar um chip, suas funcionalidades, sua programação e depois utilizá-lo para diferentes aplicações.
Usando o 8255 Vamos ser claros sobre por que esse chip é necessário em primeiro lugar e como ele pode ser
usado (veja a Fig 9.2). O barramento de dados do 8086 é conectado ao 8255. Isso significa que a transferência
de dados entre os dois chips é possível. Considere primeiro o caso dos dados do 8086 serem enviados para o
8255. Onde o 8255 guarda os dados? A resposta é que ele possui registradores chamados 'portas' – existem
três portas aqui – A, B e C, e essas portas possuem pinos conectando-o a dispositivos externos. Assim, a porta
A tem 8 pinos PA0 a PA7 – assim também as portas B e C. A esses pinos de porta, dispositivos externos como
teclados, monitores e impressoras podem ser conectados. A Figura 9.2 mostra um conjunto de LEDs conectados
à porta C e uma impressora à porta B. Isso significa que os dados do 8086 podem ser transferidos para os
dispositivos de saída, roteados através dessas portas do 8255. Para isso, devemos ser capazes de para
'programar' as portas B e C como 'portas de saída'. A porta A tem um teclado conectado a ela. Isso significa que
a Porta A deve ser programada como uma porta de entrada – então o teclado pode enviar dados para ela, que
podem ser recebidos pelo 8086 quando assim o desejar. Assim, com esta configuração simples, vemos que o
8086 foi 'interfaceado' com três dispositivos de E/S usando o 8255 como um espaço de armazenamento
temporário. Assim, o 8255 possui três conjuntos de 'portas paralelas de 8 bits' que atuam como intermediários
entre um processador e vários dispositivos de E/S. Observe que em todos os casos, os dispositivos de E/S
usados têm capacidade de dados de apenas 8 bits – portanto, apenas as linhas de dados inferiores D0-D7 são conectadas ao 8255.
No entanto, é um 'chip programável', assim como todos os chips que aprenderemos nos próximos dois
capítulos. Tenha em mente que esses 'chips de interface' não possuem nenhum recurso de 'processamento'.
Eles só podem ser feitos para agir da maneira que queremos, 'programando-o' usando as instruções do
Porta A Teclado
8 8
0 2
D0–D7
Porta B Impressora
8 5
6 5
CONDUZIU
Porta C
Exibição
8086 (ou seja, o processador ao qual está conectado). No entanto, eles têm o hardware para executar as funções
especiais que são necessárias para cada finalidade específica. A programação de chips de interface envolve a
escrita de 'palavras de controle' em seus registradores de controle/comando. Vamos aprender essa ideia, começando
com o 8255.
Buffer de barramento de dados Há um buffer de 8 bits bidirecional de três estados que é usado para fazer a
interface do chip com o barramento de dados do sistema. Após a execução das instruções de entrada ou saída do
processador, os dados e as palavras de controle/status são recebidos ou transmitidos pelo buffer.
Lógica de controle de leitura/gravação Gerencia toda a transferência de dados entre o chip e o processador, ao
aceitar os sinais de controle dos barramentos de controle e endereço do sistema.
Controles do Grupo A e B Funcionalmente este chip foi dividido em Grupo A e B e eles possuem seus controles
correspondentes. Veremos em breve para que se destina este agrupamento. A maneira como o chip deve agir é
decidida por um registrador chamado registrador de controle/status que pode ser escrito
1 PA3 PA4 40
2 PA2 PA5 39
3 PA1 PA6 38
4 PA0 PA7 37
5 RD WR 36
6 CS REINICIAR 35
7 GND D0 34
8A1 _ D1 33
8
9A0 _ D2 32
2
10PC7 D3 31
5
11 PC6 5 D4 30
12 PC5 D5 29
13 PC4 D6 28
14 PC0 D7 27
15 PC1 VCC 26
16 PC2 PB7 25
17 PC3 PB6 24
18 PB0 PB5 23
19 PB1 PB4 22
20 PB2 PB3 21
grupo A
Porta C
PC4–PC7
Superior
Barramento de dados
Barramento de dados
D0–D7 Amortecedor
Grupo B
Porta C
PC0–PC3
Mais baixo
RD
WR
Ler/
A1 Escreva Grupo B Grupo B
PB0–PB7
Ao controle Porta B
Ao controle
A0
REDEFINIR
Lógica
CS
para e ler de. Agora veja uma conexão típica entre o 8086 e um 8255 na Fig 9.5. As linhas de dados inferiores
do chip podem ser conectadas a 8 bits do barramento de dados do 8086. O RD
e WR são conectados ao IORD e IOWR gerados a partir do 8086. Se este chip (que é visto como uma porta
de E/S pelo processador) deve ter apenas um endereço de oito bits, apenas as 8 linhas inferiores das linhas
de endereço do processador precisam estar envolvidos no processo de decodificação de endereço, o que faz
com que a linha CS seja ativada. Caso contrário, 16 linhas de endereço podem ser usadas. (Lembre-se de
que nenhuma porta de E/S pode ter um tamanho de endereço maior que 16 bits.) Quaisquer dois pinos de
endereço do processador devem ser conectados aos pinos A0 e A1 do 8255. Isso ocorre porque existem
quatro entidades separadas associadas com este chip, e cada um precisa de um endereço único. Isso é
alcançado pelas quatro combinações possíveis dessas duas linhas, conforme mostrado na Tabela 9.1.
Machine Translated by Google
IORD IOWR
Porta A
WR
RD
8
Porta B
8 A1 2
A1
A0 5
0 A2
5
8 Barramento de dados
6 D0–D7 Porta C
CS
A7
A6
A5
ISTO
A4
A3
A0
0 0 1 Porta B
0 1 0 Porta C
0 1 1 Registro de controle
Exemplo 9.1
Encontre os endereços da Porta A, Porta B, Porta C e o registro de controle/status do 8255 cujo circuito de decodificação de
endereço é mostrado na Fig 9.5.
Solução
A saída da porta NAND é 0, quando as linhas de endereço A7 a A3 e A0 têm o seguinte status de bit, e é quando o chip é
selecionado/habilitado.
Machine Translated by Google
A7 A6 A5 A4 A3 A0
1 1 00 0 0
Quando, A2 e A1 são 00, então A7 … A0 é 1100 0000, ou seja, C0H. Este é o endereço da Porta A.
Da mesma forma (consulte a Tabela 9.1) as outras portas têm o endereço conforme mostrado na Tabela 9.2.
Tabela 9.2 | Endereço das Portas de 8255 para Conexão na Fig 9.5
Registro de controle C6
Porta A C0
Porta B C2
Porta C C4
D7 D6 D5 D4 D3 D2 D1 D0
grupo A Grupo B
Seleção de modo
Porta A
0=Modo 0
1=Entrada; 0=Saída 1=Modo 1
Porta C
(Superior: PC7–PC4)
1=Entrada; 0=Saída
Atribuição de Bits da Control Word Observe primeiro D7 – ele sugere as opções de modo I/O ou modo BSR. Para
começar, vamos usar o chip no modo I/O. Este é o modo normal de operação (o modo BSR é um modo especial que atende
apenas à Porta C, do qual trataremos mais tarde).
A próxima coisa a fazer é decidir o modo de operação dos dois grupos. É aceitável
para os dois grupos estarem em modos diferentes ou iguais. Feito isso, selecione a opção de uma porta específica ser uma
porta de entrada ou saída. Para i/p, o bit correspondente deve ser 1 e para saída deve ser 0.
Modo 0 Th é o modo mais simples e mais utilizado. Neste modo, as duas portas A e B de 8 bits, e as portas de 4 bits, Porta
C superior e Porta C inferior, podem ser usadas independentemente. Aqui, os dados são simplesmente recebidos de uma
porta de entrada ou fornecidos a uma porta de saída.
Modo 1 Este é o modo 'handshake'. Handshake implica transferência de dados na qual os dispositivos de comunicação
trocam solicitações e reconhecem sinais de controle entre si.
Para um 8255 operando neste modo, os pinos das portas A e B são usados para transferência de dados, enquanto 4 bits de
cada porta C são usados para gerar os sinais de handshake para cada uma das portas de 8 bits.
Modo 2 Este é o modo bidirecional. Somente o Grupo A pode usar este modo. Aqui a Porta A é usada para transmitir e
receber dados. Os sinais de handshake gerados pelos 4 bits superiores da Porta C mantêm a disciplina do barramento para
o fluxo adequado de dados na direção necessária. Agora, vamos usar os diferentes modos.
9.4 | Modo 0
As especificações deste modo são:
iii) As saídas são travadas (ref Seção 7.4.1 para o motivo disso).
Exemplo 9.2
Projete a palavra de controle para configurar as portas de um chip 8255 no modo 0, com a porta B e a porta C superior
(PCU) como entradas e a porta A e a porta C inferior (PCL) como saídas.
Solução
Para i/p, o bit correspondente deve ser 1, e para saída, deve ser 0
Como a porta A deve ser uma porta de saída, D4 = 0
Como a porta CU deve ser uma porta de entrada, D3 = 1
Como a porta B deve ser uma porta de entrada, D1 = 1
Como a porta CL deve ser uma porta de saída, D0 = 0
D7 D6 D5 D4 D3 D2 D1 D0
1 00 0 1 0 1 0
A palavra de controle é, portanto, 8AH.
Exemplo 9.3
É necessário ler a configuração de 12 chaves que estão conectadas ao 8255 e exibi-la em LEDs. Desenhe o setup e
escreva o programa para o mesmo.
Solução
Podemos usar o 8255 com os endereços como na Tabela 9.2 e a palavra de controle como no Exemplo 9.2.
A Figura 9.7 mostra como oito switches estão conectados à Porta B e à Porta CU. Quando um switch é fechado, um
'0' é lido e, quando aberto, um '1' é lido nas linhas de porta. Nos pinos da Porta A e da Porta CL, conecte 12 LEDs junto
com seus resistores limitadores de corrente. Os LEDs acendem quando os pinos correspondentes têm uma lógica alta
neles.
+5V
PA0
PBO PA1
PB1 PA2
PB2 PA3
PB3 PA4
PB4 PA5
PB5 PA6
PB6 PA7
PB7 PC3
PC7 PC2
PC6 PC1
PC5 PC0
PC4
8255
ii) As configurações do interruptor na porta de entrada B podem ser lidas diretamente e transferidas para a saída
Porto A.
iii) Os dados na porta CU podem ser lidos inserindo a porta C totalmente, mas as configurações do switch
estarão disponíveis apenas na posição superior de 4 bits e devem ser deslocadas para a posição dos 4
bits inferiores para enviá-la para o LEDs.
O programa é o seguinte:
Nota Nos programas de interface de E/S, não usaremos interrupções de BIOS ou DOS, pois são específicas
apenas para PCs. Estamos usando o kit de treinamento para executar esses programas. Também não
especificaremos nenhum modelo de memória – isso pode ser decidido pelo tipo de software suportado pelo treinador.
Apenas as linhas do programa serão escritas aqui.
A2 A1
A1 A0
PA0–PA7
(BAIXO)
A0
PC0–PC7
CS
Endereço ISTO
Decodificador
A3–A7
A2 A1 CS
A1 A0
PA0–PA7
BHE
8255
D8–D15 PB0–PB7
(ALTO)
Alto Byte de Dados
PC0–PC7
uma onda quadrada de 33% de ciclo de trabalho no bit mais baixo da Porta A. A frequência de
clock do processador é 4,77 MHz
Solução
Um ciclo de trabalho de 33% significa que a onda quadrada deve ser alta por um terço do ciclo. Vamos considerar
o tempo ON como 1 ms. Então o período OFF será de 2 ms.
Podemos resolver o problema desta forma – criar um atraso de 1 ms e chamar o procedimento de atraso uma
vez durante o tempo ON e duas vezes durante o tempo OFF.
Para cálculos de atraso, consulte o Exemplo 6.2. O loop de atraso é:
MOV CX, N
AQUI: NÃO
LOOP AQUI
O programa completo é mostrado abaixo. Observe que precisamos da onda quadrada apenas no pino
mais baixo da Porta A, mas ela está disponível em todos os pinos. Isso ocorre porque os pinos da Porta A
não são 'bit endereçáveis', ou seja, não podemos manipular os bits da Porta A, um de cada vez. Para este
caso, não há problema em ter a onda quadrada gerada a partir de todos os pinos – mas precisamos usar
apenas um pino para observar a onda quadrada. Conecte uma sonda CRO a um pino e observe a forma de
onda no CRO. Além disso, para esta aplicação, a Porta A deve ser uma porta de saída. Todas as outras
portas são 'não me importo'. A palavra de controle é escrita no modo 0, e o bit D4 = 0 especificamente, ou
seja, 1000 0000 é a palavra de controle.
ENDP
FIM
Será mais útil discutir o modo BSR antes de irmos para a discussão dos modos 1 e 2. Este é um modo
especial e é aplicável apenas para os bits da Porta C. No formato de palavra de controle, se o MSB for feito
0 (D7 = 0) o modo bit set/reset (BSR) entra em vigor. Neste modo, qualquer bit da Porta C pode ser definido
ou redefinido especificando o bit que deve ser definido ou redefinido.
No entanto, de cada vez, apenas um bit pode ser endereçado – e esse bit deve ser definido ou redefinido.
A palavra de controle correspondente deve ser decidida e movida para o registrador de controle. Isso
porque, embora estejamos manipulando os bits da Porta C, é uma 'palavra de controle' que está sendo
escrita. Veja o formato da palavra de controle BSR na Fig 9.9. D3 a D1 especifica o bit a ser definido/
reinicializado.
Exemplo 9.5
Escreva as palavras de controle BSR para os seguintes casos:
D7 D6 D5 D4 D3 D2 D1 D0
BITSET/RESET
x x x
1-CONJUNTO
0-REINICIAR
Não
Cuidado
BITSELECT
0 1 2 3 4 5 6 7
0 1 0 1 0 1 0 1
0 0 1 1 0 0 1 1
0 0 0 0 1 1 1 1
BANDEIRA DE BITSET/RESET
0-ATIVO
Solução
D7 D6 D5 D4 D3 D2 D1 D0
i) PC ii) 0 a ser definido 0 1 = 01
0 0 0 0 0 0
Exemplo 9.6
Escreva um programa para fazer o seguinte. Obtenha dados da porta de entrada A. Se os dados estiverem acima
de 7FH, envie um valor alto no PC7 . Caso contrário, faça PC7 ser zero. Use os endereços de porta no Exemplo 9.1.
Solução
O primeiro passo para resolver este problema é configurar a Porta A para ser uma porta de entrada e a Porta Cupper
para ser uma porta de saída (já que um sinal deve ser gerado nela), no modo 0.
A questão é que, embora possamos estar usando um modo BSR, devemos primeiro 'configurar' as portas
como entrada/saída.
O formato da palavra de controle para 1 0 0 1 0 0 0 0 = 90H
isso é A palavra de controle BSR para reinicializar PC7 é 0 0 0 0 1 1 1 0 = 0EH
A palavra de controle BSR para configurar PC7 é 0 0 0 0 1 1 1 1 = 0FH
O programa é
Assim, vemos que com o modo BSR, podemos fazer 'endereçamento de bits' para pinos de porta, mas apenas
para a porta C, apenas no modo de saída.
9,5 | Modo 1
Este também é chamado de modo de handshake. As características deste modo são que as Portas A e B podem ser
usadas para entrada ou saída de dados, e os bits da Porta C são usados como sinais de handshake para controlar
essas transferências de dados. Este modo é frequentemente referido como modo de entrada/saída estroboscópica também.
A palavra 'estroboscópio' é indicativa de sinalização – classicamente, pelo uso da luz.
Relembre o agrupamento em grupos A e B.
i) Cada grupo contém uma porta de 8 bits e uma porta de 4 bits. A porta de 4 bits é usada para 'handshaking'.
ii) A porta de 8 bits pode ser uma entrada ou uma saída.
iii) A entrada e a saída são travadas.
iv) A porta de 4 bits é usada para controle e status da porta de dados de 8 bits.
v) A lógica de interrupção é suportada.
A Figura 9.10 mostra as definições de sinal da Porta C quando as Portas A e/ou B são usadas como entradas.
As definições dos sinais de aperto de mão são as dadas:
i) STB (Strobe): O periférico envia um byte de dados para o 8255 e o indica baixando a linha strobe.
Este sinal baixo ativo é dado por um dispositivo de entrada indicando que ele enviou um byte de
dados para o 8255, que será travado nele.
ii) IBF (Input Buffer Full): Este é o sinal que o 8255 envia como confirmação para indicar que o latch de
entrada recebeu o byte enviado pelo periférico. Isso é redefinido quando o 8086 lê os dados.
iii) INTR (Interrupt Request): Um valor alto é usado para interromper a CPU. Isso é definido como alto se
STB for alto, IBF for alto e o FF INTE (habilitação de interrupção) estiver definido. Ele é reiniciado
pela borda descendente de RD como mostrado na Fig 9.11. Para habilitar o 'INTE' fl ip fl op, use PC4
(para INTEA) e PC2 (INTEB). A configuração/reinicialização desses FFs é feita pelo
Moda BSR.
Machine Translated by Google
Nota PC4 e PC2 também são usados como sinais estroboscópicos, mas lembre-se de que eles são usados no modo
BSR (para INTE). Não há efeito da palavra de controle BSR nas atividades no Modo 1. Uma vez que os flip-flops de
habilitação de interrupção são definidos/reiniciados, esses pinos são usados como pinos de sinal estroboscópico. iv) No
modo de entrada Modo 1, dois pinos PC6 e PC7 não são usados para handshake. Eles podem ser usados como linhas
de entrada ou saída conforme desejado.
PA7 Porta A
inte Entrada
PA0 D7 D6 D5 D4 D3 D2 D1 D0
PC4 STBA 1 0 11 1 1/0 1X
PC5 IBFA
Entrada da Porta B
Modo de E/S
PC3
INTRA Porta B Modo 1
Porta A Modo 1
INTEB 1 = Entrada
0 = Saída
PC2 STBB
PC1 IBFB
PC0 INTRB
Porta B
Entrada
PC6, 7 E/S
Figura 9.10 | Modo 1: Entrada estroboscópica – Configuração de pinos e formato de palavra de controle
ETC
IBF
DENTRO
RD
Entrada do periférico
iii) º
INTR (Solicitação de Interrupção): é o sinal que fica alto depois que o sinal de reconhecimento é removido.
Isso pode ser usado para avisar o processador para entregar o próximo byte de dados no latch
de saída do 8255. A configuração deste sinal requer que OBF, ACK e INTE (interrupt enable Flip
fl op) estejam todos altos.
º
4) INTE (Interrupt Enable): é um flip interno que pode ser configurado/reiniciado pelo modo
BSR da porta C no PC6 e PC2 respectivamente. Este é um fl ip fl op interno utilizado para
habilitar ou desabilitar a geração do sinal INTR. INTEA é controlado pelo set/reset do PC6 .
INTEB é controlado pelo set/reset de PC2 .
Porta A
inte Resultado D7 D6 D5 D4 D3 D2 D1 D0
Ai
PC6
Modo de E/S
Saída da Porta B
PC3
INTRA Porta A Modo 1 Porta B Modo 1
INTEB 1 = Entrada
0 = Saída
OFB
PC1
PC2
ACKB
PC0 INTRB
Porta B
Resultado
PC4, 5
Figura 9.12 | Modo 1: Saída estroboscópica – Configuração de pinos e formato de palavra de controle
Machine Translated by Google
v) No modo de saída Modo 1, dois pinos PC4 e PC5 não são usados como sinais de handshake. Elas
podem ser usados como linhas de entrada ou saída conforme desejado.
Palavra de status Às vezes, pode ser necessário conhecer o status atual dos sinais de handshake e
tomar decisões dentro do programa de acordo. Como os sinais de handshaking estão nas linhas da
Porta C, será suficiente ler o status da Porta C, que terá as mesmas definições de sinal dos pinos da
porta, e a 'palavra de status' é mostrada na Fig 9.14. Esta palavra de status é lida usando a instrução IN
AL, PORT C. Assim, obtemos o status dos pinos da Porta C em AL, que podem ser usados para tomar
decisões. Também é possível usar o PPI de tal forma no Modo 1, que uma porta esteja na saída
estroboscópica e a outra na entrada estroboscópica, modo. As duas possibilidades são mostradas aqui
nas Figuras 9.15 e 9.16. Agora vamos examinar um caso em que a Porta A está no modo de entrada
estroboscópica conectada a um teclado e a Porta B está conectada a uma impressora, no modo de
saída estroboscópica (como na Fig 9.15).
WR
OBF
DENTRO
ACK
Resultado
CONFIGURAÇÃO DE ENTRADA
D7 D6 D5 D4 D3 D2 D1 D0
I/O I/O IBFA PRIMEIRA DIGITE A PERGUNTA IBFB INTRB
GRUPO A GRUPO B
CONFIGURAÇÃO DE SAÍDA
D7 D6 D5 D4 D3 D2 D1 D0
GRUPO A GRUPO B
PA7–PA0
8
RD
PC4 STBA
PC5 IBFA
PALAVRA DE CONTROLE
D7 D6 D5 D4 D3 D2 D1 D0
PC6, 7 E/S
PC6, 7
1=ENTRADA
0=SAÍDA PB0–PB7 8
WR
PC1 OFB
PC2 ACKB
PC0 INTRB
Exemplo 9.7
i) Escreva a palavra de controle para configurar a Porta A como uma porta de entrada e a Porta B como uma
porta de saída. ii) Porta C superior e Porta C inferior são usadas como sinais de controle. iii) Escreva instruções
Solução
D7 D6 D5 D4 D3 D2 D1 D0
10 1 1 0 1 0 0
ou seja, B4H
iv) Nesta aplicação, os pinos do Grupo A correspondem a uma configuração de entrada e os pinos do
Grupo B correspondem a uma saída. Portanto, os pinos da Porta C terão o status designado
(consulte a Fig 9.14).
Machine Translated by Google
D7 D6 D5 D4 D3 D2 D1 D0
PA7–PA0 8
WR PC7 OBFA
PC6 Ai
PALAVRA DE CONTROLE
D7 D6 D5 D4 D3 D2 D1 D0
PC3 INTRA
0 1 10 1 1/0 1
1=ENTRADA
0=SAÍDA
PB7–PB0 8
RD
PC2
STBB
PC1 IBFB
PC0 INTRB
Exemplo 9.8
Considere um caso em que o 8255 é usado com a Porta A na entrada estroboscópica e a Porta B no modo de
saída estroboscópica. O chip é conectado a um teclado e também a uma impressora, conforme mostrado na Fig 9.17.
Escreva instruções para obter dados do teclado e enviá-los para a impressora para serem impressos.
Solução
O cenário é que quando uma tecla é pressionada, os dados ASCII correspondentes são transferidos para o 8086
usando o handshake do Modo 1, e isso gera uma interrupção. Essa interrupção chama o ISR de impressão que é
responsável por enviar esses dados para a impressora. O problema tem duas partes.
i) A porta A é usada como porta de entrada para obter dados do teclado. O teclado envia um sinal strobe STB
para o 8255 em seu pino PC4, juntamente com o envio do código ASCII correspondente à tecla pressionada.
Isso é lido no microprocessador somente após ser confirmado que o sinal IBFA (Input buff er full) foi enviado
pelo 8255 no pino PC5. O status de todos os pinos da Porta C pode ser lido pela 'leitura' da Porta C. Uma
vez que o PC5 é conÿrmado como alto, os dados que foram travados na Porta A do 8255 podem ser lidos no
processador. Agora, veja o diagrama de tempo da Fig 9.11. Quando o sinal STBA fica alto e o IBFA
é alto, INTRA(PC3 ) é aumentado. Para garantir isso, o INTEA fl ip fl op correspondente deve ser definido.
Isso é feito configurando o bit PC4 , usando o recurso BSR. Na Fig 9.17, o INTRA
o sinal do pino PC3 do 8255 é conectado ao pino INTR do 8086. Quando o 8086 é interrompido, ele executa
o ISR 'PRINT' que envia o caractere que foi lido do teclado.
ii) Na segunda parte, é executado o PRINT ISR (Interrupt Service Routine). Ele faz o seguinte:
O status da porta C é lido para confirmar que o OBFB está alto. O processador considera que a impressora está
pronta para aceitar dados somente quando este sinal estiver alto. Só então os dados serão enviados para a Porta B.
O estado deste sinal é obtido no bit D1 da Porta C. Se estiver alto, os dados que foram trazidos do teclado e
colocados na memória são transferidos para a Porta B através de uma instrução OUT.
Quando isso for feito, o sinal OFBB ficará baixo e a impressora deverá responder a ele com um sinal ACKB que
fará com que o OFBB fique alto novamente. (Isso permitirá que o sistema envie o próximo byte a ser impresso,
quando interrompido novamente.) A geração dos sinais OFBB será
INTRA
DENTRO
PC3
PA0–PA7 Chave
Quadro
STBA
8 8 PC4
0 2 PC5
D0–D7 IBFA
8 5
6 5
PB0–PB7
OFB Impressora
PC1
PC2
ACKB
feito automaticamente pela saída do 8255 em Modo 1, uma vez que o WR vai para baixo correspondendo a uma
operação de escrita pelo processador.
Etapas do programa
i) Escreva a palavra de controle no Modo 1, com a Porta A como entrada e a Porta B como saída.
vi) Quando estiver alto, transfere o byte de dados da Porta A para a AL do processador.
vii) Transferir o byte para um local de memória.
viii) Uma vez que o sinalizador de habilitação de interrupção do 8255 foi definido, o INTRA ficará alto, e como
o sinalizador de interrupção do 8086 está definido, o 8086 é interrompido e é direcionado para o PRINT
ISR.
IMPRIMIR ISR
ii) Uma porta de barramento bidirecional de 8 bits (Porta A) e uma porta de controle de 5 bits (Porta C).
iii) Ambas as entradas e saídas são travadas.
iv) A porta de controle de 5 bits (Porta C) é usada para controle e status da porta de barramento bidirecional de 8 bits
(Porta A).
Como isso é usado apenas para aplicações muito especiais, a discussão detalhada deste modo não será tentada aqui.
Para mais detalhes deste modo, a folha de dados do chip pode ser consultada.
Na década de 1970, uma empresa de impressão chamada Centronics desenvolveu uma interface elétrica para sua
impressora que logo se tornou muito popular. Em 1981, quando a IBM quis conectar seu PC a uma impressora, eles
decidiram modificar o conector do lado do PC. O resultado final foi que a interface da impressora consistia em um
conector de 25 pinos no lado do PC e um conector Centronics de 36 pinos no lado da impressora. Isso também é
chamado de padrão Epson FX-100. Pode parecer muito estranho encontrar 36 pinos dedicados ao envio de dados em
apenas um byte por vez, embora com alguns sinais de handshake também. No entanto, na realidade, a maioria dos pinos
de controle e todos os pinos de dados possuem pinos de retorno de terra individuais, em vez de um terra comum. Isso foi
feito para reduzir o efeito de interferência de ruído elétrico.
A Tabela 9.3 mostra as designações dos pinos dos 36 pinos da interface Centronics, bem como os 25 pinos
correspondentes (DB-25) aos quais esses 36 pinos estão conectados. Obviamente, muitos dos 36 pinos serão designados
como 'sem conexão' (NC). Agora, vamos discutir como o PC e a impressora se comunicam de forma que os bytes de
dados sejam impressos um de cada vez. Veja, o diagrama de temporização Fig 9.18, da transferência de dados entre o
PC e a impressora. As etapas envolvidas no envio de um byte de dados para a impressora são:
i) O PC verifica se o sinal OCUPADO da impressora está ativado. Se estiver baixo, significa que a impressora não está
ocupada, ou seja, está disposta a aceitar um byte de dados para impressão.
iii) O PC também ativa o sinal STROBE (torna-o baixo) por pelo menos 0,5 µs. iv) O diagrama de
temporização também mostra que os dados devem permanecer nos pinos de dados por pelo menos 0,5 µs
depois que o STROBE estiver alto.
v) Uma vez que o STROBE fica baixo, o sinal BUSY fica alto para indicar que está ocupado no processo de impressão
deste byte.
Machine Translated by Google
vi) Ao final da impressão deste byte, a impressora envia um sinal de confirmação (ACK
ao PC, indicando que está pronto para aceitar um novo byte para impressão). O PC pode usar o sinal ACK ou BUSY para verificar
se o próximo byte pode ser enviado para impressão.
Vários outros sinais de status e controle são vistos para comunicações entre um PC e uma impressora. Suas funções estão listadas na
Tabela 9.3. A interface da impressora não será discutida em mais detalhes
pares trançados
D0–D7
ESTROBO
ACK
OCUPADO
detalhe porque, como mencionado anteriormente, é mais ou menos obsoleto. No entanto, antes de
concluirmos, alguns detalhes da história das portas paralelas são apresentados aqui.
Nota N/A significa não disponível e N/C significa sem conexão.
9.7.1 | História
A palavra LPT às vezes é usada para designar a porta paralela do PC. A palavra significa 'Line Print Terminal',
que foi projetado para impressoras de linha destinadas a imprimir dados de texto. Como não existe um padrão
escrito, as relações de tempo entre os sinais de handshake variam muito entre as impressoras de diferentes
fabricantes. Como acabamos de ver, a porta paralela é unidirecional, pois os dados foram 'enviados' para
impressão. No entanto, a impressão não é a única função que uma porta paralela pode fazer. Uma porta
paralela com recursos unidirecionais é chamada de 'porta paralela padrão'. Neste padrão, existem alguns
registradores envolvidos na transferência de dados, e tempo específico também. O SPP tem apenas algumas
diferenças do porto Centronics original.
A porta bidirecional O computador IBM PS / 2 (Personal System / 2) aprimorou a interface paralela padrão
do PC adicionando drivers bidirecionais às oito linhas de dados. O conector de E/S e as atribuições de sinal
permaneceram as mesmas. Uma porta paralela com drivers bidirecionais geralmente é chamada de Extended
Parallel Port (EPP). O EPP foi desenvolvido para fornecer transferências de dados bidirecionais de alta
velocidade que são compatíveis com o mapa de registro da porta paralela padrão existente. A especificação
EPP atribui funções tradicionais de sinalização de barramento de microprocessador às linhas de porta paralela
padrão (estroboscópio de endereço, estroboscópio de dados) para acessar diretamente o hardware do adaptador.
Extended Capabilities Port (ECP) ECP é uma extensão da porta paralela padrão bidirecional e foi
desenvolvida pela Microsoft e pela Hewlett Packard em 1992. A especificação define handshake automático
de hardware, ciclos de comando e dados e transferências DMA. Os sinais de handshake para transferência
de dados têm as mesmas relações de tempo definidas para portas paralelas padrão. Em 1994, o padrão IEEE
1284 foi lançado. Incluiu as duas especificações para dispositivos de porta paralela, EPP e ECP. Para que
funcionem, tanto o sistema operacional
e o dispositivo deve suportar a especificação exigida. Isso raramente é um problema hoje, pois a maioria dos
computadores suporta SPP, ECP e EPP e detectará qual modo precisa ser usado, dependendo do dispositivo
conectado. Se você precisar selecionar manualmente um modo, poderá fazê-lo através do BIOS na maioria
dos computadores.
Machine Translated by Google
Aqui nosso interesse será conectar um ADC ao 8086 usando o 8255 como interface.
Além disso, os ADCs podem ser 'paralelos' ou 'sociais'. Esta é uma aplicação importante para a porta
paralela IC 8255. Quando uma tensão analógica é fornecida como entrada para um ADC, ela é convertida
em um número digital que é transferido para o 8086. O valor digital pode ser armazenado na RAM do
sistema e podem ser exibidos ou usados em cálculos posteriores. Veja o diagrama de blocos de tal
configuração na Fig 9.19 com o 8255 atuando como intermediário nisso. Qual é o papel do chip 8255 na
conversão e transferência de dados? A resposta é que os dados digitais convertidos do ADC são transferidos
para o 8255 com uma de suas portas atuando como entrada. Esses dados são enviados ao processador
através do barramento de dados. Além disso, o ADC precisa de alguns sinais de controle para sua operação.
Isso é fornecido usando seletivamente os outros pinos de porta do 8255 PPI.
ADC 0808/0809 Existem muitos métodos diferentes de conversão de analógico para digital e muitos chips
ADC padrão diferentes. Escolheremos o ADC0808/ADC0809, que é compatível com ADC paralelo de 8 bits
e microprocessador. Seu diagrama de pinos funcional é mostrado na Fig 9.20. Ele é designado como um
'conversor A/D compatível com ÿP de 8 bits com multiplexador de 8 canais'. Ele usa a técnica de aproximação
sucessiva para conversão de analógico para digital.
Suas principais especificações são dadas como:
1. Resolução 8 bits
Porta de entrada
D0–D7
8 8
0 2 UMA
Analógico
Sinais de controle D
8 5 entrada
6 5 C
Dados
ônibus
Sinais de controle
Figura 9.19 | Diagrama de blocos geral da conexão entre um ADC, PPI e 8086
Machine Translated by Google
Vref(+) EOC
VOCÊ ESTÁ
Vref(–)
SC ALE CB UMA
(LSB)
EM 2 0 1 0
IN3 0 1 1
IN4 1 0 0
IN5 1 0 1
IN6 1 1 0
IN7 1 1 1
É um ADC multiplexado de 8 entradas – o que significa que possui 8 linhas de sinal analógico de entrada,
embora apenas uma delas possa estar operacional por vez. Th é selecionado por três entradas de endereço A, B, C.
A Tabela 9.4 mostra a configuração do bit de endereço para seleção de canais de entrada específicos. Por
exemplo, se IN0 deve atuar como entrada, as linhas de endereço C, B e A devem estar todas baixas; para IN1,
os valores de CBA devem ser 001 e assim por diante. O primeiro requisito ao usar o ADC é selecionar um canal
de entrada fornecendo a lógica apropriada nos pinos de endereço. Para travar isso no chip, um sinal chamado
ALE (Address Latch Enable) deve ser fornecido no pino ALE. ALE deve ser uma transição baixa para alta (ref
o diagrama de tempo na Fig 9.21). Após o endereço ser travado e a entrada analógica estar disponível na linha
de entrada selecionada, o ADC deve ser sinalizado para iniciar a conversão. Este é um pulso baixo a alto de
duração mínima especificada (como mencionado na folha de dados). O ADC requer um clock e a velocidade
de conversão depende da taxa de clock. A freqüência máxima de clock será especificada na folha de dados. O
clock do processador pode ser dividido para obter a frequência certa para o ADC.
Machine Translated by Google
RELÓGIO
WR (SC)
RD (OE)
MAS
ADDR
EOC
D0–D7
INICIAR CONVERSÃO
ENDEREÇO DA TRAVA
O ADC leva um tempo finito para completar a conversão e então notifica este fato baixando o pino
chamado EOC (Fim da Conversão). Isso deve ser levado ao conhecimento do processador. O sinal
EOC pode ser usado para interromper o microprocessador e permitir que os dados convertidos sejam
transferidos para o 8086 ou este sinal pode ser pesquisado continuamente. Para receber os dados
digitais, as linhas de saída do ADC devem ser ativadas. Isto é feito tornando alta a linha OE (Output
Enable). Uma vez ativadas as linhas de saída, os dados digitais convertidos, podem ser transferidos
para o 8086. O acima é a sequência de ações necessárias para usar o chip ADC 0809 para realizar a
conversão analógico para digital e depois transferir os dados digitais para o microprocessador.
Vamos agora usar os pinos de 8255 para os fins especificados acima. Faça as conexões entre o
8086, 8255 e o ADC conforme mostrado na Fig 9.22. Os pontos salientes sobre a
conexão são
i) A porta A é usada no modo de entrada para obter os dados digitais convertidos do ADC para 8255.
ii) Os pinos de porta PB0 a PB2 são usados no modo de saída como os pinos de seleção de endereço A, B, C
do ADC
iii) O pino da porta PC0 é usado como ALE e deve ser um pino de saída.
iv) O pino da porta PC1 é usado para dar o pulso de conversão inicial (SC) ao ADC. Portanto, é para
ser um pino de saída.
v) O pino da porta PC7 é usado no modo de entrada, para receber o sinal de Fim de Conversão (EOC)
do ADC.
vi) O pino da porta PC2 é usado como OE para o ADC. É definido como um pino de saída.
Machine Translated by Google
MAS
PC0
SOC UMA
8 PC1
EOC N
0 PC7
D0–D7 8
8 PA0 D0 UMA
IN0
UMA
6 2
PA1 D1 D
EM 1
eu
Barramento de dados
5 O
PA2 D2 C
EM 2
5 G
A2 A1 PA3 D3 0
IN3
A1 A0 PA4 D4 8
IN4
PA5 D5 0
IN5
EU
N
PA6 D6 9
IN6
D7 P
PA7 IN7
DENTRO
T
PB0–PB2 abc
S
Figura 9.22 | ADC com seus pinos de controle e dados conectados a um 8086
Exemplo 9.9
Escreva um programa para fazer a interface do ADC 0809/0808 com o 8086 usando 8255 como chip de
interface.
Solução
Consulte a Fig 9.22 para o diagrama de conexão. Consulte também o diagrama de temporização (Fig
9.21) para entender os seguintes passos: i) Primeiro a palavra de controle no Modo 0 deve ser finalizada.
A porta A deve ser entrada, saída da porta B, saída da porta CL e entrada da porta CU . Portanto, a
palavra de controle é 1001 1000 ou seja, 98H. ii) O sinal ALE deve ser pulsado, ou seja, deve ter uma
transição baixa para alta e para isso o pino PC0 pode ser usado no modo BSR. As palavras de controle
BSR para limpar e configurar PC0 são 0000 0000 ou seja, 00 e 0000 0001 ou seja, 01. iii) Para iniciar
a conversão, o sinal SC, que usa o pino PC As palavras de controle BSR correspondentes são 02 e
iv) Após um atraso, tanto o ALE quanto o SC devem ser reduzidos. O atraso mínimo necessário pode ser
verificado na folha de dados.
v) Em seguida, o sinal EOC é testado. Isso é feito girando a porta C para a esquerda e colocando o PC7
no carry. Quando o bit de transporte está baixo, o sinal OE no pino PC2 é elevado. Isso habilita os
pinos de saída do ADC. As palavras de controle BSR para levantar e abaixar o pino OE são 07 e 06
respectivamente.
um amplificador operacional). Para um DAC de 8 bits, a corrente de saída Io é uma função dos números
binários nos pinos de entrada de dados D0 a D7 .
DDD DD D 765 32
D 40 D1
II
o
=× ++++++ÿ + ref
ÿ
ÿ
(9.1)
ÿ
24 8 16 32 64 128 256 ÿÿ
onde Iref é a corrente de entrada de referência correspondente ao Vref (pino nº 14) aplicado ao chip.
A Figura 9.23 mostra o diagrama de pinos do chip DAC0800/DAC0802 que é um conversor digital-
analógico de alta velocidade de 8 bits com um tempo de estabilização de 100ns. Agora usaremos
os dados de 8 bits do 8255 como entrada para o DAC. As conexões mínimas são as mostradas
na Fig 9.24. Componentes adicionais como diodos Zener podem ser usados para fins de proteção. O
LIMITE
EU
FORA
2 15 VREF (–)
3 0 14
DENTRO VREF (+)
8
EU
FORA 4 13 V+
0
MSB B1 5 12 B8 LSB
0
B2 6 11 B7
B3 7 10 B6
B4 8 9 B5
+5V
+5V
DAC0800 13 5K
V+
14 5,6 mil
PA0 D0
vref(+)
PA1 D1
PA2 D2
8 4 –
PA3 D3 FORA
2 +
EU
1
4
V– COMP
GND
16
3
0,1uF
–12V
saída do DAC é uma corrente que é convertida em tensão pelo opamp na saída.
Como o opamp é conectado em uma configuração simples de inversão, apenas tensões de saída positivas
podem ser obtidas aqui. No entanto, se o opamp for usado em uma configuração diferente, tanto valores
positivos quanto negativos podem ser obtidos.
Exemplo 9.10
Para os seguintes números binários aplicados a um DAC, calcule a tensão analógica de saída obtida dado que
Iref = 2 mA e R = 5,6 K
e) 11000011
ii) 00010111
Solução
A Equação 9.1 pode ser usada para encontrar o valor da tensão analógica para cada caso.
EU = 2mA
referência
Exemplo 9.11
Gere uma forma de onda triangular usando o DAC 0800.
Solução
O método consiste em incrementar os dados enviados para o DAC, de 0 a FFH. Na conversão para a forma
analógica, dará uma saída gradualmente crescente de 0 até a tensão de saída máxima. Em seguida, diminua
o número de FFH para 0. Isso dará o triângulo alto para baixo
transição.
Nota Como a freqüência de clock do 8086 é razoavelmente alta, o tempo para incrementar o número 0 para
FFH e decrementar de FFH para 0 será bem pequeno. Assim, a forma de onda gerada terá uma duração muito
curta. Para obter um aumento e diminuição mais lentos da tensão analógica, uma boa ideia será ter um
pequeno atraso após cada incremento/decremento do número digital. O atraso deve ser pequeno, de modo
que não sejam vistos passos nas porções crescentes/decrescentes da tensão analógica. A quantidade deste
pequeno atraso também pode ser usada para controlar os períodos das formas de onda geradas. Isso foi feito
neste programa.
ATRASO FINAL
Exemplo 9.12
Gere uma forma de onda de escada com 5 etapas.
Solução
Uma forma de onda em escada tem degraus na porção crescente da tensão analógica. Uma vez que a tensão
atinge o valor máximo, cai para zero no tempo zero. Aqui, devemos gerar uma forma de onda em escada com 5
degraus. Após cada etapa, um atraso é chamado. O método é o seguinte.
Divida o intervalo total de 0 a 255 em 5 partes. Cada incremento pode corresponder a 51. O intervalo de
números digitais é 0, 51, 102, 153, 204 e 255. O programa é o seguinte e a forma de onda de saída está na Fig
9.25.
T T
Atraso
Exemplo 9.13
Gere uma forma de onda de dente de serra usando um DAC.
Solução
Para uma forma de onda dente de serra, o conteúdo de AL é incrementado de 0 a FFH. Assim, a tensão analógica
varia lentamente de 0 até o valor máximo.
Para habilitar uma variação 'lenta', um atraso é usado toda vez que um incremento em AL é feito. Uma vez que
atinge o máximo, é feito para ir a 0, e então todo o procedimento é repetido.
ATRASO FINAL
RS Register Select Este pino seleciona entre um registro de comando e um registro de dados. RS = 0
corresponde ao registrador de comando e RS = 1 ao registrador de dados. Os dados a serem exibidos
devem ser enviados para o registro de dados.
R/W: Read/Write Este pino permite que o usuário escreva ou leia a partir do display. Quando não há
necessidade de leitura do display, este pino é aterrado. Se for necessário ler e escrever, este pino é
programável.
16
. . . . . . . . . . . . . . . .
6 E
Ativar sinal
E: Enable O pino Enable deve receber um pulso alto para baixo, que é mantido alto por pelo menos 450 ns (pode ser diferente para outros
módulos LCD).
DB0 a DB7 Estes são os pinos de dados do LCD. Os dados a serem gravados devem ser enviados por meio desses pinos, e os dados a
serem lidos serão recebidos do LCD por meio desses pinos. Os dados a serem gravados para exibição são enviados como caracteres ASCII.
Para escrever nos registradores de comando, existem códigos pré-definidos para o LCD. Os códigos para o LCD que estamos usando são
Sinal de ocupado É visto que há um tempo mínimo necessário para travar um dado no LCD e exibi-lo. Suponha que queremos fornecer
novos dados para exibição, a maneira mais simples seria introduzir um pequeno atraso entre o envio dos dois dados de exibição (que podem
receber apenas um caractere por vez). No entanto, outro método para enviar caracteres consecutivos é verificar o que é chamado de
sinalizador 'Ocupado' do LCD. Para testar a bandeira de ocupado, faça RS = 0 primeiro. O sinalizador 'Ocupado' é DB7 e pode ser lido quando
R/W = 1 e RS = 0. Se o DB7 estiver alto, significa que o LCD está ocupado fazendo suas operações e não aceitará nenhuma informação nova.
Continue verificando este sinalizador até que esteja baixo. Então, os próximos dados podem ser gravados nele.
Nota Se o sinalizador de ocupado for lido, o pino R/W deve ser programável.
Agora, vamos fazer algumas atividades de exibição usando um LCD 16 × 2. Dados e comandos são enviados
do 8086, usando o 8255 como interface.
Luz de fundo: Há uma lâmpada aqui em vez de luz refletida. Se a luz de fundo for fornecida por LEDs, como no caso de muitos LCDs 16 × 2,
• Os pinos 15 e 16 do LCD são usados para ajuste da luz de fundo (não mostrado na Fig 9.27).
38 2 linhas e matriz 5 x 7
*
Para uma exibição de 16 x 2 linhas, os endereços das posições do cursor são 80 a 8F para a primeira linha e C0 a CF para a
segunda linha
PA0 DB0
PA1 DB1 +5 V
PA2 DB2
D0–D7
8 PA3 DB3 eu VCC
2 PA4 DB4 C
5 PA5 DB5 D AGUA POTE 1K
5 PA6 DB6
DB7 VSS
PA7
PC0 RS
E
PC1
Exemplo 9.14
Este programa exibe 'YA' no LCD. A geração dos sinais de controle necessários para enviar os comandos
ao registrador de comando são colocados em um procedimento denominado 'COMMAND', e similarmente
existe um procedimento denominado 'DAT' que cuida dos sinais de controle necessários para o envio ao
registrador de dados, os caracteres que devem ser exibidos.
Observe que primeiro o LCD é inicializado, depois apagado e, em seguida, o cursor é posicionado. Isso
é feito enviando palavras de comando para o registrador de comando LCD. Para travar essas palavras no
registrador de comando, RS deve ser baixado e E deve receber um pulso alto para baixo. Estes são feitos
no procedimento COMMAND.
Da mesma forma, para exibir um caractere, o valor ASCII dos dados deve ser enviado para o registrador
de dados e RS deve ser '1'. Além disso, uma transição de alto para baixo deve ocorrer em E. Essas questões
são tratadas no procedimento DAT.
AQUELE ENDP
ATRASO FINAL
Exemplo 9.15
Escreva um programa que gire a palavra HELLO da direita para a esquerda, exibida no LCD.
Solução
Consulte a Tabela 9.5. Para girar o display para a direita, é utilizado o comando '18H'.
Para girar o display na direção oposta, use o código 1CH.
O programa é o mesmo do Exemplo 9.14, exceto que os caracteres a serem exibidos são escritos como um array
na memória e acessados um a um. Além disso, mais um código de comando é adicionado, ou seja, para rotação
da tela. Como todo o resto é igual, apenas as linhas adicionais do programa são mostradas aqui.
MESG DB 'H','E','L','L','O'
-----------------
-----------------
----
---
FAIXA: MOV AL, 18H ;comando para deslocar o display para a esquerda
COMANDO DE CHAMADA
ATRASO DE CHAMADA
CHAMADA DELAY_ROLL
INC BX
Machine Translated by Google
Nota O procedimento DELAY_ROLL é usado para decidir a taxa na qual a rotação ocorre.
Para rotação lenta, este atraso pode ser elevado.
Princípio de Operação Os motores de passo operam de forma diferente dos motores CC normais. Um
motor CC gira continuamente quando a tensão é aplicada aos seus terminais. Os motores de passo têm
vários eletroímãs 'denteados' dispostos em torno de um pedaço de ferro em forma de engrenagem central
(veja a Fig.9.28). Os eletroímãs são energizados por um circuito de controle externo que envia pulsos ao motor.
15°
UMA
D
B
B
D
UMA
Para girar o eixo do motor, um dos eletroímãs é alimentado primeiro, o que faz com que os dentes da engrenagem
sejam atraídos magneticamente pelos dentes do eletroímã. Quando um dente da engrenagem está assim alinhado
com o eletroímã energizado (o eletroímã 'B' e o dente '6' estão alinhados na Fig 9.28), outros estão ligeiramente
desalinhados dos eletroímãs correspondentes. Quando o próximo eletroímã é ligado e o primeiro é desligado, a
, pequenas
engrenagem gira levemente para se alinhar com a próxima, e a partir daí o processo
rotações
seérepete.
chamadaCada
deuma
passo,
dessas
com um
número inteiro de passos fazendo uma rotação completa. Desta forma, o motor pode ser girado por um ângulo preciso.
i) A ordem em que uma determinada sequência é aplicada, decide o sentido de rotação (relógio
sentido ou anti-horário).
ii) A velocidade de passo depende da frequência dos pulsos aplicados, ou seja, quanto maior a frequência
quency, mais rápido o movimento de passo.
Podemos usar motores de passo para movimentos que precisam ser controlados com precisão. O controle fino é
obtido porque esses motores se movem em etapas, e as etapas podem ser bem pequenas em tamanho.
Por exemplo, um passo pode ser de 2 graus e, para uma rotação completa (360 graus), obviamente são necessários
180 passos. Para obter uma rotação de 90 graus para tal motor, devemos escrever um programa para fornecer apenas
45 pulsos a ele. Isso pode ser usado com vantagem quando é necessário controlar aspectos como ângulo de rotação,
velocidade, posição e sincronismo. Como tal, eles são usados em aplicações como impressoras, plotters, equipamentos
de escritório de ponta, unidades de disco rígido, equipamentos médicos, máquinas de fax e aplicações automotivas e
industriais onde é necessária uma rotação precisa e controlada.
Ímã permanente
Híbrido
Relutância Variável Este tipo de motor consiste em um rotor multidentado de ferro macio e um estator bobinado.
Quando os enrolamentos do estator são energizados com corrente CC, os pólos ficam magnetizados.
A rotação ocorre quando os dentes do rotor são atraídos para os pólos do estator energizados (Fig. 9.28).
Ímã Permanente Esses motores possuem ímãs permanentes adicionados à estrutura do motor. O rotor não tem
dentes, mas é feito com pólos norte e sul alternados de ímãs permanentes, situados em linha reta paralela ao eixo do
rotor (ver Fig 9.29). A aplicação de corrente a cada fase em sequência fará com que o rotor gire ajustando-se aos
campos magnéticos variáveis. Embora opere em velocidade bastante baixa, o motor PM possui uma característica de
torque relativamente alto, pois a intensidade do fluxo magnético devido ao ímã permanente é muito maior.
Híbrido O motor de passo híbrido combina as melhores características dos motores de passo do tipo PM e VR. O rotor
é multidentado como o motor VR e contém um ímã concêntrico axialmente magnetizado ao redor de seu eixo (veja a
Fig 9.30). Os dentes no rotor fornecem um caminho ainda melhor que ajuda a guiar o fluxo magnético para locais
preferidos no entreferro.
O imã permanente e os tipos híbridos são os tipos mais populares, sendo o último
mais caro, mas capaz de ser projetado para resoluções maiores, ou seja, tamanhos de passo menores.
Machine Translated by Google
NSNSN
N N
Motores Unipolares Um motor de passo unipolar possui logicamente dois enrolamentos por fase, um
para cada direção do campo magnético. Neste arranjo, uma vez que um pólo magnético pode ser invertido sem
Machine Translated by Google
mudando a direção da corrente, o circuito de comutação pode ser muito simples para cada enrolamento.
Normalmente, dada uma fase, uma extremidade de cada enrolamento é comum: fornecendo três fios por
fase e seis fios para um motor bifásico típico. Muitas vezes, esses dois comuns de fase são unidos
internamente, de modo que o motor tem apenas cinco fios.
Motores bipolares Motores bipolares possuem logicamente um único enrolamento por fase, invertido para
inverter um polo magnético, então o circuito de acionamento é mais complicado. Existem duas derivações
por fase, nenhuma delas é comum. Um motor unipolar pode ser convertido em um bipolar (descartando o
comum), mas não vice-versa.
Motores Universais Um motor de passo universal tem 8 fios, enquanto o uniploar tem seis e o bipolar tem
quatro. Normalmente usamos um motor universal, usando apenas seus quatro terminais aos quais
alimentamos nossos pulsos eletrônicos. Em nossas discussões, consideraremos a aplicação de uma
sequência de pulsos às quatro derivações de tal arranjo. Usaremos um motor PM simples de 90 graus com
duas fases. A aplicação de corrente a cada fase em sequência fará com que o rotor gire ajustando-se aos
campos magnéticos em mudança e, portanto, o alinhamento do rotor é feito por pulsação.
(b)
(uma)
Extremidade da bobina
Fio comum
M Motor
Extremidade da bobina
N
UMA
N 8 1
8 1 7
7
Fase A S S
2 N
2 Fase A S Rotor
DENTRO
M
S Rotor N 6 N
6
UMA
Fase A 3 3
N54 54
S S
Estator A Estator A
Estator B Estator B
B
B
Fase B Fase B Fase B
VM
INTERFACE PERIFÉRICO ÿ I
331
Tabela 9.7 | Sequência de acionamento para um acionamento de passo completo com motor de passo
Sentido horário
Sentido horário
Sentido horário
Como estamos tentando executar o stepper usando uma sequência gerada pelo 8086, também usamos o 8255 para
enviar a sequência por uma das portas. O motor, no entanto, não pode ser acionado diretamente pela porta paralela,
porque o motor requer uma corrente muito maior do que pode ser fornecida pelo 8255. (O requisito de corrente
exato depende das especificações do motor específico que está sendo usado) . Como tal, são necessários drivers
de corrente entre as linhas da porta 8255 e os terminais do motor. Transistores com capacidade de alta corrente
(por exemplo, par Darlington ou transistores de potência) podem ser usados. Além disso, existem CIs especiais de
acionamento de motores disponíveis. Um desses CIs é o CI de acionamento ULN 2003, cujo diagrama de pinos é
mostrado na Figura 9.32. Este IC contém uma matriz de sete transistores de pares Darlington.
Exemplo 9.16
Escreva um programa para girar um motor de passo no sentido horário usando o esquema de acionamento de passo
completo.
Solução
Vamos usar a sequência mostrada na Tabela 9.7, para rotação no sentido horário. A conexão é como mostrado na
Fig 9.33. Apenas os quatro pinos inferiores da porta B precisam ser usados. A seqüência é obtida girando para a
direita, os dados 0110 0110. Ao girar isso, os quatro bits inferiores são 06, 03, 09, e 0CH isso se repete para obter
uma rotação no sentido horário do motor.
ATRASO FINAL
É dado um atraso entre a aplicação da sequência às bobinas do motor. O atraso é necessário para que as bobinas
sejam energizadas para sua nova sequência de excitação – também, menos o atraso; mais é a velocidade do
motor. Assim, a velocidade de rotação é variada de acordo com a frequência do pulso
fluxo.
Agora, pense em um motor com um ângulo de passo de 1,80 . Suponha que uma rotação de apenas 900 seja necessária.
Quantas etapas são necessárias? Obviamente,
Nº de passos = 90 / 1,8 = 50. Este motor leva 200 passos para cobrir 3600 .
Machine Translated by Google
EM 1 1 16 SAÍDA 1
EM 2 2 15 SAÍDA 2
EM 3 3 14 SAÍDA 3
EM 4 4 13 SAÍDA 4
EM 5 5 12 SAÍDA 5
EM 6 6 11 SAÍDA 6
EM 7 7 10 SAÍDA 7
diodos de roda
ED 2003
EM 1 SAÍDA 1
UMA
PB 3
Para Stepper
EM 2 SAÍDA 2
D0–D7 8 Bobinas do motor
PB 2 B
2
EM 3
5 SAÍDA 3
PB 1 UMA
5
EM 4 SAÍDA 4
PB 0 B
Exemplo 9.17
Escreva um programa para girar um motor em 900 no sentido horário e, em seguida, gire-o 1800 no
sentido anti-horário. O ângulo do passo é 1,80 .
Solução
ATRASO FINAL
Exemplo 9.18
Escreva um programa para girar um motor de passo na sequência de 4 passos de acionamento de onda no
sentido horário.
Solução
JNZ AGN
CERTO
ATRASO FINAL
Uma questão importante a ser observada ao usar motores de passo é que existe a possibilidade de que a
força eletromotriz seja produzida durante a energização das bobinas. Isso pode danificar os circuitos que
produzem a sequência e, portanto, são conectados diodos que bloqueiam esses picos. A Figura 9.34 mostra
os diodos conectados em um circuito que usa transistores de pares Darlington para produzir a alta corrente
necessária para acionar os motores. Observe que os diodos não são mostrados na Fig 9.33 onde o motor
de acionamento IC ULN 2003 é usado. Isso ocorre porque esse diodo é embutido no IC. Veja a Fig 9.34
onde o acionamento para o motor de passo é dado por transistores de pares Darlington de alta corrente TIP
120. Os diodos IN4001 são usados para suprimir os picos de força eletromotriz.
Motor +V
IN4001
F
R
O
M
8
B
2
5
5
Para Stepper
Motor
P
O
R
T
UMA
P
EU
N
S
COM
DICA 120
Figura 9.34 | Transistores Darlington do driver atual e diodos de supressão EMF traseiros em um circuito de passo
Machine Translated by Google
9.11.7 | Optoacopladores
Um optoacoplador é outro dispositivo útil para amortecer a EMF traseira produzida em um circuito de motor. Um
optoacoplador ou isolador óptico é um dispositivo que usa um curto caminho de transmissão óptica para transferir um
sinal entre os elementos de um circuito, mantendo-os eletricamente isolados. Tipicamente, eles vêm em um pequeno
pacote IC de 6 ou 8 pinos, mas são essencialmente uma combinação de dois dispositivos distintos: um transmissor
óptico, normalmente um LED de arsenieto de gálio (diodo emissor de luz) e um receptor óptico, como um fototransistor
ou diac acionado por luz. Os dois são separados por uma barreira transparente que bloqueia qualquer fluxo de corrente
elétrica entre os dois, mas permite a passagem da luz. A idéia básica é mostrada na Fig. 9.35. Normalmente, as
conexões elétricas para a seção de LED são trazidas para os pinos de um lado da embalagem e as do fototransistor
ou diac para o outro lado, para separá-los fisicamente o máximo possível.
A Figura 9.36 mostra o diagrama de pinos de um quad optoacoplador ILQ74. A Figura 9.37 mostra este acoplador
óptico usado em um circuito de interface de motor de passo, juntamente com um IC de acionamento ULN 2003.
UMA
K B E
ILQ74
OPTPISOLATOR
1 16
2 15
3 14
4 13
5 12
6 11
7 10
8 9
+5
+12 +12
16 UMA
1 15
PB3 R
2 EU
14 1K
8 3 13
PB2 eu
2 4 12 1K UMA
Q
5 5 11
PB1 7 R
5 6 10
1K
7 4
PB0 9
1K
8
Veja o diagrama do teclado hexadecimal. Este é um teclado de matriz 4 × 4 conectado ao 8255. Para nosso
propósito, usaremos duas portas do 8255, a Porta A como uma porta de saída conectada às linhas de linha e a
Porta B como uma porta de entrada conectada à coluna linhas. Apenas os 4 bits inferiores das duas portas são
necessários. Veja a Fig 9.38 para a conexão, com a chave posicionada na interconexão de uma linha e uma
coluna. Somente quando uma tecla em uma junção é pressionada, um caminho é estabelecido entre a linha e a
coluna correspondentes.
Lembre-se que as linhas estão conectadas a uma porta de saída e as colunas a uma porta de entrada. Agora,
envie zeros das quatro saídas de linha e leia o conteúdo das colunas. Se nenhuma tecla foi pressionada, não há
conexão entre uma linha e uma coluna e, portanto, apenas '1' s são recebidos de todas as colunas. Obtemos
1111 de PB3 para PB0. Isso deve ficar claro na Fig 9.38. Se uma tecla for pressionada, o '0' da linha passará
pela chave fechada para a coluna e será lido da Porta B. Digamos que a tecla '9' seja pressionada. Então, um '0'
é recebido dessa coluna, ou seja, o PB3 a PB0 será lido como 1101. Uma informação que obtemos dessa leitura
da porta de entrada é que uma tecla foi pressionada. Então dizemos que um 'pressionamento de tecla foi
detectado'.
Machine Translated by Google
VCC
3 210
R
PA0
8 7 654
2
PA1
5
5 B A9 8
PA2
F E DC
PA3
Porta A (Saída)
a 20 ms, dependendo do tipo de teclado que temos. Após esse tempo, se a tecla ainda for pressionada, é
um pressionamento de tecla válido. Caso contrário, poderia ter sido devido a um pico de ruído.
iv) O número correspondente a cada tecla encontra-se em uma tabela de consulta, armazenado na ordem
das teclas do teclado. Uma vez feita a identificação, esta é trazida e salva em um local de memória,
após o qual pode ser exibida se necessário.
v) O programa do Exemplo 9.19 finalmente salva a tecla pressionada em um local chamado 'KEY'.
Exemplo 9.19
Este programa testa o pressionamento de uma tecla em um teclado hexadecimal e identifica a tecla.
ROW_0 DB 0, 1, 2, 3
ROW_1 DB 4, 5, 6, 7
ROW_2 DB 8, 9, 0AH, 0BH
ROW_3 DB 0CH, 0DH, 0EH, 0FH
BD CHAVE 0
ATRASO FINAL
FIM
Machine Translated by Google
os LEDs são dispositivos de exibição muito populares. Eles são fáceis de usar e oferecem uma tela muito
brilhante e agradável que pode ser vista igualmente bem de qualquer ângulo de visão, ao contrário dos LCDs.
A única desvantagem dos displays de LED é a alta quantidade de corrente que eles precisam, ao contrário
dos LCDs que precisam de energia muito baixa. A Figura 9.39 mostra que um único LED pode ser
conectado a uma fonte de alimentação positiva conforme mostrado. O valor do resistor limitador de
corrente depende da corrente nominal do LED. Suponha que precisamos de vários LEDs para displays,
geralmente usamos apenas uma fonte de energia para todos eles. Nesse caso, eles são conectados
como displays de LED de 'ânodo comum' ou 'cátodo comum'. Na Fig 9.40b os cátodos dos três LEDs são
conectados entre si. Se quisermos acender apenas o primeiro e o terceiro LED, ou seja, aplique um '1' apenas em A1 e A3.
Na Fig 9.40a, que é 'ânodo comum', K1 e K3 sozinhos devem ser aterrados, para o mesmo resultado.
+5
(b)
A1 A2 A3
(uma) +5
R1 R2 R3
D1 D2 D3
D1 D2 D3
K1 K2 K3
uma
f b
g
c
e
d
dP
ser iluminado. A primeira informação (aterramento do cátodo) corresponde aos dados do 'dígito' e a segunda
são os dados do segmento. Ao iluminar seletivamente os segmentos, podemos ter todos os caracteres
alfanuméricos exibidos.
Agora, suponha que queremos usar tal módulo para exibir um único caractere. Pensemos em um cenário
em que o número a ser exibido é enviado de um 8086 a um 8255, para o módulo de exibição. Acabamos de
enviar o código (chamado de código de sete segmentos) correspondente aos segmentos do LED. Este
código fornece a informação de qual dos segmentos deve ser iluminado para a exibição de um caractere
específico.
Suponha que usemos apenas um módulo de exibição de um dígito. Se for um tipo de cátodo comum,
aterramos o cátodo comum e enviamos o código de sete segmentos diretamente para ativar os segmentos
necessários. Isso faz com que alguns dos segmentos fiquem LIGADOS e outros DESLIGADOS. De qualquer
forma, enquanto o display estiver LIGADO, o módulo consome a corrente necessária da fonte de alimentação.
Isso pode estar na faixa de 5 a 30 mA para um único segmento a ser iluminado. A tela está ligada o tempo
todo e, portanto, é chamada de tela 'estática'. Suponha que precisamos de um display de oito dígitos.
Se usarmos o mesmo tipo de exibição estática, a corrente extraída é multiplicada por 8, e isso se torna uma
quantidade bastante grande. Multiplique 7 × 25 × 8 mA. Isso dá um valor de 1,4 A, que é muito grande para
um circuito eletrônico. Por esta razão, displays estáticos não são preferidos para displays de múltiplos dígitos.
i) O ânodo/cátodo comum de um dígito deve ser ativado para que um dígito esteja ativo.
Segmento
Lógica de condução
Porta B
8
2
5
5
Condução de dígitos
Lógica
Porta A
Figura 9.42 | Display dinâmico de oito dígitos conectado a duas portas de um 8255
uma
f b
g
c
e
d
dP
D7 D6 D5 D4 D3 D2 D1 D0
dp g fedcb uma
Agora, vamos usar esse conceito em um sistema no qual um 8086 lida com um display dinâmico usando o
8255 como um chip de interface (veja a Fig 9.42). Este é um display de 8 dígitos, do cátodo comum
modelo. As portas do 8255 são usadas de tal forma que a Porta A fornece as informações de dígitos e a
Porta B fornece as informações do segmento. A informação do dígito serve para selecionar qual dígito está
sendo ativado em um determinado momento. Para informações de segmento, o código de sete segmentos
de cada dígito deve ser enviado como um byte. Para identificar qual segmento corresponde a qual bit em um
byte, veja a Fig 9.43. Esta é apenas a maneira como os pinos da porta são conectados aos terminais do
módulo de sete segmentos neste exemplo, o que significa que não é uma conexão padrão.
Exemplo 9.20
Assumindo um tipo de exibição de catodo comum, encontre os sete códigos de segmento a serem enviados
à Porta B para exibir i) 8, ii) A, iii) b.
Solução
Por ser um tipo de cátodo comum, o cátodo comum dos LEDs de um dígito deve ser aterrado. Em seguida,
forneça as informações do segmento aos ânodos.
Machine Translated by Google
Q8 Q7 Q6 Q5 Q4 Q3 Q2 Q1
E8 E7 E6 E5 E4 E3 E2 E1
E1–E8
Porta A
8
2
Driver de dígitos
5
5
Porta B
Driver de segmento
Figura 9.44 | Display dinâmico de oito dígitos com drivers de segmento e dígito
Machine Translated by Google
Isso deve ser repetido para todos os dígitos enquanto quisermos que esses dados sejam exibidos. As etapas
estão listadas a seguir.
1. Selecione o primeiro dígito a ser exibido e envie uma palavra adequada à Porta A para ativar este dígito.
2. Envie o código do segmento pela Porta B.
Com 8 dígitos e atraso de 1,5 ms, podemos voltar ao primeiro dígito a cada 12 ms. Isso corresponde a uma taxa
de atualização de cerca de 80 ms que é suficiente para enganar os olhos e acreditar que todos os dígitos estão
ligados ao mesmo tempo.
Agora, vamos escrever um programa para usar o circuito acima para exibir dados.
Exemplo 9.21
Exiba a palavra 'atitude' nos 8 LEDs.
Solução
Aqui, para ativar o dígito mais à esquerda, é enviado o byte 0111 1111. Para o segundo dígito, essa
sequência é girada para a direita uma vez. O código de segmento para cada caractere é armazenado no
local denominado TABLE.
TABELA DB 5FH,78H,78H,04,78H,3EH,5EH,7BH
VOLTAR: DEC DX
JNZ VOLTAR
CERTO
ATRASO FINAL
FIM
Exemplo 9.22
Escreva um programa para mover o caractere 'U' da direita para a esquerda continuamente.
Solução
Os dados correspondentes ao caractere a ser exibido são armazenados no local DAT. Quando o primeiro dígito
é ligado, ele exibe 'U'. Em seguida, após um atraso, esse mesmo caractere é exibido apenas na segunda posição.
O importante aqui é que o atraso entre a ativação sucessiva dos dígitos seja alto o suficiente para que a
persistência da visão não se aplique. Assim, a letra 'U' é vista movendo-se da esquerda para a direita
continuamente na tela.
O atraso deve ser muito alto (comparado ao caso do Exemplo 9.21) para criar tal efeito.
ATRASO FINAL
Este programa rola um caractere ao longo da tela. Um programa muito interessante para experimentar será ter
um rolo de mensagens da esquerda para a direita. Suponha que queremos rotacionar a sequência ABCDEFGH,
Machine Translated by Google
D1 D2 D3 D4 D5 D6 D7 D8
T1 AB CDE F G H
T2 HA B CDE F G
T3 GHAB CDE F
T4 F GHAB CD E
T5 E F GAB C D
T6 DE F GHAB C
T7 CDE F GHA B
Q8 B C DE F GH A
o display será como mostrado na Tabela 9.10. D1, D2 … mostra as posições dos dígitos e T1, T2 …
corresponde aos instantes de tempo em que os caracteres correspondentes são vistos no display.
O atraso deve ser grande o suficiente para criar uma sensação de movimento. O programa para
este problema fica como um desafio aos leitores interessados.
| Um 'kit de treinamento' com um 8086 e circuitos associados nos ajuda a entender as ideias de hardware
interface com o 8086.
| Para fazer a interface do processador com vários periféricos, chips controladores de periféricos especializados são
usado.
| Um chip que atua como intermediário na transferência paralela de dados é o periférico programável
chip de interface (PPI) 8255.
| O PPI tem três portas de 8 bits A, B e C que são programáveis como portas de entrada/saída.
| A porta paralela do PC usa o modo 1 do 8255 para todas as transferências paralelas de dados, mas a porta paralela está
ficando mais ou menos obsoleta.
| Um conversor analógico para digital pode ser conectado ao 8086 usando um 8255 como intermediário.
| Um DAC pode ser usado para obter formas de onda analógicas geradas pelo 8086.
| LCDs são dispositivos de exibição muito populares. Dados e palavras de comando podem ser enviados para seus registradores
internos para obter exibições em diferentes formatos.
| Os motores de passo são usados para obter uma rotação precisa e controlada. Eles podem ser alimentados com sequências
de pulso do 8086 canalizado através do PPI.
| O motor mais inclinado precisa de mais corrente do que pode ser fornecida pelo 8255. Portanto, o driver atual
transistores /ICs são usados em tais circuitos.
| Para entender como os teclados funcionam, um teclado hexadecimal pode ser usado.
| Os LEDs são displays populares, mas consomem muita corrente. Assim, LEDs de sete dígitos de segmento são usados de
forma multiplexada.
Machine Translated by Google
PERGUNTAS
11. Cite algumas aplicações do motor de passo. Por que os motores CC não podem ser usados aqui?
12. Distinguir entre as sequências de acionamento de passo completo e acionamento de meio passo do motor de passo
sequências de condução.
13. Por que não podemos conectar diretamente o motor de passo dos pinos da porta do 8255?
16. Por que as telas dinâmicas são preferidas nas telas de vários dígitos?
EXERCÍCIO
2. Escreva a palavra de controle BSR para definir PC3 e PC2 e desmarque PC5 e PC4.
3. Com um clock de 5 MHz, escreva um programa para obter uma onda quadrada simétrica da porta B do 8255.
4. Escreva um programa para obter uma onda quadrada assimétrica de 20% do ciclo de trabalho do pino da porta PC2.
5. Escreva a palavra de controle para operação do modo 1 com a porta A na saída estroboscópica e a porta B na
entrada estroboscópica.
7. Encontre o nome de qualquer ADC padrão de 12 bits e liste seus sinais de controle. Desenhe a figura mostrando
como ele pode ser conectado a um 8086 através de uma porta paralela.
8. Conecte um DAC ao 8086 com uma frequência de clock de 5 MHz e escreva programas para gerar a) uma forma de onda
triangular de T = 1 ms, b) uma rampa de T = 3 ms, c) uma forma de onda em escada de 6 degraus cada do período de tempo
0,2 ms.
periférico
1 0 interface – ii
| O método de geração de formas de onda de diferentes | Como as interrupções são gerenciadas pelo chip
frequências usando este chip. controlador de interrupção programável 8259.
| A utilização dos diferentes modos de funcionamento do | O uso de inicialização e operacional
palavras de controle de 8259.
chip temporizador.
| O uso de um chip dedicado 8279 para interface de | O método de alterar as configurações de prioridade
teclado e tela. usando este chip.
| As conexões entre o 8279 e o | O uso de 8259 em PCs.
circuitos de exibição.
Introdução
No Capítulo 9, usamos a interface de porta paralela IC 8255 para muitas aplicações. Isso foi feito para ilustrar o fato de
que os dados estão disponíveis para transferência na forma paralela – para que possam ser enviados para vários
periféricos externos, cada um com funções específicas. Em todas essas aplicações, o 8255 PPI foi usado principalmente
como intermediário de transferência de dados, juntamente com a capacidade de gerar sinais para controlar os periféricos
individuais.
Neste capítulo e no próximo, vamos nos familiarizar com mais alguns chips periféricos com aplicações
especializadas. O primeiro é o chip temporizador 8253/8254.
D7 1 24 Vcc
D6 2 23 WR
D5 3 22 RD
D4 4 21 CS
D3 5 20 A1
8
D2 6 19 A0
2
D1 7 5 18 CLK 2
3
D0 8 17 SAÍDA 2
CLK 0 9 16 PORTA 2
SAÍDA 0 10 15 CLK 1
PORTA 0 11 14 PORTA 1
GND 12 13 SAÍDA 1
0 0 1 Contador 1
0 1 0 Contador 2
0 1 1 Registro de controle
O chip 8253 é um chip temporizador programável usado para aplicações de temporização. Outro chip 8254 também está
disponível, que é o mesmo que 8253, exceto que é capaz de ser operado em frequências mais altas. Na verdade, 8254 é um
superconjunto de 8253 e todos os programas escritos para 8253 podem ser usados para 8254. Ambos os chips temporizadores
fornecem três temporizadores independentes de 16 bits, mas o 8253 pode lidar com entradas de clock de apenas 2,6 MHz,
enquanto o 8254 pode ser usado até 10 MHz. Ambos os chips estão disponíveis como DIP de 24 pinos, e o diagrama de pinos é
mostrado no 8253/8254 na Fig 10.1. No IBM PC foi usado inicialmente o 8253, mas agora no PC-AT, o chip temporizador utilizado
é o 8254 que é compatível com pinos 8253.
Agora vamos dar uma boa olhada nos detalhes internos do chip. Como mostra o diagrama de blocos interno, existem três
contadores independentes e a operação destes é gerenciada por um registro de controle. Para selecionar essas quatro entidades,
dois pinos de endereço A1 e A0 e a linha de seleção de chip CS são usados conforme mostrado na Tabela 10.1.
10.1.1 | Contadores
O diagrama de blocos (Fig. 10.2) mostra que cada contador possui três pinos associados às suas operações – CLK, GATE e OUT.
Machine Translated by Google
CLK 0
8 Dados
D7–D0
Ônibus
PORTA 0
Contador 0
Amortecedor
SAÍDA 0
RD
CLK 1
WR
Ler/
Escreva PORTA 1
Contador 1
A0 Lógica
SAÍDA 1
A1
CLK 2
Ao controle
Palavra
Contador 2 PORTA 2
Registro
SAÍDA 2
CLK Th is pin corresponde ao pino no qual uma frequência de entrada é recebida e todos os atrasos são
calculados com base nessa frequência f. T = 1/f é o período de tempo dessa frequência de entrada e usaremos
T em todos os nossos cálculos. Esta frequência não deve ser superior a 2,6 MHz para 8253, mas pode ser tão
alta quanto 10 MHz para o 8254.
GATE Th funciona como um pino de controle para cada um dos temporizadores. Isso tem que ser alto (Gate =
1) na maioria dos modos de operação, mas é usado como um pino de disparo em alguns modos e então deve
ser um pulso de 0 a 1.
OUT Cada contador possui um pino de saída e as formas de onda geradas pela programação do contador
específico podem ser observadas neste pino.
Pinos de Dados e Controle Os outros pinos do chip são os pinos de dados D0 a D7 e os pinos RD e WR . Os
pinos de dados são conectados aos pinos de dados de ordem inferior do processador. Os pinos de controle de
leitura e escrita são ativados pelos ciclos de leitura e escrita de E/S, respectivamente, do processador.
Machine Translated by Google
Barramento interno
Ao controle Status
Palavra Robusto
Registro
CRH CRL
Status
Registro
Ao controle
Lógica
ISTO
FUROS
OH TUDO
CLKN OUTN
contador. O registrador de controle é comum a todos os contadores, mas os demais blocos são
replicados para cada contador. CR significa registro de contagem, os subscritos H e L são para byte
alto (MSB) e byte baixo (LSB), respectivamente. CE é o elemento de contagem e OL significa trava de
saída. Este diagrama de blocos será útil para entender o procedimento de leitura do conteúdo de um
registro de contagem. Isso é discutido na Seção 10.1.13.
D7 D6 D5 D4 D3 D2 D1 D0
Selecionar Ler/
Modo
Contador Carregar
Modo M2 M1 M0
RL1 RL0 0.000
0 0 ROBUSTO 1 001
0 1 LSB 2 010
1 0 MSB 3 011
1 1 LSB/MSB 4 100
5 101
é '0'. Em binário, a contagem pode ser de 0 a FFFFH – em BCD, o número pode variar
apenas de 0 a 9999.
Lembre-se de que a contagem máxima de BCD pode ser apenas 9999, que deve ser escrita como 9999H
(consulte a Seção 0.6.4), enquanto a contagem binária máxima pode ser FFFFH.
Exemplo 10.1
Configure a palavra de controle para os seguintes casos.
a) Contador 0 no modo 3, contagem em BCD, especifica que uma contagem de 16 bits é escrita com LSB
primeiro.
b) Contador 2 em modo 0, contagem em formato binário, contagem carregada como no caso anterior.
Solução
D7 D6 D5 D4 D3 D2 D1 D0
00110111
Solução
D7 D6 D5 D4 D3 D2 D1 D0
10110000
Exemplo 10.2
Encontre os endereços dos registradores de controle e os três contadores para a lógica de decodificação
mostrada (Fig 10.5).
Solução
Registro de Controle 1 1 00 1 1 1 0 EC
Contador 0 1 1 00 1 0 0 0 C8
Contador 1 1 1 00 1 0 1 0 AC
Contador 2 1 1 00 1 1 0 0 CC
Machine Translated by Google
8
A2 A1 2
A1 A0 5
3
CS
A7
A6
A5
A4
ISTO
A3
A0
Agora, vamos usar o chip temporizador em seus vários modos. Os diferentes modos são listados como:
M2 M1 M0
1 0 0 1 Um tiro programável
2 X 1 0 Gerador de taxa
Para ter uma ideia do uso do chip temporizador, vamos primeiro usá-lo no Modo 3, que é o mais simples e direto dos
modos. O modo 3 é usado para gerar ondas quadradas de uma frequência desejada.
Exemplo 10.3
A frequência de entrada para o chip temporizador é de 1,5 MHz. Gere uma onda quadrada de 1,5 KHz usando o Timer
0.
Solução
Assim, o número a ser carregado no registrador de contagem é 1000, ou seja, 1000 é o número que divide
1,5 MHz para obter 1,5 KHz. O que isso significa é que, quando o contador começa a funcionar, esse
número diminui para zero e 1000 ciclos do sinal de entrada ocorrem durante esse período.
Antes de escrever o programa, a palavra de controle deve ser projetada (consulte a Fig 10.4). A palavra de
controle é
0 0 1 1 0 1 1 0 ou seja, 36H
Esta palavra seleciona o contador 0 e usa o modo 3. Ela também carrega primeiro o registrador de contagem com LSB
e depois com o MSB. A contagem é carregada como um número binário. Portanto, D0 é '0'.
Programa
CR EQU 0CEH
CNT0 EQU 0C8H
O sinal de saída do terminal OUT 0 divide a frequência de entrada por 1000. Vê-se que a frequência de
entrada é dividida por N neste modo. Para este modo, se o número N for par, as partes alta e baixa são
do mesmo período. Se N for ímpar, o pulso alto é (N + 1) / 2 × T e o pulso baixo é (N ÿ 1) / 2 × T. Observe
que T é o período da frequência de entrada. É obrigatório manter GATE = 1 para que o contador funcione.
Carregamos um número no registro de contagem que diminui para 0. Depois disso, esse número é
recarregado no registro de contagem e é assim que uma onda quadrada contínua é obtida.
SAÍDA 0
0,66 ms.
CLK 0
1000 ciclos
Exemplo 10.4
Gere três frequências diferentes do temporizador 8253. Use uma frequência de clock de 1,5 MHz para todos os
contadores.
Solução
Com este programa, o contador 0 divide a frequência de entrada por 10, o contador 1 por 100 e o contador
2 por 1000. Usamos o BCD do bit D0 ( = 1) da palavra de controle, e assim usamos os números 10H,
100H e 1000H como a contagem para os três casos. Deve ficar claro que para escrever BCD em
hexadecimal, 1000 deve ser escrito como 1000H, 100 como 100H e assim por diante (consulte a Seção
0.6.4). Para usar a opção binária, devemos escrever as contagens como 0AH, 64H e 3E8H depois de garantir que o D0
bit na palavra de controle é feito '0', para cada um dos casos. As palavras de controle dos três contadores seriam
então 36H, 76H e B6H.
Agora, vamos examinar todos os modos do chip temporizador. Lembre-se de que, associados a cada um
dos três contadores, existem três pinos – o relógio, o portão e o de saída. O portão
Machine Translated by Google
é uma entrada de controle. Em alguns modos, é obrigatório manter GATE = 1, mas em alguns outros modos, o
GATE deve ter uma transição baixa para alta para que a operação naquele modo tenha efeito.
ser usado para gerar um evento após um período de tempo programado. GATE = 1 deve ser mantido para que
este modo funcione. O que precisamos fazer para usar neste modo é carregar um número N no registrador de
contagem. A saída é normalmente baixa e aumentará depois que a contagem de terminais for atingida, ou seja,
quando N cair para 0. A largura do pulso baixo é N × T onde T é a duração do pulso de clock de entrada. Este
modo pode ser usado para interromper o microprocessador após um período de atraso.
Nota Se, no meio, o pino GATE ficar baixo, a contagem será interrompida e a duração baixa será estendida pela
quantidade de tempo que o portão for mantido baixo.
Exemplo 10.5
Use o contador 0 no modo 1 para gerar um atraso de 10 ms. Após esse atraso, o pino OUT 0 deve ficar alto. A
frequência de clock usada para o chip contador é de 1,5 MHz.
Solução
CLK 8 8
SAÍDA 0 INT
Da óptica 2 0
Señor 5 8
3 6
PORTÃO
(uma)
PORTÃO
FORA
N×T
(b)
PORTÃO
FORA
N×T
Contar
Recarregado
Figura 10.8b | Forma de onda de saída quando uma nova transição L para H é dada ao GATE antes que N × T seja alcançado
Machine Translated by Google
Exemplo 10.6
Considere uma forma de onda de entrada de porta de 1 KHz, entrada de clock de 1,5 MHz (T = 0,66 ms).
O programa a seguir fornece um pulso de saída baixo de 0,2 ms, da saída do contador 0 somente quando
a porta recebe uma transição de baixo para alto. Para calcular o valor da contagem, N × 0,66 m segundos =
0,2 ms. N = 303 = 12 FH.
Aplique um sinal de 1 KHz na entrada da porta e desenhe a forma de onda de saída em OUT 0. O pulso
baixo não é produzido quando a contagem é carregada no registrador de contagem – ele inicia apenas quando
ocorre uma transição baixa para alta na porta.
Solução
PORTÃO
1 ms.
FORA
FORA
T
N×T
WR
Exemplo 10.7
CR EQU 0CEH ;endereço do registro de controle
CNT0 EQU 0C8H ;endereço do contador 0
Exemplo 10.8
Gere uma onda quadrada de 10 KHz a partir do contador 0 e use o contador 2 para obter uma forma de onda
de saída assimétrica.
Solução
Aplique um clock de 1,5 MHz ao CLK0. Conecte OUT 0 ao pino CLK2 e observe a saída no pino OUT2.
SAÍDA 0
0,1 ms
SAÍDA 2
O sinal de OUT 0 é uma onda quadrada simétrica obtida pela divisão de CLK0 (1,5 MHz) por 150. Sua
frequência é 10 KHz e seu T é 0,1 ms. O contador 2 está programado para funcionar no modo 2 com uma
contagem de N = 3. Sua frequência de entrada é 10 KHz. Ele irá gerar um sinal de saída que é alto para 3T
(0,3 ms) e baixo para um período de seu clock de entrada, ou seja, 0,1 ms. Assim, uma forma de onda de
saída assimétrica é obtida, conforme mostrado na Figura 10.11.
PORTÃO
FORA
NxT T
WR
Figura 10.12 | Forma de onda de saída para o modo 5, começando da transição L para H do GATE
Machine Translated by Google
Agora a contagem atual está disponível no AX, que deve ser movida para COUNT, um local de memória.
Vcc
IRQ 4
RL0-7
Dados
8
Ônibus
Data chave
MUDANÇA
RD 8
Interface da CPU 2 CNTL/S TB
WR
7
9
CS
SL0-3 4 Varredura
A0
REDEFINIR
A0-3 4
Exibição
CLK
Dados
B0-3 4
BD
Vss
O circuito é para usar o 8279 para fazer interface com um display dinâmico multiplexado de 8
dígitos. Conforme discutido na Seção 9.13.2, para um display multiplexado, são necessárias duas
sequências de sinal.
i) Apenas um dígito deve ser ativado por vez, e assim uma sequência que liga 'ON', apenas um dos
transistores de dígitos é necessário. As linhas de varredura SL0 a SL3 do 8279 geram uma
seqüência contínua de números de 0000 a 1111. No caso que estamos discutindo, como apenas
oito dígitos devem ser exibidos, SL0 a SL2 são conectados a um decodificador de três a oito
74LS138. Isso dá um sinal baixo apenas em uma de suas oito saídas e, portanto, cada transistor
de dígito é ligado em sequência. Apenas um dos oito transistores Q9 a Q16 estará LIGADO de
cada vez. Os LEDs são conectados como cátodo comum, e quando, digamos, o transistor Q9 está
LIGADO, ele aterra o cátodo dos LEDs do dígito correspondente.
Assim, quando a informação do segmento é fornecida nos ânodos, este dígito pode exibir o
caractere correspondente à informação do segmento.
ii) Quando um determinado dígito é ativado, a informação do segmento correspondente a esse dígito
obterá sua saída do chip. Isso é feito nas linhas de saída A0 a A3 e B0 a B3 do chip. Para aumentar
a capacidade de condução de corrente (para fornecer uma exibição brilhante), os transistores Q1 a
Q7 são usados entre as linhas de saída e os segmentos do LED. Assim, um segmento fica aceso
apenas quando um 'alto' aparece nos coletores dos transistores de acionamento (observe que os
transistores são do tipo PNP). Para isso, as linhas de saída A0 a A3 e B0 a B3 devem estar
baixas – ou seja, para que um segmento seja iluminado, o bit do 8279 deve ser '0'. No entanto,
observe que isso não é um recurso do 8279; em vez disso, é devido às conexões usadas entre o
chip e a tela.
Machine Translated by Google
VCC
8279
D0 22K x 8
DB0
D1
DB1 BC 158×8
D2 R1
DB2 A0
D3 Q1 uma
DB3
D4 R3
DB4
D5 A1
Q2 b
DB5
D6 R5
DB6 A2
D7 Q3 c
DB7 R7
A3 Q4
d
CLK R2
CK
B0 Q5 e
R4
B1 Q6 f
R6
B2 Q7 g
R8
B3 Q8 dp
Q15
UMA S0
Y0 Q14
B S1
Y1
C
Y2 Q13
7 Y3
Y4 Q12
4
Y5
1 Q11
3
Y6 Q10
8
Y7 Q9
BC 158×8
iii) O chip possui uma RAM de exibição de 16 bytes na qual os sete códigos de segmento dos caracteres de
exibição devem ser escritos. O chip percorre automaticamente um processo de envio do código para um
dígito, ligando o dígito por um curto período de tempo e depois repetindo o procedimento para o próximo.
Entre a exibição de um dígito e o seguinte, o chip também envia um 'código em branco' que desliga todos
os segmentos, de modo a evitar o 'fantasma' de informações de um dígito para o próximo.
Barramento de dados D7 D6 D5 D4 D3 D2 D1 D0
8279 saídas A3 A2 A1 A0 B3 B2 B1 B0
Segmentos d c b uma
dp g f e
Exemplo 10.9
Quais dados devem ser emitidos do 8279, para exibir os seguintes caracteres, com referência à conexão na
Fig 10.14?
Ia
ii) 5
iii) em branco
Solução
Para as conexões da Fig. 10.14, para qualquer segmento ser iluminado assim, o bit correspondente deve ser
'0'.
i) Para A, os segmentos a serem ativados por um '0' são a, b, c, e, f, g. Da Fig 10.15, o byte correspondente
é 1000 1000 ou seja, 88H.
ii) Para 5, os segmentos a serem iluminados são a, c, d, f, g. O byte é 0010 1001 ou seja, 29H.
iii) Para nenhum segmento ser iluminado, o byte é 1111 1111 ou seja, FFH.
uma
f b
g
e c
d
dP
No entanto, aqui temos que enviar uma sequência binária. Isso é feito pelas linhas de varredura SL0 a SL3. Existem duas opções para
usar essas linhas de varredura. Existem dois tipos de varreduras de teclado –
varredura codificada e varredura decodificada.
Varredura Codificada Também para o teclado, são usadas as linhas de varredura SL0 a SL3 do chip. No modo de varredura codificada,
essas linhas geram uma sequência binária de 0000 a 1111. Um decodificador é então usado para gerar um baixo em apenas uma de
suas linhas de saída. Isso é mostrado como é usado em nosso exemplo.
Varredura decodificada Neste caso, um decodificador não é necessário. Os pinos SL0 a SL3 geram uma sequência de pulsos 'baixos'
diretamente nas linhas. Isso pode ser usado se houver apenas 4 dígitos para atualizar.
Para detectar um pressionamento de tecla e identificar a tecla, as linhas RL0 a RL7 são as linhas de 'retorno'. Existem buffers de
retorno dentro do chip que armazenam e travam as linhas de retorno. No modo de teclado, essas linhas de retorno são verificadas
procurando por fechamentos de teclas nessa linha. Se um pressionamento de tecla for detectado, um circuito de debounce (dentro do
chip) aguarda 20 ms para confirmar o pressionamento de tecla. Se o fechamento da chave for confirmado, o endereço da chave (em
termos de sua posição de linha e coluna e status dos pinos SHIFT e CONTROL) é armazenado em uma RAM FIFO.
Vamos entender isso usando o teclado mostrado na Fig 10.16. Aqui utilizamos um teclado hexadecimal com 16 teclas, além de
duas teclas para CNTL (controle) e SHFT (shift). As 16 teclas estão dispostas em duas linhas e oito colunas. O decodificador 3 a 8
(usado também para a interface do display) fornece dois sinais S0 e S1 (em resposta à sequência produzida em SL0 a SL2 – Ref Fig
10.14 também) e essas duas linhas são conectadas às linhas do teclado , enquanto as colunas estão conectadas aos pinos RL0 a RL7
do chip. Os RLs são linhas de entrada de 'retorno'
0 1 2 34 5 6 7
S0
8 9 UMA BC D E F A partir de
74LS138
S1
CNTL
00EEEXXX
VARREDURA RETORNA
MUDANÇA
CNTRL
das colunas para o chip. A idéia é que as linhas de varredura façam com que 'baixos' sejam
emitidos nas linhas e o status das colunas seja retornado ao chip. Lembre-se de que este é o
mesmo princípio de interface de teclado discutido na Seção 9.12, mas aqui, o 8279 faz isso
automaticamente em resposta às palavras de controle que usamos.
O código da tecla de retorno que é produzido tem um formato conforme mostrado na Fig 10.17.
Este código é armazenado em uma RAM FIFO de oito bytes onde FIFO significa 'First-In First-Out'. Esta
RAM armazena os códigos das teclas na ordem em que as teclas foram pressionadas.
Um pressionamento de tecla válido também faz com que uma interrupção seja gerada na linha IRQ do chip.
Este pode ser conectado à linha de interrupção do processador, de modo a operar o teclado em modo de
interrupção. Outra coisa que um pressionamento de tecla válido causa é o incremento de uma contagem FIFO em
um registrador de status. Esta informação pode ser usada para verificar se a FIFO contém um código de chave válido.
A Figura 10.18 mostra o diagrama de blocos do sistema que estamos usando, ou seja, display de
LED multiplexado de 8 dígitos e um teclado hexadecimal 2 × 8 com teclas SHFT e CNTRL. Com
essas informações mínimas, vamos para a tarefa de programar o chip para nossa aplicação.
A0 O pino A0 é usado para selecionar entre dados e comando. Se A0 estiver baixo, indica que o barramento
de dados contém dados; caso contrário, deve ser considerado como comando.
Foi mencionado anteriormente que quando A0 é alto, o byte enviado do processador é um comando.
Assim, é óbvio que o registrador de controle tem apenas um endereço (e o registrador de dados
tem outro). No entanto, devido às muitas funções que este chip executa, várias palavras de controle
devem ser escritas. Os três bits superiores do registrador de controle especificam o tipo da
palavra de controle. Discutiremos as palavras de controle na ordem em que devem ser usadas
para uma aplicação específica. Serão discutidas apenas as palavras de controle necessárias para a aplicaçã
Para mais informações, a folha de dados do chip pode ser consultada.
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 DD W KK
Machine Translated by Google
C
Mudança Teclado
o
Matriz
Ao controle
eu
dentro
(2×8)
m
8
n
s Linhas
Retornar
Linhas
S0 S1
7 Y0
DENTRO IRQ
UMA 4
Y1
SL0-2 B eu
8 8
C S
0 2
D0–D7 1
8 7
6 9 Y7
38
Relógio CLK
CLK
Digitar
Motoristas
B0-3 A0-3
Oito dígitos
Exibição
Segmento
Condutor
O display pode ser inicializado para display de 8 ou 16 caracteres. Em nosso exemplo, como temos apenas um
display de 8 dígitos, DD pode ser configurado para um display de 8 caracteres. Isso fará com que as linhas de
atualização SL0 a SL2 mudem de 000 para 111.
Machine Translated by Google
Entrada Esquerda Este é o formato de exibição mais simples e é como uma máquina de escrever. O primeiro caractere é exibido
na posição mais à esquerda e o segundo será exibido à direita do primeiro e assim por diante – assim como os tipos de máquina de
escrever no papel.
Entrada à direita Esta é a forma como a maioria das calculadoras eletrônicas exibem os dados. A primeira entrada é colocada na
posição mais à direita. Para a segunda entrada, o anterior é deslocado para a esquerda e o novo caractere é colocado novamente
na posição mais à direita. Isso é repetido para todos os caracteres.
Uma vez que os caracteres vêm da RAM do display, veja a Fig 10.19 para a forma como o conteúdo da RAM do display é
exibido para cada caso. T1 a T4 são os instantes de tempo em que os caracteres armazenados na RAM do display aparecem no
display. O código de sete segmentos dos caracteres A, B, C, D está na RAM no endereço 0, 1, 2, 3.
O bloqueio de duas chaves acontece quando as chaves são tais que somente se a primeira chave for solta, a segunda chave será
considerada. No rollover da tecla N, se, digamos, duas teclas forem pressionadas quase simultaneamente, ambas serão devolvidas
e seus códigos serão armazenados na FIFO RAM na ordem em que foram pressionadas.
Uma matriz de sensor é uma matriz de sensores do tipo interruptor, cuja condição pode ser armazenada em
a FIFO RAM (8 × 8 = 64 estados de comutação).
UMA UMA T1
3 D
UMA B UMA B T2
2 C
1 B
BATER
MORADA
UMA B C D UMA B C D T4
CERTO DEIXEI
ENTRADA ENTRADA
Figura 10.19 | Conteúdo da memória RAM exibida para entrada direita e entrada esquerda
Machine Translated by Google
Exemplo 10.10
Escreva a palavra de controle do teclado/display para o caso de um display de 8 caracteres com entrada à direita e
teclado de varredura codificado – bloqueio de 2 teclas.
Solução
D7 D6 D5 D4 D3 D2 D1 D0
0 00 1 0 0 00
ou seja, 10H
D7 D6 D5 D4 D3 D2 D1 D0
0 01 P PP P P
Todos os sinais de temporização e multiplexação para o 8279 são gerados por um pré-escalador interno.
Este pré-escalador divide o relógio externo por um inteiro programável. Bits PPPPP determinam o valor
deste inteiro que varia de 2 a 31. Escolher um divisor que produza 100 KHz dará os tempos de varredura
e debounce especificados. Por exemplo, se o 8279 for sincronizado por um sinal de 2 MHz, o PPPPP
deve ser definido como 10100 para dividir o clock por 20 para produzir a frequência de operação
adequada de 100 KHz. Para dividir por 30, a palavra de controle é 0011 1110.
D7 D6 D5 D4 D3 D2 D1 D0
1 1 0CD CD CD CF CA
CD CD CD – Os dois bits de CD inferiores especificam o código de apagamento a ser enviado aos segmentos
para desligá-los enquanto o display está mudando de um dígito para o próximo.
CF – Se CF = 1, o status FIFO é apagado, as linhas de interrupção e saída são redefinidas e o ponteiro RAM do
sensor é definido como Linha 0.
CA – Clear all bit tem o efeito combinado de CD e CF. Ele usa o código de limpeza do CD
no visor e limpa o status FIFO. Ele também sincroniza a cadeia de tempo interna.
CD CD CD
Exemplo 10.11
Encontre a palavra de controle de exibição clara para o circuito da Fig 10.14.
Solução
Discutimos que, para este circuito, o bit necessário para apagar um segmento é '1'. Portanto,
D3 e D2 são 11. Para habilitar a exibição clara, D4 = 1. CF não é relevante e pode ser 0.
Podemos ter CA = 1.
Portanto, a palavra de controle necessária é 1101 1101, ou seja, CCH
D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 AI AAAA
Para exibir os dados, eles devem ser inseridos na RAM do display. Após esta palavra ser escrita, todas as
escritas subsequentes serão na RAM do display. Lembre-se de que os comandos são escritos usando um
endereço que garante que o pino A0 = 1. Os dados são escritos com A0 = 0.
AI – Incremento Automático. Se AI = 1, o endereço de linha selecionado na RAM do display será incrementado
após cada gravação.
AAAA – Seleciona uma das 16 linhas na RAM do display – portanto varia de 0000 a 1111.
Exemplo 10.12
Escreva a palavra de controle RAM do display
i) com incremento automático
Solução
D7 D6 D5 D4 D3 D2 D1 D0
0 1 0 AI XAAAA
Exemplo 10.13
Escreva a palavra de controle para configurar o FIFO para ler as teclas que são pressionadas.
Solução
A palavra de controle é
0100 0000 ou seja, 40H
Exemplo 10.14
Escreva um programa para exibir '5' na primeira posição do LED do display de LED usado, conforme o diagrama
de blocos da Fig 10.14. O display é composto por 8 LEDs para serem usados no modo de entrada à esquerda.
O teclado é do tipo 'teclado de varredura codificado – bloqueio de 2 teclas'. O endereço do registrador de dados
é 0C0H e do registrador de controle é 0C2H.
Solução
As palavras de controle para configurar o display, limpar o display e para escrever na RAM do display foram
projetadas nos Exemplos 10.10 a 10.12 e podem ser usadas aqui.
Este programa exibe '5' na localização do primeiro dígito. O restante dos dígitos não acende porque o dado dado
a esses dígitos é FFH, que corresponde a nenhum segmento sendo aceso.
Exemplo 10.15
Escreva um programa para exibir uma mensagem contínua 'H' movendo-se continuamente para a esquerda.
Solução
Aqui o código de sete segmentos para 'H' está no local chamado TABLE. Em seguida, os códigos de 'sem
exibição', ou seja, FFH é escrito 3 vezes e isso é repetido mais uma vez. Um contador de 8 causa isso
Machine Translated by Google
seqüência a ser exibida uma vez. A tela vista é 'H' movendo-se para a esquerda seguido por três espaços em branco.
Com efeito, mostra 'H' movendo-se da direita para a esquerda continuamente.
ATRASO FINAL
Sempre que uma tecla é pressionada, o código da tecla entra na FIFO RAM. Esta ação também incrementa
uma contagem em um registrador de status que dá a informação sobre o número de caracteres na FIFO e
dá, além de outras coisas, a indicação se a FIFO está cheia. Este registro de status pode ser lido para obter
as informações necessárias. Figura 10.20
mostra a configuração de bits do registrador de status, que possui o mesmo endereço do registrador de
controle. A diferença é que se 'escreve' em um registrador de controle, mas 'lê' de um registrador de status.
Observe que os três bits mais baixos indicam o número de caracteres na RAM FIFO. Se esses bits forem
zero, entende-se que nenhum pressionamento de tecla válido ocorreu.
Há bit D3 para indicar que o FIFO está cheio. As duas condições de erro que ele indica são os erros de
saturação e falta de execução. O primeiro será definido quando se tentar escrever em um FIFO completo. O
que isso significa é que mais de 8 caracteres foram escritos na RAM FIFO e, portanto, os dados mais antigos
foram perdidos. O erro de execução implica uma tentativa de ler um FIFO vazio.
Machine Translated by Google
DU S/EOU F NNN
Nº de caracteres em FIFO
FIFO completo
Erro - Subexecução
Erro - superação
Múltiplos fechamentos
Exibir indisponível
Exemplo 10.16
Escreva um programa para ler uma tecla pressionada e armazenar o código da tecla na memória.
Solução
Consulte a Fig 10.17 que mostra a forma como um código de chave é especificado. Este código será
inserido na FIFO RAM quando a tecla for pressionada. Para ler a chave, os passos são (após
pressionar a tecla):
i) Leia a palavra de status e verifique se os três bits mais baixos são zero. Se estiverem, significa que a RAM
FIFO está vazia, o que significa que nenhum pressionamento de tecla válido foi detectado. O registrador
de status tem o mesmo endereço que o registrador de controle, a diferença é que uma palavra de status é
'lida' enquanto uma palavra de controle é 'escrita'.
ii) Se for identificado um pressionamento de tecla válido, leia o código da FIFO RAM, após escrever o 'read
palavra de controle FIFO RAM' no registrador de controle.
No programa acima, durante a leitura do registrador de status, apenas o bit D0 é testado. Isso ocorre porque
é assumido que o FIFO estava vazio anteriormente e, portanto, um pressionamento de tecla torna a
contagem igual a 1.
Na localização DAT, obtemos um código de tecla C6 se '6' foi pressionado, CE se 'E' for pressionado e assim por diante.
O código da chave é obtido conforme mostrado na Fig 10.17 e depende do posicionamento das chaves na matriz
de chaves. Este código corresponde ao teclado usado aqui.
Exemplo 10.17
Escreva um programa que exiba a tecla que foi pressionada.
Solução
Aqui, o código de sete segmentos correspondente às teclas é armazenado na memória e o programa acessa
esses códigos e o exibe, dependendo da tecla pressionada. Os sete códigos de segmento são armazenados na
ordem 0, 1, 2 … F para as 16 teclas. Nenhuma provisão foi feita para explicar o
pressionamento das teclas shift e control.
Quando uma tecla é pressionada e um código de tecla é obtido, o nibble superior desse byte é
mascarado.
Assim, para a chave 6, o código da chave é C6, que é 06 após a operação de mascaramento. O
código de sete segmentos desta chave está disponível no local TABLE + 6.
Este programa exibe todas as teclas que são pressionadas. Após 8 entradas, o FIFO descarta as primeiras
entradas e continua a exibição das teclas pressionadas.
Antes de tentar entender a descrição e o funcionamento do controlador de interrupção programável (PIC), vale
a pena ler a Seção 8.1 para obter uma compreensão precisa e clara do mecanismo de interrupções em geral e
também os detalhes específicos da estrutura de interrupção de o 8086. Isto irá percorrer um longo caminho no
entendimento do uso e funcionalidade deste chip que é dedicado ao gerenciamento das interrupções de
hardware do sistema.
Lembre-se de que existem apenas duas linhas de interrupção de hardware para o 8086. Um dispositivo
externo pode colocar sua solicitação de interrupção em qualquer um desses pinos. Um pino chamado NMI é
uma interrupção 'vetorada', no sentido de que seu manipulador de interrupção é apontado por um número de
tipo específico, que é '2'. Assim, a NMI é uma interrupção do tipo 2 e, como não é mascarável, é usada para
serviços importantes e de alta prioridade. Como tal, este pino de interrupção não está disponível para
solicitações gerais de interrupção de vários periféricos. Isso deixa apenas um pino para aceitar solicitações de
interrupção de hardware e, se muitos periféricos quiserem usar esse pino, obviamente vários problemas devem
ser resolvidos. É neste contexto que é necessário um controlador de interrupção dedicado.
O primeiro controlador de interrupção 8259 foi projetado apenas para o microprocessador 8080. Mais tarde foi
disponibilizado o 8259A que também dá suporte ao processador x86. No entanto, usaremos a própria palavra
8259 para 8259A, porque o 8259 original está obsoleto agora. Este é o chip padrão que atua como um
gerenciador de interrupção para um sistema – dependendo do tamanho e dos requisitos do sistema, pode
haver um ou mais controladores de interrupção. Veja a conexão básica entre o 8086 e o 8259 na Fig 10.21.
O PIC possui oito linhas de solicitação de interrupção IR0 a IR7, nas quais os periféricos podem fazer
suas solicitações de interrupção. Se apenas uma solicitação de interrupção for recebida no chip, essa solicitação
será canalizada para a linha INTR do processador. Como é a seqüência usual, o processador envia de volta
uma solicitação de reconhecimento na forma do sinal INTA . Então o PIC (em nome do periférico que fez o
pedido) envia para o 8086 o número do tipo de interrupção correspondente àquela interrupção específica. Isso
implica que o PIC deve ter sido programado para enviar um número de tipo específico para uma determinada
solicitação de interrupção.
Outra atividade do chip é resolver prioridades. Suponha que as solicitações de interrupção cheguem a
mais de uma entrada de interrupção do chip. Qual dessas solicitações deve ser canalizada para o processador?
Esta decisão é tomada pelo PIC e deve ser programada para isso. Deve haver também a possibilidade de
alterar as prioridades.
Machine Translated by Google
D0–D7
IR0 IR0
IR1 IR1
8 IR2 IR2
8
2 IR3 IR3
0
8 5 IR4 IR4
ENQUANTO ENQUANTO
6 9 IR5 IR5
DENTRO INT IR6 IR6
IR7 IR7
Suponha que existam mais de 8 possíveis fontes de interrupção, mais PICs podem ser usados, o que significa
que o chip possui pinos para cascatear mais desses chips, e um chip específico pode ser um mestre ou um escravo.
Com essas idéias em mente, vamos ver os detalhes do chip.
Int (Interrupt) Esta saída vai diretamente para a entrada de interrupção do processador e faz com que o processador
envie de volta o INTA como uma confirmação, para o 8259.
Interrupt Request Register (IRR) e In-Service Register (ISR) As interrupções nas linhas de entrada IR são tratadas
por dois registradores em cascata, o Interrupt Request Register (IRR) e o In Service Register (ISR). A TIR é usada
para armazenar todos os níveis de interrupção que estão solicitando serviço; e o ISR é usado para armazenar os
níveis de interrupção que estão sendo atendidos.
Priority Resolver Este bloco lógico determina as prioridades dos bits definidos no IRR. A prioridade mais alta é
selecionada e estroboscópica no bit correspondente do ISR (no registro de serviço) durante o pulso INTA.
Interrupt Mask Register (IMR) O IMR armazena os bits que mascaram as linhas de interrupção a serem mascaradas.
A TMI opera na TIR. O mascaramento de uma entrada de prioridade mais alta não afetará as linhas de solicitação de
interrupção de prioridade mais baixa.
Machine Translated by Google
VCC GND
D0–D7
RD
WR
CS Interromper entradas
A0 8259 IR0–IR7
INT
ENQUANTO
Interface em cascata
CAS0–CAS2
SP / EN
ENQUANTO INT
Barramento de dados
D1–D0 Lógica de Controle
Amortecedor
RD
WR Ler/ IR0
Escreva IR1
IR2
A0 Lógica Interromper
Em serviço Prioridade
IR3
Solicitar
Resolver IR4
Registro (ISR) Reg (IRR)
IR5
CS IR6
IR7
CAS 0
Cascata
CAS 1 Amortecedor
Comparador
Registro de Máscara de Interrupção (IMR)
CAS 2
SP / EN
Barramento interno
CAS0–CAS2 Estas três linhas bidirecionais podem ser usadas para cascatear vários desses chips para
expandir o número de interrupções até 64, em modo mestre ou escravo. Os três pinos de E/S associados
(CAS0-2) são saídas quando o 8259A é usado como mestre e são entradas quando o 8259A é usado como
escravo.
SP / EN Significa Slave Program/Enable Buffer. Este também é um pino bidirecional. No modo de buffer, pode
ser usado para controlar transceptores de buffer (EN ). Nos demais modos, indica se o 8259 é mestre (SP =
1), ou se é escravo (SP = 0).
LÓGICA R/W Assim como em qualquer outro chip periférico, a lógica de decodificação no CS e A0 determina
os endereços dos registradores dentro do chip, e em conjunto com os sinais RD e WR , os registradores
podem ser escritos e leia de (para obter informações de status).
O 8259 foi projetado para fazer interface com os processadores 8080, 8085, bem como com a família x86 de
microprocessadores. A seqüência de processamento de interrupção do 8080 e 8085 é diferente daquela dos
processadores x86. Aqui, discutiremos apenas a sequência para os processadores x86.
Vamos listar a sequência de operações que ocorrem quando um periférico faz uma solicitação de
interrupção em um sistema x86–8259. (Consulte a Figura 10.24.)
1. Uma ou mais linhas de solicitação de interrupção (IR0 a IR7) são elevadas. As 8 linhas de solicitação de
interrupção individuais passam primeiro pelo Interrupt Mask Register (IMR) para ver se foram mascaradas
ou não. Se eles estiverem mascarados, a solicitação não será processada mais. No entanto, se eles não
estiverem mascarados, eles registrarão sua solicitação com o Interrupt Request Register (IRR) configurando
o(s) bit(s) de IRR correspondente.
2. O Registro de Pedidos de Interrupção manterá todos os IRs solicitados até que sejam tratados
adequadamente. O Priority Resolver simplesmente seleciona o IR de maior prioridade.
3. O 8259 então envia um sinal INTR para a CPU.
4. A CPU reconhece o sinal INTR e responde com um pulso INTA .
E0
E1
E2
EU
EU
P
EU
E3
S R M
R
R R R E4
E5
E6
E7
: em serviço ISR
Registro
5. Ao receber a confirmação de interrupção do processador, o IR (Interrupt Request) que o PIC está processando
no momento, é armazenado no In Service Register (ISR) que, como o nome sugere, mostra qual IR está
atualmente em serviço. Este bit IR também é redefinido no Interrupt Request Register (IRR), pois não está mais
solicitando serviço, mas na verdade está recebendo serviço.
O 8259 não aciona o barramento de dados durante este ciclo.
6. O 8086 iniciará um segundo pulso INTA . Durante este pulso, o 8259 libera um ponteiro de 8 bits (número do tipo)
no barramento de dados onde é lido pela CPU e a rotina de serviço de interrupção do dispositivo selecionado é
executada.
8. Uma vez que o ISR tenha feito tudo o que precisa, ele envia um End of Interrupt (EOI) para o PIC,
que redefine o registro em serviço.
i) Palavras de Comando de Inicialização (ICWs) que são necessárias para iniciar a operação. Esses
são uma sequência de 4 bytes, alguns dos quais são opcionais.
ii) Palavras de Controle Operacional (OCWs) são as palavras que comandam o 8259 para operar em vários modos
de interrupção.
CS A0 ICW
0 0 ICW1
0 1 ICW2
ICW3
ICW4
Machine Translated by Google
ICW1
ICW2
SIM (SNGL = 0)
ICW3
SIM (IC4-1)
ICW4
ICW1
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 ÚLTIMO 0 SNG IC4
1 = ICW4 necessário 0
= nenhum ICW4 necessário
1=único
0 = modo cascata
1=nível de trigonometria.
entrada 0=trig de borda. entrada
ICW2
D7 D6 D5 D4 D3 D2 D1 D0
T7 T6 T5 T4 T3 T2 T1 T0
D7 D6 D5 D4 D3 D2 D1 D0
IR7 T7 T6 T5 T4 T3 1 1 1
IR6 T7 T6 T5 T4 T3 1 1 0
IR5 T7 T6 T5 T4 T3 1 0 1
IR4 T7 T6 T5 T4 T3 1 0 0
IR3 T7 T6 T5 T4 T3 0 1 1
IR2 T7 T6 T5 T4 T3 0 1 0
IR1 T7 T6 T5 T4 T3 0 0 1
IR0 T7 T6 T5 T4 T3 0 0 0
Exemplo 10.18
Projete a palavra de controle de inicialização 2 (ICW2) para um sistema para associar os números de tipo 78H
em diante para as entradas de interrupção IR0 a IR7.
Solução
O método é que ICW2 deve receber o valor correspondente ao número do tipo de IR0.
Aqui, para que isso seja feito, o ICW2 deve ser projetado com D7 a D3 para ser 01111.
Assim, o ICW2 pode ser
01111000
ou seja, 78H
Isso atribuirá o número do tipo 78H a IR0, 79H a IR1 e assim por diante. A idéia é que o número
do tipo atribuído a IR0 deve ter D2 a D0 para ser 000. Não pode ser atribuído um tipo, digamos
76H porque D2 a D0 são 110.
Exemplo 10.19
Suponha que a decodificação de endereço seja feita de tal forma que quando o ICW1 for usado, o endereço da
porta seja C0H e para os outros ICWs, o endereço seja C2H.
Escreva a instrução de inicialização para configurar o sistema com as seguintes especificações:
i) O sistema possui um único 8259, com entradas de interrupção acionadas por borda e tipo de interrupção
números de 90H, 91H e 92H para IR0 a IR2. ii)
Também deve operar em modo de buffer escravo com EOI normal.
Solução
Primeiro, os ICWs devem ser projetados. Ele é projetado com D0 = 1, ou seja, é necessário ICW4, para
poder usar o segundo conjunto de especificações (ou seja, modo de buffer escravo com EOI normal)
ICW1 é o seguinte: (Ref Fig 10.26)
Machine Translated by Google
D7 D6 D5 D4 D3 D2 D1 D0
0001 0 0 1 1
ou seja, 13H
ICW2 é projetado com D7 a D3 para ser 10010 para especificar os números do tipo de interrupção.
D7 D6 D5 D4 D3 D2 D1 D0
1001 0 000
ou seja, 90H
Como o sistema possui apenas um único 8259, a palavra de controle ICW3 não é necessária. ICW4
D7 D6 D5 D4 D3 D2 D1 D0
00001001
ou seja, 09
O endereço da porta para enviar ICW1 é C0H e para os demais ICWs é C2H.
Programa
MOV AL, 13H ;valor de ICW1
SAÍDA 0C0H, AL ;envia para a porta C0H
MOV AL, 90H ;valor de ICW2
SAÍDA 0C2H, AL ;envia para a porta C2H
MOV AL, 09 ;valor de ICW4
SAÍDA 0C2H, AL ;envia para a porta C2H
CS A0 OCW
0 0 OCW2
0 1 OCW3
OCW1
Machine Translated by Google
D7 D6 D5 D4 D3 D2 D1 D0
S7 S6 S5 S4 S3 S2 S1 S0
D7 D6 D5 D4 D3 D2 D1 D0
ID ESCRAVO 1
01234567
01010101
00110011
00001111
ICW4
D7 D6 D5 D4 D3 D2 D1 D0
1 = para x86
status da máscara, OCW1 pode ser lido. Por exemplo, para mascarar os pedidos de interrupção em IR0, IR3 e IR7,
OCW1 deve ter o valor.
D7 D6 D5 D4 D3 D2 D1 D0
100 01001
ou seja, 89H
Exemplo 10.20
Escreva instruções para ler o status atual do IMR. Depois disso, altere a estrutura de mascaramento de forma que
apenas IR0 seja mascarado.
Solução
Modo Totalmente Aninhado Este modo é inserido após a inicialização até que outro modo seja programado. As
solicitações de interrupção são ordenadas em prioridade de 0 a 7 (0 mais alto). Quando uma interrupção é reconhecida,
a solicitação de maior prioridade é determinada e seu vetor colocado no barramento. Além disso, um bit do registro em
serviço é definido. Este bit permanece definido até que o microprocessador emita um End of Interrupt (EOI). Quando
uma interrupção está sendo atendida, todas as interrupções de prioridade mais baixa são inibidas, mas as interrupções
de prioridade mais alta podem ser reconhecidas, desde que o IF seja reativado usando o software.
Após a sequência de inicialização, IR0 tem a prioridade mais alta e IR7 a mais baixa. Assim, se as solicitações IR3
e IR4 ocorrerem simultaneamente, o IR3 será atendido primeiro. No entanto, IR3 pode ser interrompido por uma
solicitação em IR2, desde que o sinalizador de interrupção tenha sido habilitado por software (IF = 1).
Modo de Rotação Automática Este modo é útil quando uma distribuição de serviço justa e equitativa se destina a ser
atribuída a dispositivos que podem ser considerados de igual importância e, portanto, de igual prioridade. A idéia é que,
uma vez atendida uma interrupção de um dispositivo, ela vá para o status de menor prioridade, até que todas as outras
requisições sejam atendidas.
Modo de Rotação Específico Este modo tem semelhanças com o modo anterior, pois aquele que foi atendido
passará para o status de prioridade mais baixa. A diferença é que as prioridades podem ser
Machine Translated by Google
OCW 1
D7 D6 D5 D4 D3 D2 D1 D0
M7 M6 M5 M4 M3 M2 M1 M0
Máscara de interrupção
1=Conjunto de Máscaras
0=Redefinir Máscara
OCW 2
D7 D6 D5 D4 D3 D2 D1 D0
R SL EOI 0 0 L2 L1 L0
OCW 3
D7 D6 D5 D4 D3 D2 D1 D0
0 ESMM SMM 0 1 P RR ARROZ
00 1 1 Nenhuma ação
LER LER
Registro de IR IS reg
Nenhuma ação Redefinir Definir
Especial Especial
mascarar mascarar 1= Comando de Enquete
0 = Nenhum comando de sondagem
feito para seguir uma sequência específica. O programador pode mudar as prioridades programando a
prioridade mais baixa e assim fixando todas as outras prioridades, ou seja, se IR3 for programado como o
dispositivo de prioridade mais baixa, então IR4 terá o dispositivo de prioridade mais alta conectado a ele. As
prioridades agora são IR4, 5, 6, 7, 0, 1, 2, 3… nessa ordem decrescente de níveis.
Na Fig 10.29, D2 a D0 são usados para atribuir novos esquemas de prioridade – se a prioridade mais
alta for IR4, D2–D0 deve ser 100. D4 a D3 deve ser sempre 0 para OCW2. D7 a D5 podem ter valores de
acordo com as opções necessárias.
Exemplo 10.21
Encontre o valor de OCW2 para as seguintes opções:
i) Nível de prioridade inferior
IR5. ii) Comando EOI específico com prioridade rotativa.
Solução
A palavra é
D7 D6 D5 D4 D3 D2 D1 D0
111 0 0 101
ou seja, E4H
Comando EOI Este é o comando 'fim da interrupção'. Ao final de qualquer ISR, este comando deve estar
presente, de modo que o bit correspondente a esse nível de solicitação de interrupção no In-Service
Register (ISR) seja redefinido. Para esclarecer este ponto, lembre-se de que quando uma interrupção na
linha IR2, digamos, é atendida, um bit no registro em serviço é definido para indicar o status de 'interrupção
de manutenção' dessa solicitação. Uma vez terminado e feito, o bit deve ser redefinido e isso é feito apenas
ao receber um comando EOI. Se isso não for feito, novas solicitações de interrupção não podem ser
colocadas nesta linha.
Exemplo 10.22
Escreva um programa para ler o conteúdo dos seguintes registradores do 8259.
e) IMR
ii) TIR
iii) RSI.
Suponha que a inicialização tenha sido feita anteriormente.
Machine Translated by Google
Solução
Nota O 8259 é um chip complexo e para mais detalhes, a folha de dados do chip deve ser consultada.
Barramento de Controle
EM EQ
Vcc
GND GND
76
Solicitações de interrupção
quais os 8259 estão ligados. Os dispositivos conectados às linhas IRQ são mostrados abaixo.
Isso é padrão para o PC–AT.
Mestre 8259
• IRQ0 – Intel 8253 ou Intel 8254 Programmable Interval Timer, ou seja, o timer do sistema
• IRQ1 – controlador de teclado Intel 8042 • IRQ2 – não atribuído no PC/XT; em cascata
para escravo 8259 linha INT em PC/AT • IRQ3 – 8250 UART porta serial COM2 e COM4
• IRQ4 – 8250 UART porta serial COM1 e COM3 • IRQ5 – controlador de disco rígido em
PC/XT; Intel 8255 porta paralela LPT2 no PC / AT • IRQ6 – controlador de disquete Intel
82072A • IRQ7 – Intel 8255 porta paralela LPT1 / interrupção espúria
Machine Translated by Google
IR0 IRQ 0
IR1 IRQ 1
IR2 IRQ 2
DENTRO INT
8 IR3 IRQ 3
2
5
IR4 IRQ 4
9 IR5 IRQ 5
ENQUANTO ENQUANTO
IR6 IRQ 6
IR7 IRQ 7
INT
IR0 IRQ 8
IR1
ENQUANTO
IR2 IRQ 10
8
2 IR3 IRQ 11
5 IR4 IRQ 12
9
IR5 IRQ 13
IR6 IRQ 14
Inicialmente, o IRQ7 era uma escolha comum para o uso de uma placa de som, mas posteriormente o IRQ5 foi
usado quando se descobriu que o IRQ7 interferiria na porta da impressora (LPT1). As portas seriais são
frequentemente desabilitadas para liberar uma linha IRQ para outro dispositivo.
| Os chips de temporizador de intervalo programável 8253 e 8254 são semelhantes na maioria dos aspectos, exceto que o
este último pode ser usado em frequências de operação mais altas.
| O chip do temporizador possui três contadores internos, cada um com uma entrada de clock, uma porta e um pino de saída.
| A contagem em qualquer registro de contagem pode ser lida 'on the fly' travando-a em uma trava.
| Existem seis modos de operação para o temporizador e escrever palavras adequadas nos registros de controle
habilitará qualquer um desses modos.
| O 8279 é um chip de interface de exibição de teclado que faz a digitalização automática do teclado, bem como
atualizando dígitos em uma exibição dinâmica.
| O 8279 tem um display RAM no qual um código de sete segmentos pode ser escrito para exibir um
personagem.
| O 8279 também possui uma RAM FIFO que armazena os códigos das teclas correspondentes às teclas pressionadas.
| Este chip foi projetado para lidar com todos os problemas relacionados a interrupções de hardware que chegam ao pino INTR
do 8086.
| Ele possui vários registradores internos para lidar com solicitações de interrupção, máscaras de interrupção e assim por diante.
| No PC atual, dois PICs são usados para lidar com interrupções de hardware padrão.
PERGUNTAS
3. O que significa ler uma contagem 'on the fly' e como isso é feito?
5. Qual é o número máximo de BCD que pode ser usado como contagem?
6. Quais são as ações executadas pelo 8279 para interfaceá-lo com um display dinâmico?
7. Quais são as ações executadas pelo 8279 para permitir que ele seja conectado a um teclado?
11. Explique resumidamente como o 8259 canaliza uma solicitação de interrupção de um periférico para o 8086.
Machine Translated by Google
12. Discuta os papéis dos seguintes registradores no tratamento de várias solicitações de interrupção:
a) TIR
b) IMR
c) ISR
13. Como um vetor de tipo é instalado para uma determinada solicitação de interrupção?
15. Cite dois recursos que podem ser configurados usando palavras de comando operacional.
EXERCÍCIO
1. Usando o chip 8253, gere ondas quadradas de frequências 1 KHz, 12 KHz e 500 Hz assumindo
que a frequência de entrada é de 2 MHz.
3. Escreva um programa com uma contagem de 8888H carregado no registrador de contagem 2 e desenhe a forma de onda de saída
para a forma de onda, no Modo 1. Que condição adicional é necessária para facilitar o funcionamento deste modo?
4. Use um chip temporizador 8254 com clock de 10 MHz e programe-o para operar no Modo 2, com três valores diferentes de N.
Desenhe as formas de onda de saída correspondentes.
6. Referindo-se à Figura 10.14, escreva um programa para obter uma exibição rolante.
7. Conecte um teclado ao 8279 como na Fig 10.17, escreva um programa que permita pressionar uma tecla e exiba a tecla
correspondente. Agora modifique-o de forma que quando 1 for pressionado, 6 seja exibido, quando 2 for pressionado, 7 seja
exibido e da mesma forma para todas as teclas.
8. Para um PIC 8259, projete um ICW para corrigir números de tipo de interrupção de sua escolha para a interrupção
solicitações de.
9. Desenhe um circuito de decodificação para um 8259 e escreva o ICW correspondente para fazer com que todas as solicitações de
interrupção sejam acionadas por nível.
periférico
1 1 interface–iii
em ambas as direções (por exemplo, do computador para a impressora ou do mouse para o computador).
Uma conexão half-duplex (às vezes chamada de conexão alternada ou semi-duplex) é uma conexão na qual os
dados fluem em uma direção ou outra, mas não nas duas ao mesmo tempo. De cada vez, a transmissão é feita
apenas em uma direção e, portanto, toda a largura de banda da linha pode ser usada para a transmissão (como
quando se fala em um rádio).
Uma conexão full-duplex é uma conexão na qual os dados fluem em ambas as direções simultaneamente.
Cada extremidade da linha pode transmitir e receber ao mesmo tempo, o que significa que a largura de banda é
dividida por dois para cada direção de transmissão de dados se o mesmo meio de transmissão for usado para ambas
as direções. Falar por uma linha telefônica é um caso típico de transmissão full duplex. A porta serial do PC é um
dispositivo full-duplex, o que significa que pode enviar e receber dados ao mesmo tempo. Para poder fazer isso, ele
usa linhas separadas para transmitir e receber dados.
ele envia um bit inicial para a linha ociosa que está no estado 'marca' ou '1'. O bit inicial é um caractere 'espaço', ou
seja, um bit '0'. Isso indica que o que se segue é o byte de dados real. Observe que o LSB é enviado primeiro.
Depois que todos os oito bits são enviados, um ou dois bits de parada são enviados. O tipo e e
Machine Translated by Google
Enviado
Primeiro Enviado
D7
D0 Último
Pedaço
Tempo
Quadro de Personagem
e o número de bits de parada devem ser definidos para o sistema. O quadro de caracteres total inclui os dados
e os bits de início e fim e os bits de paridade para verificação e correção de erros. Um bit time pode ser
definido como o tempo dado para a transmissão de um bit, e o receptor amostra o nível de tensão recebido
em intervalos periódicos conhecidos como bit time, para determinar se um bit 0 ou 1 está presente. na linha.
Observe a Figura 11.1. Observe que um caractere pode ter 8 bits ou menos. Um bit de paridade pode ser
usado para controle de erros. O bit de paridade em cada caractere pode ser definido como nenhum (N), ímpar
(O) ou par (E). No entanto, a prática agora é não ter bit de paridade, mas ter algum outro protocolo de controle
de erro de comunicação a ser usado. Os dados enviados por esse método são considerados enquadrados.
Ou seja, os dados são enquadrados entre os bits Start e Stop. Na transmissão, o bit de início é enviado
primeiro, depois os bits de dados com LSB primeiro, seguidos pelos bits de paridade e de parada.
11.2.4 | Modems
A necessidade de comunicação entre computadores distantes levou ao uso da rede telefônica existente para
transmissão de dados. A maioria das linhas telefônicas foi projetada para transmitir informações analógicas –
voz, enquanto os computadores e seus dispositivos funcionam de forma digital – por meio de pulsos. Assim,
para utilizar um meio analógico, é necessário um conversor entre os dois sistemas. Este conversor é o
modem, que realiza a Modulação e Demodulação dos dados. Ele aceita pulsos binários seriais de um
dispositivo e modula alguma propriedade (amplitude, frequência ou fase) de um sinal analógico, a fim de
enviar o sinal em um meio analógico. Ele também realiza o processo oposto, permitindo que as informações
analógicas cheguem como pulsos digitais ao computador ou dispositivo do outro lado da conexão.
Machine Translated by Google
Modems sem fio convertem dados digitais em sinais de rádio e vice-versa. Os primeiros modems usavam
chaveamento de mudança de frequência em que uma frequência era usada para '1' digital e outra frequência para '0'. Para
criar modems mais rápidos, os projetistas de modems tiveram que usar técnicas muito mais sofisticadas do que a
codificação por mudança de frequência. Primeiro, eles mudaram para a chaveamento de mudança de fase (PSK) e, em
seguida, para a modulação de amplitude de quadratura (QAM).
A principal diferença entre os dois é que uma mudança de estado do sinal de comunicação pode transmitir um bit –
ou mais ou menos de um bit e isso depende da técnica de modulação utilizada. Portanto, o bit bate (bps) e a taxa de
transmissão (baud por segundo) têm esta conexão:
O número de bits por baud é determinado pela técnica de modulação. Veja estes exemplos.
Quando o FSK ('Frequency Shift Keying', uma técnica de transmissão) é usado, cada baud transmite um bit; apenas uma
mudança de estado é necessária para enviar um bit. Assim, a taxa de bps do modem é igual à taxa de transmissão.
Quando usamos uma taxa de transmissão de 2400 e usamos uma técnica de modulação chamada chaveamento de
mudança de fase em quadratura (QPSK) que transmite quatro bits por baud, obtemos o resultado de 2400 baud/segundo ×
4 bits por baud = 9600 bps. Esses modems são capazes de operar em 9600 bps.
Porém, este problema não ocorre normalmente, pois não enviamos ou recebemos em níveis TTL, ao invés disso
utilizamos um padrão chamado RS-232C, que define um conjunto diferente de tensões/correntes. RS-232 significa
Recomendação Padrão número 232 e C é a última revisão do
Machine Translated by Google
o padrão. Por este padrão, antes de serem transmitidos, os níveis de tensão TTL são alterados para um
nível entre -3 a -25 V para um '1' e +3 a +25 V para um '0' (as tensões entre -3 V e +3 V é indefinido). Isso
significa que antes de enviar, os bits devem ser alterados para este nível e reconvertidos para níveis TTL
no recebimento. Existem alguns chips padrão disponíveis para fazer isso.
RS-232 RS-232
S EU
S EU
N 1488 1489 N
E E
T 2 2 T
R R
E E
EU
R
EU
CPU R CPU
UMA
F 1489 1488
UMA
F
3 3
eu eu
UMA
UMA
C C
E
7 7
E
Chão Chão
Cabo RS-232
C1+1 16 VCC
vs + 2 15 GND
C1– 3 14 T1OUT
C2+ 4 13 R1IN
C2– 12 R1OUT
Vs - 56 11 T1IN
T2OUT 7 10 T2IN
R2IN 8 9 R2OUT
16 1mF
C3+
Vcc
1 2
+
1mF 3
C1
4 6
+
C2 1mF 5
1mF
C4
+
11 14
Saída RS-232
De CMOS ou TTL 10 7
Saída RS-232
12 13
Entrada RS-232
15
Figura 11.4 | Diagrama de pinos do chip MAX 232 e uma conexão típica
1 23 4 5 6 7 8 9 10 11 12 13 12 3 4 5
14 15 16 17 18 19 20 21 22 23 24 25 67 89
(uma) (b)
Figura 11.5 | Conectores RS-232 um conector macho DB-25 b Conector macho DB-9
O padrão RS-232 afirma que os dispositivos DTE usam um conector macho de 25 pinos e os dispositivos DCE usam um
conector fêmea de 25 pinos. É possível, portanto, conectar um dispositivo DTE a um DCE usando uma conexão direta
pino a pino como na Fig 11.6.
No entanto, para conectar dois dispositivos semelhantes, digamos um DTE com outro dispositivo DTE, como dois
PCs, um cabo de modem nulo deve ser usado. O que é um modem nulo? Consulte a Figura 11.7. Cabos de modem nulos
Machine Translated by Google
25 Não atribuído
2 Dados recebidos (R × D)
3 Dados transmitidos (T × D)
DTE DCE
DCD
DSR
DTR
RTS
CTS
DT RD
RD DT
2 2
DT 3 3 DT
RD 4 4 RD
RTS 5 5 RTS
CTS CTS
20 20
DTR 6 6 DTR
DSR DSR
7 7
GND GND
DTE DTE
DTE DCE
DT
2 2 2 2
RD DT DT
3 3 3 3
RD RD
7 7
Chão 7 7
GND GND
DTE DTE
(uma) (b)
Figura 11.8a | Conexão DTE–DCE usando 3 pinos b Conexão DTE–DTE com um modem nulo
cruzar as linhas de transmissão e recepção no cabo, de modo que o pino de transmissão de um seja
conectado ao pino de recepção do outro e assim por diante. Além de transmitir e receber, os sinais DTR e
DSR, bem como RTS e CTS também são cruzados em uma conexão de modem nulo.
Podemos dizer que a comunicação serial usando padrões RS-232 é possível usando 25 pinos, 9
pinos e também apenas três pinos (Ver Fig 11.8). No último caso, a transmissão e recepção são feitas sem
handshake adicional. T × D é a linha para dados transmitidos e R × D para dados recebidos.
DTR (Data Terminal Ready) Quando o terminal DTE é ligado, após seu autoteste, ele envia o DTR
indicando a robustez da porta COM e sua prontidão para comunicações.
DSR (Data Set Ready) Quando o terminal DCE é ligado, ele envia o sinal DSR após seu autoteste. Nesse
caso, o modem envia este sinal para a porta Com do PC, o que também indica que ele fez uma conexão
com a rede (telefone ou rede sem fio). Juntos, DTR e DSR são usados para confi rmar que ambos os
dispositivos estão conectados e ligados.
Machine Translated by Google
RTS (Request to Send) Agora que ambos os equipamentos estão prontos, a transmissão de dados pode ocorrer.
Caso o DTE tenha um byte para enviar, ele afirma o sinal RTS, que é recebido pelo equipamento DCE (modem
neste caso).
CTS (Clear to Send) O equipamento receptor (o modem neste caso) responde ao sinal RTS por este sinal. O
CTS informa ao equipamento de transmissão que o espaço de buffer está disponível para os dados de entrada.
Juntos RTS e CTS são usados para controle de fluxo de hardware, ele regula o fluxo de dados. Se não houver
espaço de buffer disponível no lado do receptor, a transmissão deve esperar até que o buffer seja limpo.
DCD (Data Carrier Detect) É enviado pelo modem para indicar que uma portadora válida foi detectada.
RI (Indicador de Toque) Esta é uma saída do modem que o telefone está tocando. O modem alterna (liga e
desliga) o estado desta linha quando uma chamada recebida toca o telefone. As linhas Data Carrier Detect (DCD)
e Ring Indicator (RI) estão disponíveis apenas em conexões a um modem. Como a maioria dos modems transmite
informações de status para um PC quando um sinal de portadora é detectado (ou seja, quando uma conexão é
feita com outro modem) ou quando a linha está tocando, essas duas linhas raramente são usadas. O sinal RI não
é mostrado na Fig 11.6.
D2 1 28 D1
D3 2 27 D0
R×D 3 26 VCC
GND 4 25 R×C
D4 5 24 DTR
D5 6 23 RTS
D6 7 22 DSR
8251
D7 8 21 REDEFINIR
T×C 9 20 CLK
WR 10 19 T×D
CS 11 18 T×E
CD 12 17 CTS
RD 13 16 O PECADO/BD
R×RDY 14 15 T×RDY
bloco aceita dados paralelos do buffer de barramento de dados, converte-os em um fluxo de bits serial,
insere os bits extras apropriados (com base na técnica de comunicação) e emite um fluxo serial composto
de dados no T × D ( Transmitter Data) na borda descendente de T × C.
Na reinicialização, a linha T × D será mantida no estado de marca (que corresponde a um estado inativo).
Ele iniciará a transmissão ao ser habilitado se CTS = 0. Quando o transmissor estiver vazio, ou se CTS ou
T × Habilitar estiver DESLIGADO, a linha irá novamente para o estado inativo de 'marca'.
T × RDY (Transmitter Ready) Este é um sinal de saída informando que o transmissor está pronto para
aceitar um caractere de dados a ser enviado. Isso pode ser usado para interromper o processador, ou o
processador pode verificar seu estado lendo o registrador de status, no modo de operação polled.
Machine Translated by Google
Dados
Transmissão
D7–D0 Ônibus T×D
Amortecedor
Amortecedor
(P–S)
REDEFINIR
T×RDY
CLK
Ler escrever
Transmite
CD Ao controle T×Vazio
Ao controle
RD
Lógica
T×C
WR
CS
DSR
Modem Receber
DTR R×D
Ao controle Amortecedor
CTS
(S–P)
RTS
interno
R×RDY
Barramento de dados
Receber
R×C
Ao controle
O pecado
T × Empty (Transmitter Empty) Quando o 8251 não tiver caracteres para enviar, este pino de saída ficará alto. É
apagado ao receber um caractere do processador. Ele pode ser usado para indicar o fim de uma transmissão,
para que a seguir, a CPU possa virar para recepção (no caso do modo half duplex, digamos).
T × C (Relógio do Transmissor) Este é o pino de entrada do relógio do transmissor, que controla a taxa de
transmissão. No modo de transmissão síncrona, a taxa de transmissão é igual à frequência T × C. No modo de
transmissão assíncrona, a taxa de transmissão é uma fração dessa frequência.
Isso é selecionado pela palavra de controle de modo. A borda descendente do relógio T × C desloca os dados
seriais do 8251.
R × RDY (Receptor Pronto) Este sinal de saída indica que o 8251 contém um caractere que está pronto para ser
inserido na CPU. R × RDY pode ser conectado à estrutura de interrupção da CPU.
Se o polling estiver sendo usado, a CPU pode verificar o status deste pino usando uma operação de leitura de status.
R × C (Receiver Clock) Este pino de entrada controla a taxa na qual a recepção é feita. No modo síncrono, a taxa de
transmissão é igual à frequência real de R × C. No modo assíncrono, a taxa de transmissão é uma fração dessa
frequência. Os dados são amostrados na borda ascendente do sinal R × C.
Nota Na maioria dos casos, o 8251 estará lidando com a transmissão e recepção do mesmo link. Portanto, as taxas de
transmissão serão as mesmas e, portanto, R × C e T × C podem ser vinculados a uma única fonte de frequência.
Syndet / Brkdet (Sync detect ou Break Detect) Este é um pino bidirecional, e é usado no modo síncrono como
SYNCH DETECT. É usado como entrada ou saída, programável usando a palavra de controle. No modo assíncrono, é
usado como pino de saída como 'BREAK DETECT'. Ele ficará alto para indicar uma 'interrupção' ou 'desconexão'. Ele
vai alto sempre que o receptor permanece baixo através de duas seqüências consecutivas de bits de parada (incluindo
bits de início, bits de dados e bits de paridade). A detecção de quebra também pode ser lida como um bit de status.
C/D (Control/Data) Este é um sinal de entrada que, em conjunto com o CS , pode ser usado para seleção do registro
de dados ou registro de controle/status.
CS C/ D Cadastro selecionado
0 0 Registro de dados
serial em geral.
DSR (Data Set Ready) O sinal de entrada DSR é uma porta de entrada de um bit de uso geral. Sua condição pode ser
testada pela CPU usando uma operação de leitura de status. A entrada DSR geralmente é usada para testar as
condições do modem, como Data Set Ready.
Machine Translated by Google
DTR (Data Terminal Ready) O sinal de saída DTR é uma porta de saída de um bit de uso geral. Ele pode ser definido como
baixo programando o bit apropriado na palavra de instrução de comando.
O sinal de saída DTR é normalmente usado para controle de modem.
RTS (Request to Send) Este sinal de saída é uma porta de saída de um bit de uso geral. Ele pode ser definido como baixo
programando o bit apropriado na instrução Command. O sinal de saída RTS é normalmente usado para controle de modem.
CTS (Clear to Send) Um valor baixo nesta entrada permite que o 8251 transmita dados seriais se o bit T × Enable no byte de
comando estiver definido como 'um'. Se ocorrer um T × Enable OFF ou CTS OFF enquanto o transmissor estiver em operação,
o transmissor transmitirá todos os dados no USART escritos antes do comando Transmitter Disable, antes de desligar.
No caso de recepção, o 8251 recebe um caractere de um modem ou dispositivo de E/S serial e então eleva o pino de
saída R × RDY para comunicar isso à CPU. A CPU então lê os dados recebidos e o pino R × RDY é reiniciado. T × C e R × C
estão conectados à mesma fonte de clock. Os pinos T × RDY e R × RDY podem ser usados no modo de interrupção ou no
modo de verificação de status (polling) para que a transmissão e a recepção ocorram conforme descrito acima. T × D é o pino
no qual os dados seriais são transmitidos e R × D é o pino no qual os dados seriais são recebidos.
Logo após o reset, a palavra de modo deve ser enviada ao chip. Qualquer palavra que venha após a palavra de modo é
considerada a palavra de comando, e as palavras de comando podem ser escritas a qualquer momento durante a operação do
8251. Para alterar o modo, podemos escrever uma nova palavra de modo, mas isso só pode ser feito após um reset interno ou
externo. Um reset interno pode ser iniciado configurando o bit 'reset' na palavra de comando (bit D6 ).
O USART, como o nome indica, pode ser usado para comunicações síncronas e assíncronas. O formato de comunicação
é diferente para os dois casos e devem ser considerados separadamente. Estamos interessados apenas no modo assíncrono,
e somente isso será discutido aqui. A folha de dados do chip pode ser consultada para detalhes do modo síncrono.
D7 D6 D5 D4 D3 D2 D1 D0
S2 S1 PE PEN L2 L1 B2 B1
0 1 0 1
0 0 1 1
Sincronizar
Modo (1×1) (16×1) (64×1)
Comprimento do caractere
0 1 0 1
0 0 1 1
5 6 7 8
Bits Bits Bits Bits
Ativar Paridade
1=Ativar 0=Desativar
Verificação de geração de paridade par
1=Par 0=Ímpar
0 1 0 1
0 0 1 1
2/11
1 bit inválido 2 bits
bits
Gerado
Saída do transmissor
Começar
Bits de dados Paridade Pare
Pedaço Pedaço
Bits
Marcação T×D
Entrada do Receptor
Começar Paridade
R×D Bits de dados Pare
Pedaço
Pedaço Bits
Programado
Comprimento do caractere
Formato de transmissão
Byte de CPU
Caractere de dados
Formato de recebimento
Byte de CPU
Caractere de dados
Exemplo 11.1
Escreva a palavra de controle de modo para um caso de transmissão assíncrona, com dados de 8 bits para mat,
um bit de parada, paridade ímpar e taxa de transmissão de aproximadamente 10.000. O clock T × C é de 150 KHz.
Solução
D7 D6 D5 D4 D3 D2 D1 D0
0 1 0 1 1 11 0
ou seja, 5EH
A fonte de clock fornece um clock de 150 KHz, o fator de taxa de transmissão é 16x ou seja, 1/16.
Portanto, a taxa de transmissão é (150 × 103 ) /16 = 10.000 = 10 K aproximadamente.
uma operação simples, temos que habilitar transmissão e recepção, fazer DTR ser 0 e RTS
ser 0 e habilitar reset de erro. Projete a palavra de comando.
Solução
A palavra de comando é
D7 D6 D5 D4 D3 D2 D1 D0
00110111
ou seja, 37 H
D7 D6 D5 D4 D3 D2 D1 D0
DSR SYNDET FE OE PE T × VAZIO R × RDY T × RDY
T ¥ RDY (Transmitter Ready) Indica que o USART está pronto para aceitar dados ou
comandos do processador ao qual está conectado.
Machine Translated by Google
D7 D6 D5 D4 D3 D2 D1 D0
Ativar transmissão
1=Ativar
0=Desativar
Ativar recebimento
1=Ativar
0=Desativar
Redefinição de erro
Solicitação de envio
'alto' forçará RTS
saída para zero
Redefinição interna
'alto' retorna 8251 para
Formato de instrução de modo
R ¥ RDY (Receiver Ready) Indica que o chip recebeu um caractere e está pronto para transferi-lo.
T ¥ Empty (Transmitter Empty) Isso significa que o buffer do transmissor está vazio. Existem três sinalizadores de
erro na palavra de status, mas sua configuração não inibe a operação do 8251.
Eles são redefinidos pela palavra de comando.
OE (Overrun Error) Este sinalizador é definido quando o processador não lê um caractere antes que o próximo fique
disponível. Caso este bit seja definido, o caractere de saturação anterior é perdido.
FE (Framing Error) É aplicável apenas para comunicação assíncrona. Este sinalizador é definido quando um bit de
parada válido não é detectado no final de cada caractere.
Machine Translated by Google
Syndet–Synch Detect Este pino é usado no modo síncrono para detecção de sincronismo e é usado no
modo assíncrono para detecção de interrupção.
DSR (Data Set Ready) Este bit indica que o DSR está no nível zero.
Modo Loop Back Primeiramente faremos a transmissão e recepção no mesmo chip – enviar um
caractere da seção transmissora da USART e recebê-lo na seção receptora da mesma. Para isso,
devem ser feitas as seguintes conexões (Ver Fig. 11.15). O registrador de dados possui um
endereço C0H e o controle/status um endereço C2H. Os relógios do transmissor e do receptor
são da mesma fonte de relógio. T × D e R × D devem ser interconectados, assim também os
pinos CTS e RTS . Em seguida, inicialize o 8251 com as palavras de modo e comando, transmita
um caractere, receba-o e salve-o na memória.
Exemplo 11.3
Escreva o programa para transmissão e recepção no modo loopback.
Solução
D7 D6 D5 D4 D3 D2 D1 D0
01 001110
ou seja, 4 EH
CTS
RTS
8
2 RXD
5 T×D
1
T×C
R×C
Relógio
Exemplo 11.4
Em seguida, conectaremos dois kits de microprocessadores serialmente e realizaremos a transmissão e recepção.
A transmissão por um kit será pelo seu cabo RS-232 e a recepção pelo outro cabo também será semelhante.
Ambos os kits são cronometrados da mesma fonte.
Solução
A sequência deve ser tal que o programa receptor seja executado primeiro. O receptor então está em um
loop esperando que um bit de início seja recebido. Em seguida, execute o programa do transmissor. Quando
o receptor detecta o bit inicial, ele inicia a recepção e salva a cadeia de caracteres recebida na memória.
PROGRAMA DO TRANSMISSOR
PROGRAMA DO RECEPTOR
iii) Cada um dos bytes transmitidos é enquadrado e enviado. No receptor, o caractere enquadrado é recebido
somente se o bit inicial for detectado. Isso é feito automaticamente pelo 8251.
iv) Após a palavra de modo e a palavra de comando serem enviadas para o registrador de controle/status,
este registrador é 'lido' para confirmar se T × RDY é alto (para transmissão) e R × RDY é alto para
recepção. Somente após isso ser assegurado, os dados para transmissão são enviados para o
registrador de dados (para transmissão), e o byte recebido é lido (no programa receptor).
v) Os caracteres a serem enviados são armazenados em um local de memória denominado TRANS no
transmissor. Na recepção, eles são salvos em um local chamado RECD no lado do receptor.
operação de sincronização e grava dois caracteres de sincronização 00 fictícios. Um comando de reset interno
pode então ser emitido para trazer o chip para o estado ocioso. A sequência de instruções a seguir deve preceder
as linhas de programa dos Exemplos 11.3 e 11.4
A porta serial do PC
Como já mencionado, o PC suporta apenas comunicação serial assíncrona. Ele usa o chip UART 8250 para
interface. Este chip é, aliás, um chip mais potente que o 8251. O 8250 foi aprimorado ao longo dos anos em que
os processadores usados em PCs se tornaram cada vez mais poderosos – agora está sendo usado o 16450,
que é uma versão mais rápida do 8250. Recentemente uma versão melhor NS16550 apareceu no mercado e
está começando a ser amplamente utilizada.
A porta serial costumava ser encontrada em quase todos os PCs, mas não mais. Assim, a partir de 2009, está
se tornando obsoleto, se não já obsoleto. É frequentemente chamada de porta 'legada', mas ainda é usada para
hardware projetado para se conectar à porta serial, especialmente para computadores usados como servidores
por empresas. Laptops e Macs deixaram de ser vendidos com portas seriais vários anos antes dos desktops. No
entanto, se alguém precisar de uma porta serial, é possível comprar uma e instalá-la, como no barramento USB,
e ela ainda é encontrada em PCs mais antigos. No entanto, como é visto agora, a porta serial, bem como a porta
paralela, estão se tornando obsoletas, por serem substituídas pela porta USB.
T4 ou T1 Ciclos DMA
CLK
AGUARDE
HLDA
Execução Execução
Estado de retenção
Suspenso Currículos
Sinal HLDA (Hold Acknowledge) para o dispositivo solicitante. HOLD tem uma prioridade mais alta do que as
interrupções INTR ou NMI. Observe também que as interrupções são reconhecidas somente após o final
do ciclo de instrução atual, mas as operações DMA iniciam após a conclusão do ciclo de barramento
atual.
Solicitação de DMA
(Dispositivo E/0)
Confirmação de DMA
(Controlador DMA)
E/0 Leitura
(Controlador DMA)
Gravação de memória
(Controlador DMA)
Endereço
Endereço de memória
(Controlador DMA)
A transferência de DMA se parece com um ciclo de leitura ou gravação de memória com o controlador DMA
fornecendo o endereço de memória e o dispositivo de E/S lendo ou gravando os dados.
A terminologia DMA determina que uma gravação DMA ocorre quando os dados são movidos de um dispositivo
de E/S para a memória ativando MEMWR e IORD simultaneamente. Uma leitura de DMA é apenas a operação
inversa quando os dados são lidos da memória e gravados na E/S. Observe que apenas o endereço de memória
pode ser colocado no barramento de endereços, enquanto o endereço de E/S deve ser implícito. Como as
transferências flyby DMA envolvem um único ciclo de memória por transferência de dados, essas transferências são
muito eficientes; no entanto, as transferências de memória para memória não são possíveis neste modo. A Figura
11.17 mostra o protocolo de sinal de transferência fl yby DMA.
Modo de Transferência Única Neste modo, um valor de dados é transferido para cada asserção de solicitação de
DMA. Este modo é o método de transferência mais lento porque requer que o controlador DMA faça a arbitragem
para o barramento do sistema em cada transferência.
Machine Translated by Google
Solicitação de DMA
(Dispositivo E/0)
E/0 Leitura
Gravação de memória
DMA
Endereço Endereço I/0 Endereço de memória
Controlador
Trava de endereço
Endereço
Barramento de endereços
C Barramento de dados
DENTRO
Ao controle
Ao controle
Ônibus
Ônibus
Retenção HLDA
Barramento de dados
HRQ
DMA
Controlador
Barramento de Controle
HLDA
Periférico
diabos
Dispositivo
OBRIGADA
Modos de Transferência de Bloco e Demanda Esses modos aumentam a taxa de transferência do sistema,
permitindo que o controlador DMA execute várias transferências DMA, uma vez que o controlador DMA obteve o
controle do barramento. Para transferências em modo de bloco, o controlador DMA executa toda a sequência
DMA conforme especificado pelo registrador de contagem de transferência na taxa mais rápida possível, em
resposta a uma única solicitação DMA do dispositivo de E/S. Para transferências em modo de demanda, o
controlador de DMA executa transferências de DMA na taxa mais rápida possível, desde que o dispositivo de E/S
confirme sua solicitação de DMA. Quando o dispositivo de E/S desativa a solicitação DMA, as transferências são sinalizadas.
Operação DMA Deve haver um controlador DMA para coordenar todas essas atividades. O controlador é um chip
periférico programável que pode ser programado para agir conforme indicado, como veremos na discussão a
seguir. Não é um 'processador' que tem capacidade de execução.
Machine Translated by Google
No entanto, pode ser feito para atuar para controlar e coordenar os requisitos de DMA do sistema. Consulte
a Figura 11.19. Inicialmente o sistema funciona como um computador normal com todos os interruptores na
posição superior. Neste estado, o processador controla os barramentos de endereço, dados e controle.
Agora, digamos, um dispositivo periférico quer o serviço DMA. Ele envia uma solicitação ao controlador DMA
no pino DREQ. O chip DMA consulta seus diversos registros internos e emite um HRQ (Hold Request) para
a CPU. Ele recebe um sinal HLDA (hold reconhece) do processador. Isso sinaliza o início das operações de
DMA, com o processador sendo desconectado do sistema.
Agora os interruptores na Fig 11.19 são alternados para a posição mais baixa, dando ao chip DMA, o controle
dos barramentos. O chip DMA transmite esta informação como um sinal DACK (reconhecimento) para o
periférico.
Após esta programação de sinalização inicial, ocorre a transferência de dados real. Após o término da
transferência completa, o controlador DMA desativa sua solicitação de espera (HRQ) e o controle retorna ao
processador, o que significa que as chaves estão de volta à posição 1.
DMAC
Registro de Status
Habilitar desabilitar
Registro de Máscara
Contagem básica
TC TC
Contagem atual
S
S
Endereço básico s
Morada atual m
dentro
O PNEU s
CPU
Vcc Vss
IOWR
HRQ
PRONTO
HLDA
REDEFINIR
CLK EOP
CS
Antes do início da operação do DMA, esses registradores de 16 bits devem conter o endereço inicial da memória e a
contagem do número de bytes a serem transferidos. Assim, esses registradores devem ser escritos e o conteúdo
desses registradores não muda durante o ciclo DMA. No entanto, o conteúdo desses registradores também é escrito
(automaticamente) em dois outros registradores chamados 'registro de endereço atual' e 'registro de contagem atual'.
O conteúdo do primeiro é incrementado após cada transferência, enquanto o conteúdo do último é decrementado.
Assim, o estado atual da operação do DMA pode ser conhecido pela leitura desses registradores. O chip DMA possui
quatro pinos A3 a A0 para selecionar esses oito registradores.
Exemplo 11.5
Encontre os endereços do endereço base e dos registradores de contagem base para os quatro canais, quando a
lógica de decodificação da Fig 11.22 for usada.
Solução
A lógica de decodificação precisa de A7 a A4 para ser 1100 ou seja, 0CH para selecionar o chip. Os outros bits para
seleção de cada registro são dados na coluna 4 da Tabela 11.3. Portanto, o endereço do registrador de endereço
base e dos registradores de contagem base para cada um dos canais é fornecido na coluna 5 da tabela.
Nota Nós 'escrevemos' no registrador de endereço base e no registrador de contagem base. Mais tarde, a qualquer
momento, os valores atuais de endereço e contagem são 'lidos' do registrador de endereço atual e do registrador de
contagem atual. Isso deve explicar a Coluna 3 da Tabela 11.3.
Machine Translated by Google
A0 A0
A1 A1
8
A2 A2 2
A3 A3 3
7
A4
A5
CS
A6
A7
Agora observe o diagrama de blocos funcional na Fig 11.21. A maioria dos pinos parece familiar, mas
as funções de alguns (AEN, ADSTB, EOP) precisam de mais explicações. Chegaremos a isso em breve.
No entanto, algumas características e algumas anomalias precisam ser observadas.
i) O registrador de contagem base tem apenas 16 bits, o que implica que apenas 64 KB de dados podem ser
transferido por uma operação DMA.
ii) O registrador de endereço base tem apenas 16 bits de tamanho – mas para um processador como o 8086, o
endereço tem 20 bits, então como os 4 bits superiores podem ser fornecidos?
Machine Translated by Google
iii) O chip DMA tem apenas um barramento de endereços de 8 bits, então como ele coloca um endereço de 20 bits no
barramento de endereços para a memória de endereços?
O primeiro ponto é uma característica do chip, mas o segundo e o terceiro são obviamente inadequações do chip que
precisam ser corrigidas. Vamos a isso.
Exemplo 11.6
Escreva no registrador base e no registrador de contagem do canal 1, dado que 4KB de dados devem ser transferidos de um
local de memória 13230H para um periférico.
Solução
O endereço do registrador de endereço base e o registrador de contagem base para o canal 1 são C2H e C3H respectivamente.
O número de bytes a serem transferidos é 4K, ou seja, 4096 bytes.
Observe que não há provisão para enviar o dígito hexadecimal superior do endereço de 20 bits 13230H para o registrador de
endereço base, pois ele pode armazenar apenas 16 bits. Vamos ver como esse problema é resolvido.
programa do Exemplo 11.6, apenas os 16 bits inferiores do endereço de 20 bits podem ser enviados para o
registrador de endereço base, o que significa que durante um ciclo DMA, quando o controlador DMA controla o
barramento do sistema, apenas a parte de 16 bits do endereço inicial do bloco de memória pode ser colocada
no barramento de endereços. Então, quem envia os 4 bits superiores para o barramento de endereços? A
resposta é que uma trava extra de quatro bits deve ser incluída no hardware do sistema. A entrada do latch deve
ser conectada para transportar os 4 bits superiores de endereço, ou deve ser enviada para o latch por meio de
instruções do programa. Assim, durante um ciclo de DMA, os 4 bits superiores do endereço são obtidos na saída deste latch.
Agora olhe para a Fig 11.21 mais uma vez. Observe que o chip DMA possui apenas 8 linhas de endereço e elas são
numeradas como A7 a A0 . Isso significa que o chip não possui linhas para colocar os oito bits superiores (A15
a A8) do endereço, durante um ciclo de DMA. Isso requer o uso de outra trava com tamanho de 8 bits.
i) Antes do início da operação DMA, o processador controla o barramento de endereços. Ele usa o barramento de endereço
para escrever palavras nos registros de controle e modo do controlador DMA para inicialização e configuração de modo
do chip. Então o sinal AEN (Address Enable) do chip DMA fica alto e depois disso, o processador é isolado do
barramento do sistema e o controlador DMA fica a cargo do barramento.
ii) Quando a operação DMA inicia, o endereço de 20 bits do endereço inicial do bloco de memória deve ser colocado no
barramento de endereços do sistema. Lembre-se que 16 bits deste endereço estão disponíveis no registro interno do
chip DMA (registro de endereço base). O chip coloca 8 bits mais baixos desse endereço em seus pinos A7 a A0.
Também coloca em suas linhas de dados (DB7 a DB0), a parte superior
Machine Translated by Google
AEN G UMA
7
4 D
A16–A19 D
3
A19
7 R
A16 3
E
VOCÊ ESTÁ
S
S
ANO-4
8
2 ADSTB G B
7
3 DENTRO
4 A8–A15
7 S
DB7 3
7
DB0
3
VOCÊ ESTÁ
ANO-8
A7 A0
A0–A7 para
A0 A19
8 bits do endereço disponível com ele. Essas linhas de dados são alimentadas na entrada de um latch
de 8 bits (veja a Fig. 11.23) que é sincronizado pelo sinal ADSTB (Estrobo de Endereço). Assim, na
saída desse latch de 8 bits, os 8 bits superiores do endereço de 16 bits estão disponíveis e podem ser
removidos das linhas de dados do chip 8237.
iii) Durante a operação de DMA, o endereço no barramento de endereços continua sendo incrementado. Os
8 bits mais baixos são incrementados de 00 a FFH e, em seguida, devem transbordar para os 8 bits
superiores, que devem ser incrementados em um, agora. Por exemplo, para um endereço inicial de 16
bits de 1200H, os 8 bits inferiores rolam de 00 a FFH e, em seguida, o endereço deve mudar para
1300H. Neste ponto, o número 13H deve ser enviado do chip DMA através de seus pinos de dados
(DB7 para DB) e isso deve ser travado no IC de trava. Neste instante, o ADSTB sobe novamente,
atuando como um relógio para esta trava. Esta é uma operação adicional durante um ciclo de DMA,
mas como ocorre apenas uma vez em 255 ciclos de DMA, não é uma grande sobrecarga.
iv) E os 4 bits superiores do endereço A19 a A16? Veja a trava de 4 bits na Fig 11.23.
Quando o AEN fica alto, esses endereços são presos ao latch, e a saída desse latch constitui os 4 bits
superiores do barramento de endereços. Como o endereço de 4 bits alcança a entrada da trava de 4
bits? Para uma aplicação específica, se esta parte do endereço for fixa, ela pode ser conectada. Ou
pode ser enviado do processador a partir de uma porta de saída e travado pelo uso de AEN durante a
operação de DMA.
O sinal EOP Quando o número programado de bytes for transferido, ou seja, quando a contagem de
terminais for atingida, o controlador DMA abaixa o EOP (Fim do processo)
Machine Translated by Google
sinal, desativa seu pino HRQ, abaixa o sinal AEN e libera o barramento do sistema, para que o processo
possa retomar sua operação normal.
Exemplo 11.7
Escreva a palavra de comando para usar o chip 8237 DMA com os seguintes requisitos: i)
transferência de memória para periférico, ii) tempo comprimido,
Solução
D7 D6 D5 D4 D3 D2 D1 D0
10 011000
O Registro de Status Este registro está disponível para leitura e contém informações sobre o status dos
canais do chip. Consulte a Figura 11.25. Essa informação inclui quais canais atingiram uma contagem de
terminais e quais canais têm solicitações DMA pendentes. Os bits 0 a 3 são
Cadastro de Máscaras 1 1 1 1 FC
Machine Translated by Google
D7 D6 D5 D4 D3 D2 D1 D0
0–Memória'-'para'-'desativar memória
1–Ativar memória'-'para'-'memória
0–Ativação do controlador
1–Desativação do controlador
0-Tempo normal
1 – Tempo comprimido
X–Se bit D0'='1
0–Prioridade fixa
1 – Prioridade rotativa
definido toda vez que uma contagem de terminal é alcançada por esse canal ou um EOP externo é aplicado.
Esses bits são apagados no reset e em cada leitura de status. Os bits 4–7 são definidos sempre que seu canal
correspondente estiver solicitando serviço.
Registro de Modo Cada canal tem um registro de modo de 8 bits associado a ele, cujo formato é mostrado na
Figura 11.26. Quando o registrador está sendo escrito, na condição de programa, os bits 0 e 1 selecionam em qual
registrador de modo do canal deve ser escrito. O restante dos bits seleciona várias opções de modo. Existem mais
alguns registradores para o chip DMA. Para mais detalhes de programação do chip, as folhas de dados do chip
podem ser consultadas.
ii) Canal 1 não utilizado, mas permitido para qualquer aplicação de E/S.
Machine Translated by Google
D7 D6 D5 D4 D3 D2 D1 D0
1–Canal 2 atingiu TC
1–Canal 3 atingiu TC
1–Solicitação de canal 0
1–Canal 1 solicitação
1–Solicitação do canal 2
1–Solicitação do canal 3
D7 D6 D5 D4 D3 D2 D1 D0
00–Canal 0 selecione
01–Canal 1 selecione
10–Canal 2 selecione
11–Canal 3 selecione
00–Verificar transferência
01–Escrever transferência
10– Ler transferência
11–Ilegal
xx–Se os bits 6 e 7 forem '11'
Lembre-se de que o 8237 possui apenas capacidade de barramento de endereço de 16 bits; portanto, para os
endereços além de 64 KB, os bits extras são fornecidos por um registrador de página, que é uma trava para manter
os bits de endereço extras.
Machine Translated by Google
| No formato de transmissão síncrona, os dados podem ter 8 bits ou menos, com/sem bits de paridade, um bit de início e
um ou mais bits de parada.
| A taxa de transmissão em comunicações seriais pode ser expressa em bauds ou bits por segundo, mas
ambos não são iguais em todos os casos.
| RS-232 é um padrão de comunicação serial em que os níveis de tensão são maiores que os níveis TTL.
| Conversores são necessários para conversão de nível TTL para RS232 e vice-versa.
| Os conectores RS-232 têm 25 pinos, mas 9 pinos são suficientes e, portanto, a maioria dos computadores está equipada
apenas com conectores DB-9.
| Existem muitos chips usados como interfaces de comunicação serial, mas o chip discutido aqui é o
USART 8251.
| O acesso direto à memória é uma atividade de alta prioridade em qualquer sistema de computador.
| Um controlador de DMA com vários canais é necessário para gerenciar solicitações de DMA de vários
periféricos.
| O chip controlador de DMA 8237 possui quatro canais e vários registradores para lidar com DMA
operações.
| O chip tem apenas a capacidade de lidar com endereços de 16 bits, portanto, é necessário um hardware extra para
processadores com larguras de endereço maiores.
| Chips DMA são usados em PCs, mas o novo barramento PCI usa um conceito diferente de masterização de barramento.
PERGUNTAS
3. O que é RS-232C?
7. Quantas linhas são necessárias para haver comunicação serial entre dois computadores?
14. Quando o DMA de memória para memória é necessário? Mencione um caso específico.
EXERCÍCIO
1. Escreva um programa para enviar uma string de caracteres entre um ponto de transmissão usando o 8251 é
a) modo loopback,
b) dois kits diferentes.
2. Escreva palavras de modo para transmissão com diferentes taxas de transmissão, diferentes configurações de paridade e
diferentes comprimentos de caracteres.
c) DSR
d) PE
4. Para o controlador DMA, projete um esquema de decodificação e obtenha um conjunto diferente de endereços para os
registradores de contagem e endereço.
semicondutor
1 2 dispositivos de memória
Introdução
Falamos sobre "memória" ao longo dos capítulos deste livro. Falamos sobre leitura e escrita de memória,
velocidade de memória, memória principal, memória secundária e memória virtual.
No entanto, ainda precisamos examinar os constituintes técnicos da memória. Este capítulo discute a tecnologia
por trás da memória. Aqui, falaremos apenas sobre a memória principal ou primária – a memória que o
processador acessa diretamente, cuja velocidade desempenha um papel importante em qualquer sistema de
computador. Esta é a memória semicondutora e uma primeira classifi cação dela é como RAM e ROM. Para
entender a hierarquia completa da memória como um sistema de memória, o conceito de 'memória virtual'
também deve ser esclarecido e isso é feito no Capítulo 15.
RAM significa 'Random Access Memory', o que implica que todos os locais endereçados são acessíveis e
o tempo de acesso é o mesmo para todos eles, mas a qualidade que a diferencia da ROM é que ela é gravável
e legível, e também é volátil – os dados que contém desaparecem quando a energia é removida. A ROM, por
outro lado, não é volátil e só pode ser lida. Os dados são armazenados permanentemente nele e assim em
PCs, BIOS e certas informações de inicialização são colocadas na ROM. Um aspecto importante da ROM é
que seu tempo de acesso é muito maior que o da RAM e, portanto, nos PCs, o BIOS armazenado na ROM é
copiado para a RAM para acesso rápido e é o que é chamado de 'shadow RAM'. Tendo dito isso sobre ROM,
vamos agora entrar no componente principal de nossa discussão – RAM.
Quando um usuário fala sobre 'memória', ele geralmente quer dizer RAM. A quantidade de RAM disponível
em um sistema tem impacto na velocidade do sistema – quanto mais, melhor é o que se acredita.
Isso ocorre porque todos os programas atualmente em execução em um sistema devem caber na RAM,
portanto, se não houver quantidade suficiente de RAM, o processador terá que fazer viagens para a memória
secundária e isso é penoso, em termos de velocidade. No entanto, o fator custo impede uma grande quantidade de RAM
para ser incluído em qualquer sistema. (Claro, há o 'cache' também que contribui para a velocidade, mas essa
é outra história que veremos em breve.)
A0
D0
BATER
DM-1
AN-1
MEMBRO MEMRD
SELECIONAR
Os sinais MEMRD e MEMWR devem ser conectados ao OE (na verdade, um sinal de controle de leitura) e WR ings de um
chip SRAM ,típico.
(que é o sinal de controle de gravação), respectivamente. Agora, observe o tempo de leitura e gravação
No diagrama de temporização são mostradas duas figuras de temporização – uma é tAA, o tempo de acesso de leitura. Este
é o tempo medido desde o instante em que o endereço é colocado no barramento de endereços até o momento em que os
dados necessários estão disponíveis nos pinos de dados. A outra figura de tempo é tRC, o tempo do ciclo de leitura, que é o
tempo mínimo entre dois ciclos de leitura. Esses dois valores de temporização podem ser iguais para SRAM porque, assim
que os dados estiverem disponíveis nos pinos de dados, eles poderão ser lidos pelo processador e um novo ciclo de leitura
poderá ser iniciado. (Isso é apontado aqui para contrastá-lo com o tempo de DRAM, onde veremos outro elemento de atraso).
tRC
CS
VOCÊ ESTÁ
tAA
Endereço
CS
WR
Dados Dados
configurar em espera
Ler lógica
Endereço
Memória
Variedade
VOCÊ ESTÁ
Dados
CS Lógica
WR
Coluna
Decodificador
Lógica de Gravação
células de memória são organizadas dentro de um chip de memória? Uma memória pode armazenar
apenas um bit de informação. Para matrizes de memória, essas células são organizadas em forma de
matriz, e o endereço é dividido internamente em linhas e colunas – existem decodificadores de linha e
coluna dentro do chip, que ativam as linhas e colunas certas para um endereço específico colocado no barramento de
A Fig 12.4 mostra a organização interna de um chip de memória típico, que deve ser bastante clara
Machine Translated by Google
já que conhecemos todos os sinais associados ao funcionamento da memória. As linhas de dados são bidirecionais,
pois os dados podem ser lidos ou gravados – os drivers mostrados indicam a direção do percurso dos dados.
Para atingir baixos níveis de consumo de energia, o CMOS é normalmente usado para a tecnologia SRAM.
Ela consome menos energia que a DRAM (sobre a qual falaremos em breve), mas em altas frequências também pode
consumir quantidades significativas de energia. Como cada célula precisa de pelo menos seis transistores, as SRAMs
são mais caras e menos densas em comparação com as DRAMs. Portanto, eles não são usados como memória
primária (principal) em computadores pessoais. Eles são tão rápidos quanto as CPUs típicas por usarem a mesma
tecnologia da CPU e, portanto, encontram uso mais importante como 'memória cache', onde a velocidade é o fator
decisivo. Por serem caros, os caches são naturalmente muito menores em tamanho (capacidade de armazenamento)
do que a memória principal dos PCs. Falaremos sobre 'cache' na Seção 12.5.
Em um chip DRAM, existem muitas dessas células que formam palavras que consistem em bits.
A atualização das células é feita de uma só vez, em uma sequência específica. Os endereços de memória são
decodificados e convertidos como linhas e colunas do arranjo de matriz em que os elementos de memória são
organizados.
Linha de palavras
Gnd
processador e um chip DRAM, existe um controlador de memória cuja função é dividir o endereço em dois, como colunas e
linhas. Uma DRAM tem apenas metade do número de pinos de endereço que o endereço fornecido pelo processador,
porque as linhas de endereço do chip DRAM são multiplexadas no tempo para os endereços de linha e coluna. O
controlador de memória também deve gerar os sinais necessários para leitura e escrita da DRAM (Fig 12.6).
Veja o diagrama de um controlador de memória de uma DRAM. Como as informações de linha e endereço são
colocadas nas mesmas linhas de endereço (multiplexadas no tempo), a contagem de pinos do chip DRAM é reduzida. Os
chips DRAM são grandes matrizes retangulares de células de memória com lógica de suporte que é usada para ler e gravar
dados nas matrizes e atualizar os circuitos para manter a integridade dos dados armazenados. Os arrays de memória são
organizados em linhas e colunas de células de memória chamadas wordlines e bitlines, respectivamente. Cada célula de
memória tem uma localização ou endereço único definido pela interseção de uma linha e uma coluna.
i) O endereço de linha é colocado nas linhas e dado tempo suficiente para estabilizar e ser
travado.
iv) Em seguida, o endereço da coluna é colocado nas mesmas linhas de endereço e permitido estabilizar e
ser travado.
vi) O pino CAS também serve como habilitação de saída, portanto, uma vez que o sinal CAS esteja estabilizado, os
amplificadores de detecção colocam os dados da linha e coluna selecionadas no barramento de dados.
vii) Com isso, os dados do endereço selecionado ficam disponíveis nos buffers de saída do chip, e
ele é transferido para o barramento de dados.
viii) Antes que o ciclo de leitura possa ser considerado completo, CAS e RAS devem retornar aos seus
estado anterior.
Linha coluna
Endereço Morada
RAS
CAS
R/W DRAM
CONTROLADOR R/W
PROCESSADOR DRAM
Relógio CS
RELÓGIO
Dados
CAS
Endereço Endereço
MEMÓRIA
da linha da linha
VARIEDADE
Robusto Dcdr
RAS
Sentir e Atualizar
Amplificadores
tRC
Endereço
Fileira Coluna
RAS
tRP
CAS
tCAC
Dados
Dados
tRAC
Tempo ativo do RAS
RAS
tRAC = tempo de acesso do RAS tRC = tempo do ciclo de leitura Pré-carga
tCAC = tempo de acesso do CAS tRP = tempo de pré-carga do RAS Tempo
Esta é uma leitura assíncrona convencional, porque os sinais de temporização não estão vinculados ao relógio
do sistema principal. Observe o diagrama de tempo de leitura para uma DRAM padrão típica. O tempo de acesso (tRAC)
é o tempo desde o momento em que o sinal RAS é ativado até o momento em que os dados estão disponíveis no
barramento de dados. O tempo de ciclo de leitura (tRC) também é mostrado no diagrama. Observe que outra vez tRP
está incluído neste tempo de ciclo de leitura. O tempo total do ciclo de leitura é a soma do 'tempo ativo do RAS' e do
'tempo de pré-carga do RAS'. O primeiro corresponde ao tempo em que o sinal RAS está ativo (baixo). O que é 'tempo
de pré-carga RAS', (tRP)? É tRP o tempo adicional necessário antes que um novo ciclo de leitura (ou gravação) possa
ser iniciado diminuindo o sinal. Isso ocorre porque há uma capacitância parasita para cada célula. Esta capacitância
parasita deve ser pré-carregada alta antes que qualquer operação seja iniciada. O tempo de acesso também é
chamado de latência. Isso também se aplica a ciclos de gravação. A Figura 12.9 mostra os sinais de uma DRAM típica
(cortesia: Maxwell Tech nologies). Faremos referência a este diagrama quando discutirmos vários aspectos das DRAMs.
Um elemento importante no projeto de chips de memória DRAM é a relação sinal-ruído. Isso depende da razão da
capacitância do capacitor de armazenamento dentro da memória DRAM para a capacitância da linha Word ou Bit na
qual a carga é descarregada quando a célula é acessada. À medida que a densidade de bits por chip aumenta, essa
proporção é degradada, pois a área da célula diminui à medida que mais células são adicionadas à linha de bits. É por
esta razão que é importante armazenar uma tensão tão alta no capacitor da célula e também aumentar essa capacitância
do capacitor de armazenamento DRAM para determinadas áreas, tanto quanto possível. Essa é uma consideração
muito importante porque detectar a pequena carga no capacitor da célula de memória é uma das áreas mais desafiadoras
do design do chip de memória DRAM. Como resultado disso, alguns projetos de circuitos elaborados foram incorporados
aos chips de memória DRAM. Uma figura importante de mérito da DRAM é que sua densidade de empacotamento é
muito alta em comparação com a SRAM.
Observe que para DRAM, o armazenamento de um bit requer apenas um transistor, enquanto que para SRAM é
necessário um mínimo de quatro transistores.
NÓS
ENTRADA DE DADOS
AMORTECEDOR
FAZ
CAS
DN
SAÍDA DE DADOS
AO
AMORTECEDOR
COLUNA
DECODIFICADOR VOCÊ ESTÁ
CONTROLE
LÓGICA
DE
SENTIR AMP
Um VDD
MEMÓRIA
FILEIRA
DECODIFICADOR
VARIEDADE
VSS
RAS
12.2.2 | Refrescante
E a taxa de atualização? Varia, mas normalmente os fabricantes especificam que cada linha deve ser atualizada a
cada 64 ms. Este intervalo de tempo está de acordo com os padrões JEDEC* para períodos de atualização dinâmica
de RAM. Como é feita a atualização? Existem muitos métodos para atualização, e um método comumente usado é
chamado ROR (RAS Only Refresh). Na prática, isso é feito pelo controlador DRAM que se encarrega de agendar as
não interfiram nas leituras e gravações regulares.
atualizações
Assim,
ativando
para cada
evitarlinha
que os
usando
dadosRAS
no chip
. e certificando-se
DRAM vazem,de o que eles
controlador DRAM periodicamente varre todas as linhas alternando repetidamente e colocando uma série de
endereços de linha no barramento de endereços. Este método é designado como ROR ou RAS Only Refresh.
Para reduzir o número de ciclos de atualização, um método de design é dividir o endereço de forma que haja
menos linhas e mais colunas. Assim, a matriz DRAM é então uma matriz retangular, em vez de quadrada. Outros
métodos de atualização são:
que o CAS também funciona como habilitação de saída. Algum tempo após a ativação do sinal CAS , os
dados ficam disponíveis no barramento de dados e o processador precisa de algum tempo para lê-los.
Portanto, o CAS deve permanecer ativo até que o processador o leia. Se o CAS estiver desativado, os
buffers de saída serão desativados e os dados não estarão mais disponíveis na saída. No entanto, somente
após o sinal CAS ficar alto, um novo ciclo pode começar. Assim, atrasar a inativação do sinal CAS cria um
pequeno atraso. Se esse atraso puder ser evitado, a velocidade da memória poderá ser aumentada.
Nas DRAMs EDO, um novo ciclo pode ser iniciado inativando o CAS assim que os dados do ciclo
anterior estiverem disponíveis no barramento de dados. Os dados permanecem na saída por um tempo
suficiente para que a CPU os receba. Isso significa que o sinal CAS obviamente não é o sinal 'Output
Enable' para os buffers de dados, para EDO DRAMs (ref Fig 12.9). Isso permite uma certa quantidade de
overlap na operação (pipelining), permitindo um desempenho um pouco melhor. Para ser preciso, a EDO
, aumenta
DRAM inicia a saída de dados na borda descendente do CAS , mas não interrompe
novamente.
a saída
Ele quando
mantémoaCAS
saída
válida (prolongando assim o tempo de saída de dados) até que o RAS seja desativado ou uma nova borda
descendente do CAS selecione um endereço de coluna diferente.
Operação síncrona Todas as operações são sincronizadas com a ponta do relógio do sistema e, assim, os
controles são facilitados.
Registo de modo Existe um registo de comando para esta RAM no qual são escritas palavras de comando
para especificar vários modos de funcionamento e também gerar vários sinais de controlo. Este é um
conceito totalmente novo para chips de memória e, portanto, permite um nível de controle baseado no nível
de desempenho necessário da RAM.
Arquitetura de memória intercalada Nos capítulos anteriores, falamos sobre bancos de memória.
Agora vamos verificar essa ideia mais uma vez. Consulte a arquitetura do banco de memória do 80386
(Seção 15.5). Vemos que a memória total está organizada em bancos e cada banco é habilitado pelo seu
sinal Bank Enable (BE ). Agora considere que precisamos acessar dados de 32 bits da localização 000000
a 000003. Todos os quatro bancos da Fig 12.10 devem ser ativados e lidos simultaneamente. Na intercalação
bidirecional, o método é dividir os quatro bancos em dois conjuntos. Obter a palavra dupla completa é feito
primeiro habilitando os bancos no Conjunto A e depois no Conjunto B. Enquanto os dados no Conjunto A
estão sendo lidos, as células DRAM no conjunto B estão sendo pré-carregadas. Assim, o tempo de pré-
carga do Conjunto B fica oculto atrás do tempo de acesso do Conjunto A e, para dados sendo lidos de
endereços consecutivos, isso se torna uma vantagem. A intercalação pode ser feita para qualquer sistema
de RAM, mas para DRAMs assíncronas, se a intercalação for feita, ela deve ser feita na placa de circuito.
No caso das SDRAMs, isso é feito dentro do próprio chip, e também há a previsão de 'não
Machine Translated by Google
Conjunto B Conjunto A
use intercalação', o que significa que o registro de comando pode ser programado para acesso 'intercalado ou não
intercalado'.
Modo de rajada com comprimento de rajada selecionável Os dados de que precisamos geralmente residem em locais
de memória consecutivos, portanto, quando os dados em uma página devem ser acessados, os endereços de linha e
coluna precisam ser fornecidos apenas uma vez. Depois disso, apenas os endereços das colunas devem ser incrementados/
decrementado e os dados são obtidos continuamente. Este é o modo burst de transferência de dados (também ref Seção
16.1 e Fig. 16.3), e é a maneira como a leitura/gravação ocorre em DRAMs FPM e EDO.
Em SDRAMs, isso é feito, mas o registrador de comando no chip habilita os sinais de controle necessários. O comprimento
de rajada é o número de palavras que podem ser continuamente entrada/saída para uma operação de leitura ou escrita,
e isso é selecionável usando o registrador de comando). Assim, comprimentos de rajada de 2, 4, 256 ou página inteira
podem ser 'definidos' configurando adequadamente a palavra de comando da SDRAM.
Vamos analisar um típico 'ciclo de leitura intermitente' retirado da folha de dados da Micron Technologies.
A Figura 12.11 fornece muitas informações sobre os pontos que discutimos anteriormente. Um comprimento de rajada de
4 foi especificado – portanto, com um comando de leitura, quatro conjuntos de saídas de dados foram obtidos. Para ler
novamente, mais um comando de leitura deve ser iniciado. Os comandos são emitidos carregando palavras de controle
adequadas no registro de comando e faz com que os sinais de controle necessários sejam ativados. O comando NO
OPERATION (NOP) é usado para realizar um NOP em uma SDRAM selecionada. Isso evita que comandos indesejados
sejam registrados.
As linhas DQ são as linhas de entrada/saída de dados. O comprimento de rajada é o número de palavras que podem ser
continuamente entrada/saída para uma operação de leitura ou escrita. A Fig 12.11 mostra um comprimento de rajada de 4.
Latência de CAS selecionável Latência de CAS é o número de ciclos de clock que ocorrem desde a entrada de um
comando até a saída de dados. O número de relógios pode ser ajustado no Mode Register. CL é o atraso, em ciclos de
clock, entre o registro de um comando READ e a disponibilidade do primeiro dado de saída. A latência pode ser definida
para dois ou três relógios. Se um comando READ for registrado na borda do clock n e a latência for m clocks, os dados
estarão disponíveis pela borda do clock n + m. Os DQs começarão a dirigir como resultado da transição de clock um ciclo
anterior (n + m ÿ1), e desde que os tempos de acesso relevantes sejam atendidos, os dados serão válidos pela transição
de clock n + m. Por exemplo, supondo que o tempo do ciclo de clock seja tal que todos os tempos de acesso relevantes
Machine Translated by Google
T0 T1 T2 T3 T4 T5
CLK
BANCO
MORADA COL n
CL = 2
forem atendidos, se um comando READ for registrado em T0 e a latência estiver programada para dois relógios, os DQs
começarão a dirigir após T1 e os dados serão válidos por T2, conforme mostrado na Figura 12.11 que mostra uma latência
CAS de 2 (n = 0, m = 2).
sinal de clock com a CPU e chipset, o chipset tem que manipular os pinos de controle da DRAM com base em
todos os tipos de considerações de tempo. A SDRAM, no entanto, compartilha o clock do barramento com a
CPU. Comandos podem ser colocados (ou, certas combinações predefinidas de sinais) em seus pinos de
controle na borda ascendente do clock.
Uma diferença significativa entre a DRAM convencional e a SDRAM é a forma como o acesso à memória é
executado. Em uma DRAM padrão, a alternância das entradas de controle externo tem um efeito direto na matriz
de memória interna. Em uma SDRAM, os sinais de entrada são travados em um bloco lógico de controle que
funciona como entrada para uma máquina de estado. Portanto, a máquina de estado realmente controla o acesso
à memória. As operações básicas da SDRAM, como leitura, gravação e atualização, são iniciadas pelo
carregamento de comandos de controle no dispositivo. Os comandos de controle mais comuns da SDRAM são:
• Pré-carga
• Atualização do CAS antes do RAS (CBR)
• Atualização automática
Agora que o conceito de DRAMs está claro, vamos descobrir o que significam as palavras DDR, DDR-2 etc.
Essas são todas SDRAMs, mas como continuamos ouvindo esses termos com frequência, conhecer suas
características especiais certamente contribuirá para nosso conhecimento.
DDR Th significa SDRAM 'Double Data Rate' e a diferença que tem da SDRAM normal é que pode transferir
dados nas bordas ascendente e descendente do clock, em vez de apenas na borda ascendente. Isso deve
dobrar a taxa de dados e, portanto, a designação DDR. Ele atinge um rendimento mais alto usando pares
diferenciais de fios de sinal para permitir uma sinalização mais rápida sem problemas de ruído e interferência.
(Sinalização diferencial significa que o sinal é considerado a diferença de um sinal positivo e um sinal negativo,
como um amplificador diferencial.
Isso reduz os sinais de modo comum, que são sinais de ruído.) DDR SDRAM chegou ao mercado pela primeira
vez no ano 2000, mas realmente não pegou até 2001 com o advento das placas-mãe convencionais e chipsets
que o suportavam. O DDR encontrou suporte inicial no mercado de placas gráficas e, desde então, tornou-se o
padrão de memória de PC convencional. Como tal, a SDRAM DDR é suportada por todos os principais fabricantes
de processadores, chipset e memória.
DDR – 2 e DDR – 3 São apenas versões mais rápidas de SDRAMs DDR e usam técnicas especiais para
acelerar, considerando que as latências básicas de uma célula DRAM nunca podem ser eliminadas
completamente. O DDR2 ainda é o dobro da taxa de dados, assim como o DDR, mas o método de sinalização
modificado permite que velocidades mais altas sejam alcançadas com mais imunidade a ruídos e conversas
cruzadas entre os sinais. Os sinais adicionais necessários para pares diferenciais aumentam a contagem de
pinos de DDR2 e DDR3.
12.4.1 | EPROM
EPROMs são 'Apagáveis e Programáveis' – seu conteúdo pode ser apagado expondo-os à radiação
ultravioleta. Tais ROMs têm uma janela através da qual a luz UV penetra no chip.
12.4.2 | EEPROM
Esta é uma PROM 'Electricamente Apagável', e o apagamento pode ser feito enquanto o chip está na placa
de circuito. A característica predominante da EEPROM é que o programador pode alterar os dados embutidos
na memória um byte por vez, dando a ele mais controle sobre como ele insere os dados. No entanto, esse
método leva muito tempo, especialmente ao apagar todos os dados nele.
A EEPROM foi amplamente usada em eletrônicos que são programados apenas algumas vezes antes do
envio, mas podem ser atualizados por meio de patches. Um exemplo disso seria o chip que contém o BIOS
(Basic Input Output System) do nosso computador. Pode ser reprogramado com atualizações do fabricante
para adicionar mais funcionalidades ou para corrigir bug que não foi descoberto no momento do envio.
12.4.3 | Flash-ROM
Este é um tipo especial de EEPROM que pode ser apagado e reprogramado em blocos ao invés de um byte
de cada vez. Ele particiona a memória em blocos. Embora a gravação de dados na memória flash ainda seja
feita no nível de byte, apagar o conteúdo significaria apagar o bloco como um todo. O bloco pode ser a própria
memória inteira. Esta característica deu à memória flash a vantagem da velocidade sobre a EEPROM. A
memória flash tornou-se muito popular porque consome muito menos energia em comparação com um disco
rígido e é muito mais durável, capaz de sobreviver a calor excessivo, pressão e até pode ser submersa em
água. A memória flash tornou-se o sucessor instantâneo dos antigos disquetes não apenas por sua durabilidade,
mas também por sua grande capacidade e tamanho relativamente pequeno. A única desvantagem da memória
flash é que, como a EEPROM, ela só pode durar uma certa quantidade de ciclos de apagamento e gravação
antes de falhar, mas o número é bastante alto, na faixa de 500.000 e mais para flash e EEPROM.
Muitos PCs modernos têm seu BIOS armazenado em um chip de memória flash para que possa ser
facilmente atualizado, se necessário. Esse BIOS às vezes é chamado de BIOS flash. A memória flash também
é popular em modems porque permite que o fabricante do modem ofereça suporte a novos protocolos à
medida que eles se tornam padronizados. Muitos microcontroladores possuem ROM flash no chip. Isso permite
que o programador altere o programa gravado on-line.
12.4.4 | NVRAM
É uma abreviação de Non-Volatile Random Access Memory, um tipo de memória que retém seu conteúdo
quando a energia é desligada. Um tipo de NVRAM é a SRAM que se torna não volátil conectando-a a uma
fonte de energia constante, como uma bateria (geralmente uma bateria de lítio). Outro tipo de NVRAM usa
chips EEPROM para salvar seu conteúdo quando a energia é desligada. A NVRAM é composta por uma
combinação de chips SRAM e EEPROM. A memória CMOS em PCs que armazena configurações importantes
e a hora do sistema é NVRAM.
normalmente chamado. O significado literário de 'cache' (como substantivo), é 'um esconderijo', e como verbo
'esconder'. Descobriremos que, no contexto da arquitetura de computadores, essa palavra seria mais significativa
como 'um local de armazenamento temporário'.
Em um sistema de computador, existem várias hierarquias no armazenamento de informações. No processador,
os registradores armazenam dados. Em seguida, há a memória principal, fora do processador, mas muito próxima a
ele, e também a memória secundária, bem abaixo na hierarquia de memória. Onde nesta foto, o 'cache' se encaixa?
Consulte a Figura 12.12. O bloco 'cache' é mostrado próximo ao processador, conectado diretamente a ele através
do barramento do sistema, assim como a memória principal. Isso significa que os dados do processador podem ser
transportados de/para o cache, assim como no caso da memória principal.
No entanto, qual deles deve ser considerado o mais alto na hierarquia? A resposta é 'cache'.
O cache é onde se espera que as informações (dados e programas) necessárias para a execução de qualquer
programa sejam encontradas. Quando o processador deve executar uma tarefa, ele procura no cache o programa
necessário. Se o item for encontrado lá, diz-se que ocorreu um 'hit' no cache. Caso contrário, é uma 'falta de cache'.
Se ocorrer uma falha, o processador vai para a memória principal e traz o item para o cache e então a execução do
programa é concluída. A questão é que, quando a informação necessária está no cache, a velocidade de execução
é muito alta.
Agora vamos discutir o 'como e por que' deste assunto. Em um sistema de computador, o componente mais
rápido é o processador. Ele tem muito pouco armazenamento porque apenas registradores de uso geral estão
disponíveis nele. Para ter uma execução rápida, deve haver um espaço de armazenamento tão rápido quanto o processador.
Este é o ideal desejado, e o objetivo de qualquer projeto de computador é chegar o mais próximo possível do ideal.
Para isso, precisamos de memórias muito rápidas. A memória mais rápida disponível é a SRAM, cuja tecnologia é
semelhante à tecnologia do processador. No entanto, a SRAM é muito cara e ter quantidades suficientemente
grandes dela é proibitivamente cara. Também dissipa muita energia. Portanto, o uso de SRAM como memória
principal é descartado. A próxima melhor alternativa é a DRAM, que não é tão boa, mas suficiente (consulte a Tabela
12.1 para uma comparação entre as duas tecnologias de RAM). DRAM tem alta densidade de empacotamento, baixa
potência e baixo custo. Assim, a DRAM foi escolhida como a tecnologia de escolha para a memória principal.
Agora, para o fator de velocidade - para atingir velocidades mais altas do que as alcançadas pela DRAM, uma
memória SRAM de tamanho pequeno é inserida entre o processador e a memória principal. Isso é chamado de
'cache' e é a escolha de armazenamento para o 'processo atual' – para o 'programa em execução' a qualquer
momento. Isso significa que o projeto do sistema de memória deve garantir que os dados e o código de um programa
a ser executado sejam encontrados no cache 'todos os momentos' – ou que um 'acesso ao cache' seja a regra e não
a exceção. O projeto da maioria dos sistemas de computador atinge uma 'taxa de acerto' acima de 90%, o que é
considerado razoavelmente bom. (A 'taxa de acerto' é a porcentagem de acertos, do total de acessos à memória.)
CACHE
C
Principal Secundário
P
Memória Memória
DENTRO
ÔNIBUS
Registros na CPU 5 ns
Cache 10 ns
Memória secundária 5 ms
* Todos esses números estão diminuindo à medida que a tecnologia avança. Esses números são apenas
para fins de comparação.
tamanho do cache, melhor é o desempenho – mas apenas até um limite – além disso, a complexidade
adicional que o acompanha tende a anular a vantagem obtida.
No entanto, mais importante do que tudo isso é decidir e finalizar a 'organização' da cache. Um ponto
importante a ser observado e lembrado sempre é que um cache armazena apenas uma 'cópia' de uma parte
do conteúdo da memória principal. Comparado com o tamanho da memória principal, o cache é muitas vezes
menor. Assim, a qualquer momento, a 'memória principal grande' é mapeada para um 'cache pequeno'.
Existem muitas técnicas de mapeamento para isso e isso constitui a organização do cache.
Comecemos da seguinte maneira. A memória principal é dividida em blocos e a cache também é dividida
em blocos de mesmo tamanho. (Um bloco é um número de bytes, que é decidido, em algum momento. Pode
ser 16 bytes ou 64 bytes ou maior ou menor). O número de blocos na memória principal é n vezes o número
de blocos no cache. Por exemplo, se um cache tiver 64 blocos, deve haver '64n' blocos na memória principal.
Quais 64 dos 64n blocos da memória principal também estão disponíveis no cache? Como esses blocos são
organizados? As respostas a tudo isso constituem a 'organização' do cache, ou seja, o mapeamento.
Para entender isso, vamos começar com pequenas figuras (números) e uma explicação simples. Considere
um cache que tenha espaço para 64 blocos a serem armazenados. A memória principal tem 64n desses blocos.
Os blocos de cache são numerados como CB-0, CB-1, CB-2 até CB-63. Nesses blocos de cache, quais 64
blocos da memória principal podem ser carregados? Os blocos de memória principal são denominados MMB-0,
MMB-1 MMB-(64n-1). Veja a Fig 12.13 para n = 8.
A técnica de 'mapeamento direto' corrige que, no local do bloco de cache CB-0, apenas MMB-0, MMB-64,
MMB-128, MMB-192 etc. podem ser copiados. Da mesma forma, no CB-1, apenas MMB-1, MMB-65, MMB-129
e assim por diante podem ser copiados. A Fig 12.13 mostra que nos blocos de cache CB-0 a 63, os blocos de
memória principal MMB-0 a MMB-63 podem ser mapeados de forma correspondente. Os próximos 64
conjuntos de blocos de memória principal MMB-64 a 127 também podem ser mapeados para CB-0 a 63. Esse
padrão se repete.
Então, para qual bloco de cache o bloco de memória principal MMB-125 pode ser mapeado? A resposta
é 125 mod 64 = 61 ou seja, CB-61. Isso é fixo e o MMB-125 só pode ser copiado para o CB-61. A declaração
que define o mapeamento direto é que:
Se cada bloco de memória principal tem apenas um lugar onde pode aparecer no cache, o cache é dito
ser mapeado diretamente. O mapeamento é para o número do bloco de cache dado pelo cálculo:
Este é o caso quando um bloco de memória principal pode ser copiado para qualquer bloco de cache. A Figura
12.14 mostra um diagrama de uma organização de cache totalmente associativa. Este esquema organizacional
permite que qualquer bloco da memória principal seja armazenado em qualquer bloco do cache. Por exemplo, o principal
Machine Translated by Google
CB - 0 MMB - 0
CB - 1 MMB-1
CB - 2 MMB-2
CB - 3 MMB-3
CB - 63 MMB - 63
MMB - 64
MMB-511
Memória principal
MMB-0
Memória cache
MMB-1
CB - 0
MMB-2
CB - 1
CB - 2
CB - 3
CB - m
MMB - n
bloco de memória MMB-0 da memória principal é armazenado no CB-3 ou CB-2 do cache. No entanto, esta não é a única
possibilidade; MMB-0 pode ter sido armazenado em qualquer bloco dentro do cache.
Como qualquer bloco de cache pode armazenar qualquer bloco de memória, o nome 'totalmente associativo' é usado para
esse mapeamento.
Machine Translated by Google
Os blocos de memória principal MMB 0 podem ser mapeados para os blocos de cache do Conjunto 0. Da mesma forma, o
MMB 1 tem a opção de ser mapeado para qualquer um dos dois blocos de cache do Conjunto 1. E o MMB-2?
Da mesma forma, pode ser copiado para o Conjunto 2 e assim por diante. Assim, o MMB-31 é copiado para qualquer um dos
blocos do Conjunto 31. E o MMB-32? Vai para o Conjunto 0. O conjunto geralmente é escolhido pela fórmula.
O intervalo de caches de mapeado direto a totalmente associativo é realmente um continuum de níveis de associatividade de
conjunto. O mapeamento direto é simplesmente associativo de conjunto unidirecional e um cache totalmente associativo com m
blocos pode ser chamado de associativo de conjunto m-way. A grande maioria dos caches de processador hoje são mapeados
diretamente, associativos de conjuntos de duas vias ou associativos de conjuntos de quatro vias.
Tenha em mente que para mapeamento associativo de 4 vias, existem quatro opções para qualquer bloco de memória
principal. No entanto, dentro de cada conjunto, o mapeamento é totalmente associativo. ou seja, o MMB pode mapear para
qualquer bloco de cache dentro do conjunto.
Para associatividade de 2 vias, há duas opções para qualquer bloco de memória principal e para mapeamento direto, há
apenas uma 'posição' para qualquer bloco de memória principal - não há outra 'opção'
CB - 0 MMB - 0
CONJUNTO 0
CB - 1 MMB-1
CB - 0 MMB-2
CONJUNTO 1
CB - 1 MMB-3
CB - 0
CONJUNTO 2
CB - 1
MMB - 31
MMB-32
CB - 0
CONJUNTO 31
CB - 1
MMB-511
no caso de mapeamento direto, usamos a palavra 'blocos de cache', mas uma terminologia mais comum é 'linha de cache'.
Exemplo 12.1
Considere o seguinte caso de um sistema com 2.048 blocos de cache e 8.192 blocos de memória principal.
Localize, onde no cache, os blocos de memória principal MMB-15 e MMB-2029 serão colocados para as políticas de mapeamento
de:
a) mapeamento direto
b) mapeamento totalmente associativo
c) Associativo de conjunto de 4 vias.
Solução
e) MMB – 15
a) Mapeamento direto.
b) Totalmente associativo.
Este bloco MMB pode ser copiado para qualquer bloco de cache.
Em four-way set associative, a cache será dividida em conjuntos de quatro blocos. Assim, haverá 2048/4 = 512 conjuntos no
cache.
15 mod (512) = 15 ou seja, MMB-15 pode ser copiado para qualquer um dos quatro blocos de cache do Conjunto 15.
a) Mapeamento direto.
Modo 5029 (2048) = 933. Este bloco será copiado para o CB-933.
b) Totalmente associativo.
Este bloco pode ser copiado para qualquer um dos quatro blocos de cache do Conjunto 421.
Discutimos a técnica de mapeamento usando um pequeno número de blocos de cache. Na realidade, o número de blocos de
cache será bastante alto. Além disso, muitos circuitos são necessários para verificar um acerto ou erro comparando endereços
de bloco e assim por diante. Uma discussão detalhada sobre como essas técnicas de mapeamento de ping são implementadas
na prática está além do escopo deste livro, mas deve ser obtida em qualquer livro sobre arquitetura de computadores.
Comparação
Em termos de complexidade de implementação, o mapeamento totalmente associativo tem a maior quantidade de comparação a
ser feita. No entanto, é a técnica de mapeamento mais fl exível, pois qualquer bloco de memória principal pode ser colocado em
qualquer posição do bloco de cache.
Machine Translated by Google
À medida que o mapeamento se torna associativo de conjunto, a complexidade diminui, mas também a fl exibilidade.
Para qualquer sistema, a técnica de mapeamento escolhida será um compromisso entre esses dois fatores conflitantes.
Lembre-se que um cache contém uma cópia de alguma parte do conteúdo da memória principal. Quando um bloco de dados
é trazido para o cache da memória principal e processado, esse conteúdo pode ser alterado. No entanto, o conteúdo original
na memória principal não é alterado. Isso criará uma inconsistência e, para evitá-la, o conteúdo da memória principal deve
ser alterado de forma correspondente.
Para isso, os caches têm o que se chama de 'política de gravação'.
Para qualquer cache, as políticas de leitura e escrita são pré-definidas. Aqui, vamos tocar
apenas na política de gravação. Existe a política de write-back e write-through.
Na política de write-back, o cache age como um buffer. Ou seja, quando o processador inicia um ciclo de escrita, o
cache recebe os dados e encerra o ciclo. O cache então grava os dados de volta na memória principal quando o barramento
do sistema está disponível. Isso pode causar uma situação em que o conteúdo do cache foi alterado, mas não o conteúdo da
memória principal. Para tornar o sistema ciente disso, há um bit no cache chamado de bit 'sujo' que é definido para mostrar
essa condição. Posteriormente, o sistema pode copiar o conteúdo alterado do cache para a memória principal e limpar o bit
sujo.
Este método fornece o melhor desempenho, permitindo que o processador continue suas tarefas enquanto a memória
principal é atualizada posteriormente. O segundo método é a política write-through.
Neste, quando o conteúdo de um cache é alterado, a alteração será atualizada no cache, bem como na memória principal
simultaneamente.
Sabemos que não podemos deixar nenhum bloco de memória principal residir permanentemente na memória. Apenas os que
estão em uso constante são mantidos lá. Se um novo bloco importante precisar ser transportado para o cache e se o cache
estiver cheio, o que deve ser feito? O menos importante dos blocos que residem atualmente no cache pode ser substituído
pelos novos dados.
No entanto, a 'pegadinha' aqui é como determinar os menos importantes. Existem vários algoritmos para isso, e o algoritmo
mais popular é o algoritmo 'Menos usado recentemente' (LRU).
Mais algoritmos para aplicações específi cas também estão disponíveis – First-In First-Out (FIFO), Mais Recentemente
Usado (MRU), Menos Frequentemente Usado (LFU), Mais Frequentemente Usado (MFU) e assim por diante. Esses assuntos
são gerenciados pelo sistema operacional.
Com o processador '486, a Intel adicionou uma pequena quantidade (8 KB) de cache dentro da CPU.
Este cache interno foi chamado de L1 (nível 1) ou interno, enquanto o cache de memória externo foi chamado de L2 (nível 2)
ou 'externo'. A quantidade e existência da memória externa
Machine Translated by Google
cache dependia do modelo da placa-mãe. Os valores típicos para aquela época eram 128 KB e 256 KB.
Então havia o primeiro processador Pentium com dois caches internos – um para dados e outro para instruções.
Cada um tinha 8 KB de tamanho. Mais tarde, o tamanho desse cache foi aumentado. No entanto, o cache L2 ainda
era externo e seu tamanho dependia do fabricante da placa-mãe.
Gradualmente, tamanhos como 256 KB para cache L1 e 512 KB para L2 se tornaram padrão. No entanto, ter um
cache externo resultou em menor velocidade, já que o clock do processador é de alta velocidade (> 200 MHz),
enquanto as velocidades da placa-mãe eram menores (em torno de 66 MHz).
No entanto, mesmo naquela época, havia o processador Celeron que não tinha cache e, portanto, mais lento,
mas mais barato - então havia compradores para esses PCs baseados em processador. No entanto, agora, os
processadores Celeron também possuem caches internos.
Com P6, as coisas mudaram. Ambos os caches L1 e L2 são internos – no chip. Esta mesma arquitetura é
usada até hoje – ambos os caches L1 e L2 estão localizados dentro da CPU rodando no clock interno da CPU.
Portanto, a quantidade de cache de memória que você pode ter em seu sistema dependerá do modelo de CPU que
você possui; não há como aumentar a quantidade de cache sem substituir a CPU.
A Figura 12.16 mostra diferentes caches para uma CPU típica como x86. Os caches L1 D e L1 I são caches de
dados L1 e caches de instruções L1, respectivamente. Mais detalhes sobre isso são fornecidos no Capítulo 16.
À medida que mais e mais processadores começaram a incluir o cache L2 em suas arquiteturas, o cache de
nível 3 se tornou o nome do cache extra embutido nas placas-mãe entre o microprocessador e a memória principal.
Muito simplesmente, o que antes era cache L2 em placas-mãe agora se tornou cache L3 quando usado com
microprocessadores contendo caches L2 embutidos. No entanto, o mais recente é que com mais CPUs se tornando
'multicore' (consulte a Seção 16.7.2), um cache de nível terciário foi adicionado ao processador da CPU, chamado
L3. Também se tornou comum ter os três níveis maiores em tamanho do que o próximo nível inferior, de modo que
não era incomum encontrar tamanhos de cache de nível 3 de oito megabytes. Esta tendência parece continuar no
futuro previsível.
A Figura 12.16 mostra três terminais de cache para os processadores x86 mais recentes. Isso é apenas
esquemático, e as setas não mostram o caminho do 'fluxo de dados'.
Memória principal
Ônibus
Cache L3
Cache L2 L1 I Cache
| As memórias semicondutoras são usadas como memória principal e cache, em um sistema de computador.
| Uma memória SRAM para um bit requer pelo menos 4 transistores. Portanto, a densidade de empacotamento de SRAMs é bastante baixa.
| Uma célula DRAM típica para um bit requer apenas um transistor e um capacitor.
| Para reduzir a contagem de pinos de um chip DRAM, o endereço do processador é dividido em endereço de linha e coluna (por um
controlador de memória) e, em seguida, fornecido aos pinos da DRAM de maneira multiplexada.
| Além das DRAMs de modo padrão, existem as DRAMs de página rápida e EDO que são mais rápidas.
| A DRAM síncrona é semelhante em tecnologia à DRAM, mas é gerenciada escrevendo em um registrador de comando, e esse tipo de
RAM é atualmente o tipo mais popular em memórias semicondutoras.
| DDRs e DDR-2, DDR-3 etc. são apenas versões mais rápidas de SDRAM.
| Existem diferentes tipos de ROM disponíveis, alguns dos quais são apagáveis e reprogramáveis.
| O tamanho do cache é pequeno e as técnicas de mapeamento determinam quais blocos da grande memória principal
devem ser copiados para o cache pequeno.
PERGUNTAS
1. Liste os pinos de um chip SRAM típico com suas funções.
6. Por que o tempo de ciclo de leitura não é igual ao tempo de acesso de leitura para uma DRAM?
7. Como você explica o uso de pinos de endereço reduzidos para uma DRAM?
EXERCÍCIO
1. Liste o número de 5 chips SRAM padrão e descubra sua capacidade e o número de pinos de saída de cada um deles.
2. Quantos pinos de endereço são necessários para cada uma dessas SRAMs a seguir?
a) 8 KB
b) 128 KB c)
1 GB d) 4
MB e) 128
MB
3. Encontre os nomes de três fabricantes de DRAMs e liste os números de 5 chips e sua capacidade. Informe se cada um deles é
DRAM padrão, FPO ou EDO DRAM.
4. Liste 5 chips SDRAM e, a partir de suas especificações, descubra seus recursos programáveis, como número de ciclos de
rajada, latência CAS e assim por diante.
6. Existe uma SDRAM marcada como 3-2-2. O que significa essa marcação xyz?
7. Existe um tipo de RAM chamado RAMBUS RAM. O que é e como e onde é usado agora?
multiprocessador
1 3 configurações
Introdução
O que é multiprocessamento?
Multiprocessamento é um termo usado para indicar que o sistema contém vários processadores, em vez de um
único processador (como é o caso, geralmente). Um 'processador' é definido como uma entidade ativa que possui um
conjunto de instruções próprio e a capacidade de executar instruções por si mesmo. Vamos listar em termos claros as
vantagens significativas dos sistemas de multiprocessamento:
i) O sistema pode ser projetado de forma que as tarefas possam ser alocadas a processadores de propósito específico
cujos projetos são otimizados para executar certos tipos de tarefas de maneira fácil e eficiente.
ii) Vê-se que níveis muito altos de desempenho são alcançáveis quando múltiplos
processadores executam simultaneamente. Isso é denominado 'processamento paralelo'.
iii) Maior confiabilidade pode ser obtida isolando as funções do sistema de modo que uma falha ou erro em uma parte do
sistema tenha apenas um efeito limitado no resto do sistema.
iv) Quando um aplicativo pode ser dividido em tarefas menores e mais gerenciáveis,
desenvolvimento e modificações de subsistemas podem ser promovidos.
Esses sistemas têm obviamente muitas vantagens e recursos extras que um sistema de processador único não pode
possuir, mas junto com ele vem uma série de novos problemas também. Os dois problemas básicos a serem resolvidos
podem ser classificados como comunicação entre processadores e contenção de barramento. Como essas questões
são efetivamente tratadas é uma figura de mérito para
um sistema. Para isso, os processadores do sistema devem ter pinos e funções especiais e o 8086 é um processador
que foi projetado com recursos extras utilizáveis para multiprocessamento.
Ônibus local
Barramento do sistema
Ao controle
Barramento do sistema
Compartilhado Compartilhado
E/S Memória
Em processamento
Módulo
Local
Memória Global
Ônibus
local
Ônibus Ônibus
lógica Lógica
Local
E/S Global
Ônibus local
E/S
Processador Processador
Em processamento
Barramento
sistema
global
de
Módulo
Em processamento
Módulo
Leia atentamente o tópico 'modo máximo' (Seção 6.4) antes de tentar entender o seguinte.
Como mencionado algum tempo antes, ambos os processadores possuem seus próprios conjuntos de
instruções individuais e distintos. No entanto, há apenas um fluxo de instruções comum armazenado na memória
e somente o processador host pode buscar instruções. O coprocessador monitora as instruções que estão sendo
buscadas. À medida que isso avança, em algum momento, uma instrução ESCAPE é vista pelo coprocessador.
Todas as instruções ESCAPE começam com os cinco bits de ordem superior do opcode da instrução sendo
11011. Elas têm duas formas básicas, a forma de referência de memória e a forma de referência sem memória.
As formas de referência de memória da instrução ESCAPE permitem que o host aponte um operando de memória
para o coprocessador usando qualquer modo de endereçamento de memória. A forma não-memória inicia alguma
atividade no coprocessador usando os bits restantes da instrução ESCAPE para indicar qual função deve ser
executada.
Machine Translated by Google
Agora que o coprocessador foi alertado pelas instruções ESC, ele prossegue para a tarefa iniciada
pela instrução ESC. Dependendo do restante dos bits na instrução ESC, ele executa a operação não
baseada em memória ou se reduz à tarefa de executar a operação baseada em memória. Se o operando
memória for muito grande, o 8087 pega o barramento do host e acessa todo o operando memória (que
pode ter até dez bytes), completa a operação e armazena o resultado na memória ou em seus
registradores internos. Quando está realizando essas atividades, mantém seu pino BUSY alto. Este pino
está ligado ao pino TEST do 8086 e assim o host sabe que o coprocessador está executando alguma
instrução. Uma vez que a execução da instrução do coprocessador termina, o pino BUSY é puxado para
baixo.
Enquanto isso, o que o processador host está fazendo? Após a instrução ESC, ele continua com
sua sequência de buscar as próximas instruções em sequência. Se forem instruções 8086, o host
executa essas instruções. Neste ponto, tanto o processador host quanto o processador escravo (o
coprocessador) estão executando instruções em paralelo, e um problema que pode surgir é que ambos
podem querer que o barramento do sistema busque alguma memória ou operando de E/S. Este é o
problema clássico que surge no multiprocessamento – 'contenção de barramento'. Quando ambos os
processadores disputam o barramento, apenas um deles o obtém. Normalmente, o host está no controle
do barramento, mas quando o coprocessador solicita o barramento (em um dos pinos RQ / GT ), o host
o abandona. O coprocessador o utiliza e o devolve após o uso. Isso parece razoável, mas os conflitos
surgem quando os dois querem ao mesmo tempo. Um deles tem que esperar, obviamente.
Novamente, depois que algumas 8086 instruções são executadas, digamos, aparece na seqüência
de instruções, outra instrução do coprocessador – ou provavelmente, o host precisa do resultado da
instrução anterior do coprocessador. Nesse caso, o host deve obter o resultado da memória compartilhada.
Para garantir que o resultado seja obtido somente após o 8087 armazená-lo após a conclusão de sua
computação atual, deve haver uma instrução WAIT no fluxo de instruções antes disso.
Esta instrução verifica repetidamente o status do pino TEST do 8086 até que seja encontrado baixo.
Isso garante que o coprocessador concluiu a execução da instrução, cujo resultado é necessário para o
processador host. Então, apenas a próxima instrução na sequência é executada pelo host. A conexão
do pino BUSY-TEST e a instrução WAIT sincronizam efetivamente as atividades dos dois processadores.
Veja o diagrama de estado na Figura 13.3 para ter uma ideia das atividades de ambos os processadores.
Executar
Coprocessador Monitor Definir Redefinir
8087
INSTRs Ocupado Ocupado
INSTRs
ESC TESTE
Executar
Processador de host Buscar Até
Espere
INSTRs Resultado
é preciso
Agora, vamos entender como o 8086 e o coprocessador 8087 estão conectados em um sistema
multiprocessador. Consulte a Fig. 13.4. Ambos os processadores compartilham os mesmos sinais de clock,
reset e ready (do gerador de clock 8284). As linhas RQ / GT dos dois processadores estão interligadas.
O 8086 tem dois desses pinos. Eles são pinos bidirecionais e a solicitação será enviada para o mestre do
barramento atual (o processador que está usando o barramento no momento) do processador solicitante.
O status da fila do 8086 é monitorado pelo 8087 através dos pinos QS1 e QS0. O pino BUSY do 8087 está
ligado ao pino TEST do 8087.
No sistema, também é mostrado um controlador de interrupção, como está disponível no caso de todos
os sistemas de computador. A linha INT do 8087 é conectada a uma das linhas de solicitação de interrupção
do chip controlador de interrupção 8259(PIC). A razão para isso é que quando certos erros ocorrem durante
cálculos numéricos, o coprocessador gera uma exceção (erro gerado interrupção). Então, o cálculo será
abortado e uma rotina de serviço de interrupção deve resolver o problema. A interrupção correspondente é
roteada através do controlador de interrupção para o processador host.
linhas, mantenha linhas e assim por diante. Discutiremos os recursos importantes do coprocessador 8087 na Seção 13.5.1.
INT DENTRO
PRONTO
8259
REDEFINIR
FOTO
CLK 8086
IRN
RQ1/GT1
Ônibus
Interface
Componentes
8284A Multi-mestre
Gerador
RQ0/GT0
REDEFINIR REDEFINIR
8087
CLK CLK
PRONTO PRONTO
INT
80186/80188 80187
80286 80287
80386 80387
80486 embutido
Pentium embutido
Machine Translated by Google
Assim, podemos ver que, neste caso, os dois processadores são mais ou menos independentes um do outro. No
entanto, como a maioria das atividades de um processador de E/S é intensiva em barramento, ele precisa do barramento
com frequência. Então ele pede o barramento em um dos pinos RQ / GT do 8086, pega, usa e devolve. A Figura 13.5
mostra as conexões simplificadas entre os dois processadores. Há um pino de seleção para o 8089. Isso é porque ele tem
dois canais, e quando o sinal CA é ativado, um dos dois canais deve ser selecionado (SEL pode ser 0 ou 1). Cada canal
corresponde a uma mensagem ou tarefa que foi configurada na memória para execução do IOP.
INT DENTRO
REDEFINIR
8259 PRONTO
FOTO CLK
8086
IRN
RQ0/GT0
Ônibus
Interface
Componentes Multimaster
Sistema
Ônibus
8284A RQ0/GT0
Relógio
Gerador
CLK 8089
CLK
PRONTO PRONTO
REDEFINIR REDEFINIR Local
INT Endereço
ESTE ISTO Ônibus
Figura 13.5 | O 8086 em uma configuração fortemente acoplada com o 8089 IOP
Machine Translated by Google
Também é possível ter um sistema multiprocessador com três processadores – um 8086, 8087 e 8089.
Combinando as conexões da Fig 13.4 e da Fig 13.5 resultará nas conexões para tal configuração.
A CPU e o IOP trabalham juntos através dos blocos de controle e parâmetros. A CPU obtém uso da
memória compartilhada após verificar o sinalizador de ocupado para garantir que o IOP esteja disponível. A
CPU então preenche as informações no bloco de parâmetros e escreve uma 'operação inicial'
Figura 13.6 | Localização das informações na memória para operações de E/S em um sistema 8089
Machine Translated by Google
comando no CCW. Após a configuração dos blocos de comunicação, a UCP habilita o sinal de atenção do canal para
informar ao IOP para iniciar sua operação de E/S. A CPU então continua com seu próprio programa. O IOP responde
ao sinal de atenção do canal colocando o endereço do bloco de controle em seu contador de programa. O IOP refere-
se ao bloco de controle e configura o sinalizador de ocupado. Em seguida, verifica a operação no CCW. O endereço
PB (bloco de parâmetros) e o endereço TB (bloco de tarefas) são então transferidos para registradores IOP internos.
O IOP inicia a execução do programa no bloco de tarefas usando as informações do bloco de parâmetros. As entradas
no bloco de parâmetros dependem do dispositivo de E/S. É assim, em suma, como um IOP desempenha sua função
designada.
O 8089 foi usado em muitas aplicações nos primeiros anos de desenvolvimento de microprocessadores. No
entanto, a IBM não o usou para seu PC, e o IOP não é mais fabricado pela Intel.
Por causa da obsolescência, não a discutiremos com mais detalhes.
ii) Justiça: Mesmo o módulo de menor prioridade deve ser capaz de obter serviço.
Em todos os esquemas, há um árbitro central que atuará para controlar e restringir o acesso ao barramento.
Discutiremos três esquemas simples para arbitragem de barramento.
13.4.2 | Margarida
Este esquema usa três linhas – solicitação de barramento, concessão de barramento e barramento ocupado como
mostrado na Figura 13.7a. Cada uma dessas linhas é compartilhada por todos os potenciais bus masters que são
'daisy chain', ou seja, conectados em cascata. A prioridade dos módulos é fixada pela sua conexão física – da
esquerda para a direita, o que significa que os módulos mais próximos do árbitro do barramento central têm as maiores prioridade
Um ou mais módulos podem colocar um pedido de barramento na linha comum que é recebido pelo árbitro central.
Ele envia um sinal de concessão de barramento, desde que a linha 'barramento ocupado' esteja inativa. Este sinal de
concessão de barramento se propaga da esquerda para a direita e é aceito pelo primeiro módulo que solicitou o
barramento. Ativa o sinal de ocupado do barramento e utiliza o barramento. Assim, o sinal de concessão de
barramento não se propaga além disso.
Machine Translated by Google
Concessão de ônibus
Central
Árbitro
Solicitação de ônibus
Ônibus ocupado
GRANT-1
REQ-2
Central
GRANT-2
Árbitro
REQ-N
GRANT-N
Ônibus ocupado
Este esquema é muito simples, mas obviamente não é um esquema justo. A prioridade dos módulos
é fixada pela conexão física que não pode ser alterada após a fiação, e um módulo de baixa prioridade
pode ser travado permanentemente. O atraso na propagação do sinal de concessão do barramento da
esquerda para a direita também limita o número de módulos que podem ser acomodados no sistema.
também é chamado de esquema de solicitações independentes. Aqui, um módulo mestre pode emitir a
solicitação (Req) somente se o barramento do sistema não estiver ocupado. O árbitro centralizado emite um Bus Grant
Machine Translated by Google
Central
Árbitro
Solicitação de ônibus
Ônibus ocupado
sinal para o módulo originando o pedido de prioridade mais alta. Assim, este módulo pode adquirir o controle do
barramento do sistema e então ativar a linha comum 'barramento ocupado'. Isso está representado na Fig. 13.7b. A
prioridade pode ser predefinida (neste caso, pode acontecer que os módulos mestres de baixa prioridade não possam
acessar o barramento do sistema, ou apenas após um longo atraso), ou pode usar um esquema round-robin (a
prioridade mais alta em um determinado instante de tempo é atribuído ao vizinho do lado direito do módulo mestre
atualmente usando o barramento do sistema). Neste último caso, todos os módulos mestres têm a mesma chance de
acessar o barramento do sistema em um período de tempo maior. No caso de sistemas muito grandes, geralmente é
usada uma versão distribuída do árbitro (a versão centralizada mostrada é crítica de falha). linhas dedicadas apenas
para acesso de ônibus.
Agora que vimos os problemas e possíveis soluções para confl itos de barramento em um esquema de
multiprocessamento fracamente acoplado, torna-se óbvio para nós que o 8086 não possui os pinos ou a lógica extra
para implementar os esquemas de arbitragem de barramento discutidos. Ele tem um pino LOCK para evitar que
qualquer outro módulo do processador assuma o barramento do mestre do barramento atual, mas isso é tudo.
Isso significa que um hardware especializado é necessário para lidar com a arbitragem de barramento, e isso vem em
Machine Translated by Google
QUENTE
Arbitragem
BCLK
BRQ Para muitos
Para muitos
S2 BPRN Comando
8086/ Interface
Status BPRO Sinais
8088 S1
Decodificador OCUPADO
Status S0 QBRQ
TRANCAR
CLK
Ao controle/
CRQLCK Ao controle
Cintagem RESB Ônibus local
Opções ANYRQST AEN
Interface
IOB Sistema
SYSB/ Sinais
RESB
+5V GND
a forma do chip 8289, IC árbitro de barramento da Intel. Este chip possui os pinos para enviar solicitações de barramento, receber
concessões de barramento, ativar o sinal de ocupado e assim por diante. No entanto, para estabelecer prioridades, alterar
prioridades e assim por diante, ainda é necessária uma lógica extra. Agora, vamos ver o diagrama de blocos funcional do árbitro de
barramento IC 8289. Veja a Fig 13.8 que mostra o diagrama de blocos interno do árbitro de barramento 8289.
O árbitro de barramento 8289 opera em conjunto com o controlador de barramento 8288 para fazer a interface dos
processadores 8086/8088 com um barramento de sistema multimestre. O processador não tem conhecimento da existência do
árbitro e emite comandos como se tivesse uso exclusivo do barramento do sistema. Se o processador não tiver o uso do barramento
do sistema multimestre, o árbitro impede que o controlador do barramento (8288), os transceptores de dados e as travas de
endereço acessem o barramento do sistema (todas as saídas do driver do barramento são forçadas para o estado de alta
impedância ). Como a seqüência de comandos não é emitida pelo 8288, o barramento do sistema aparecerá como 'Not Ready' e o
processador no módulo entrará em estado de espera. O processador permanecerá em 'Espera' até que o árbitro de barramento
adquira o uso do barramento de sistema multimestre, após o que o árbitro permitirá que o controlador de barramento, transceptores
de dados e travas de endereço acessem o sistema. Normalmente, uma vez que o comando tenha sido emitido e uma transferência
de dados tenha ocorrido, uma confirmação de transferência (XACK) é retornada ao processador para indicar 'READY' do dispositivo
acessado. O processador então completa seu ciclo de transferência.
Assim, o árbitro serve para multiplexar um processador (ou mestre de barramento) em um barramento de sistema multimestre e
evitar problemas de contenção entre mestres de barramento, o que significa que apenas um mestre de barramento pode usar o
barramento em um determinado momento.
Machine Translated by Google
A Figura 13.9 mostra um módulo de um sistema fracamente acoplado (assumindo apenas recursos globais
que este módulo tenta acessar usando o barramento do sistema). Em um sistema fracamente acoplado, haverá
muitos desses módulos vinculados ao barramento do sistema comum.
mestres de maior prioridade obtêm o barramento quando um mestre de menor prioridade completa seu atual ciclo de
transferência. Mestres de barramento de prioridade mais baixa obtêm o barramento quando um mestre de prioridade mais alta
X1 X2
RDY2 VCC
8284
Relógio
Gerador
AEN2
PRONTO RDY 1 XACK (Multibus)
CPU
S0
AD0–AD15 S1 M
8288 S
ÔNIBUS T
Controlador Multi-Mestre E
CLK
MAS IOB S
A DT/R S
VOCÊ ESTÁ G M
Endereço Multi-Mestre
G VOCÊS
Multi-Mestre
Transceptor
Barramento de dados do sistema
74LS245
Figura 13.9 | Um módulo de processamento em um sistema fracamente acoplado, mostrado com o árbitro de barramento
Machine Translated by Google
não está acessando o barramento do sistema. Uma opção de cintagem (ANYRQST) é fornecida para permitir que o árbitro
entregue o barramento a um mestre de prioridade mais baixa como se fosse um mestre de prioridade mais alta. Se não
houver outros mestres de barramento solicitando o barramento, o árbitro mantém o barramento enquanto seu processador
não tiver entrado no estado HALT. O árbitro não entregará voluntariamente o barramento do sistema e deve ser forçado a sair
por outro pedido de barramento do mestre, sendo o estado HALT a única exceção. Opções adicionais de cintagem permitem
outros modos de operação em que o barramento do sistema multimestre é entregue ou solicitado sob diferentes conjuntos de
condições.
Nota Todas as transações do barramento do sistema multimestre são sincronizadas com o clock do barramento BCLK .
Nota Discutimos o uso do IC árbitro de barramento em um sistema de multiprocessamento fracamente acoplado onde vários
módulos podem tentar acessar o sistema. O IC do árbitro de barramento fornece linhas de sinal para gerenciar essa situação
de forma muito eficiente. Existem vários outros pinos do IC e vários modos de operação também. Os leitores interessados
devem consultar a folha de dados para obter mais detalhes.
Machine Translated by Google
BRQ
Ônibus
BPRN
Árbitro 1
BRQ
Ônibus BPRN 74HC148 74HC138
Árbitro 2 Prioridade 3a8
Codificador Codificador
BRQ
Ônibus
Árbitro 3 BPRN
BRQ
Ônibus
Árbitro 4 BPRN
OCUPADO
QBRQ
BCLK
BRQ
1
BPRN
2
4
3
OCUPADO
Figura 13.11 | Tempo de um árbitro de prioridade mais alta obtendo o barramento de um árbitro de prioridade mais baixa
Observação
BPRN
Ônibus
Árbitro BPRO
1
BPRN
Ônibus
Árbitro
BPRO
2
BPRN
Ônibus
Árbitro BPRO
3
BPRN
Ônibus
Árbitro BPRO
4
CBRQ OCUPADO
Tabela 13.3 | Comparação da velocidade de execução entre emulação 8086 e 8086 – 8087
sistema de coprocessamento
emulação ou seja, a mesma operação aritmética feita por um programa escrito usando 8086 instruções.
O fator de velocidade é formidável, e isso justifica o uso de um processador dedicado para cálculos tão
complexos.
Na seção 13.2.1, fizemos uma discussão detalhada de como o processador host (8086) e o coprocessador
se comunicam e executam instruções simultaneamente. Nas seções seguintes, a tentativa será compreender as
características do 8087. Para fazer isso de forma eficaz, o pré-requisito é um entendimento da filosofia e
implementação da aritmética de ponto flutuante. A Intel projetou o 8087 no ano de 1980. Naquela época, não
havia padrões definidos para aritmética de ponto flutuante, mas em 1985, muitas empresas de design de
computadores, incluindo a Intel, decidiram finalizar um padrão e é o padrão IEEE 754. O 8087 da Intel foi
desenvolvido antes da padronização, mas descobrimos que o 8087 foi projetado usando muitos dos conceitos
que mais tarde se tornaram o padrão. O coprocessador 80287 foi o primeiro a implementar totalmente o padrão.
Então, para entender o funcionamento dos processadores aritméticos, é imprescindível saber algo sobre esse
padrão.
Assim um número fracionário pode ser representado de várias formas, com diferentes valores de expoente onde
o valor do expoente é a potência de 10 nesta notação. A potência de 10 é uma indicação da posição do ponto
decimal. Nos exemplos acima, há quatro dígitos significativos na representação. No entanto, por convenção,
quando a vírgula é colocada à direita do primeiro dígito significativo diferente de zero, diz-se que o número está
normalizado. Na forma normalizada, esses números são 6,789 × 103 e 6,789 × 10ÿ4
Em computadores, a representação binária de números é usada. Então, vamos considerar alguns binários
números representados em notação de base 2, com um sinal incluído.
+111,00111 = +1,1100111 × 22 na forma normalizada
+0,001110111 = +1,111011 × 2ÿ3 na forma normalizada
Ambos os números são positivos. Um número negativo pode ser ÿ1,11 × 2ÿ3 .
Em tais representações normalizadas, duas coisas podem ser feitas 'implícitas': A base pode ser implícita
como '2' e o número de dígitos significativos antes do ponto decimal também está implícito (para ser um). A
conclusão é que 'uma representação de ponto flutuante tem um sinal, um número de dígitos significativos
chamados mantissa, e um expoente que é a potência da base implícita (2 em binário)'. No padrão IEEE,
existem dois formatos definidos para representação em ponto flutuante de números binários. Veja a Tabela 13.4
que mostra os bits atribuídos para cada componente da representação do ponto flutuante.
32 bits
S E M
Bit de sinal
Enviesado
Mantissa de 23 bits
Exponencial (8 bits)
Tabela 13.4
Nota O expoente 'tendencioso' da palavra. Ao expoente, é adicionado um valor de 127(7 FH). Isso é para
garantir que a representação de expoentes negativos não exija um bit de sinal. Então, quando o valor do
expoente é ÿ67, o expoente tendencioso é 127 ÿ 67 = 60 ou seja, 111100. Para um expoente de 120, o
expoente tendencioso seria 120 + 127 = 247, ou seja, 11110111. O expoente tendencioso é permitido apenas
um intervalo de 1 a 254. Os valores finais de 0 e 255 são usados para indicar valores especiais.
O valor do número representado como acima = +1,1111 × 2ÿ67. O expoente tendencioso é 60. Portanto, o
expoente real deve ser 60 ÿ 127 = ÿ67.
1 11011100 100110010-------------------------------------------------------------0
O valor do número é = ÿ1,10011001 × 293. O expoente tendencioso é 220. Portanto, o expoente real deve
ser 220 ÿ 127 = 93.
A Intel usa os termos 'curto real' e 'longo real' para os dois tipos de representação acima.
Agora vamos listar as etapas usadas para converter um número decimal para os formatos binários para estar em
conformidade com o padrão IEEE.
64 bits
SE M
Bit de sinal
Enviesado Mantissa de 52 bits
Exemplo 13.1
Execute a conversão dos seguintes números decimais, conforme especificado.
i) 230,25 em real curto e
Solução
i) O real curto corresponde ao formato de precisão simples. Faremos a conversão usando as etapas descritas
anteriormente na Seção 13.6.4.
Número: 230,25 Bit de sinal: 0
Representação binária: 11100110.01
Forma normalizada: 1,110011001 × 27
Expoente tendencioso: 7 + 127 = 134 = 10000110
O formato de precisão única é:
0 10000110 11001100100-------------------------------------------0
0100 0011 0110 0110 0100 0000 0000 0000, que é representado na forma hexadecimal como
4 3 6 4 0 0 0.
6 ou seja, 43664000 H é a representação de precisão simples (curto real).
ii) Real longo corresponde ao formato de precisão dupla. Faremos a conversão usando o
etapas descritas na Seção 13.6.4.
Número: ÿ6765.1875
Bit de sinal: 1
Representação binária: 1101001101101.0011 Forma
normalizada: 1.1010011011010011 × 212
Expoente tendencioso: 12 + 1023 = 1035 = 10000001011
63 62………………… 52 51…………………………………………………… 0
1 10000001011 10100110110100110------------------------------------------0
Isso deve ser colocado em 64 bits, que é 1100 0000 1011 1010 0110 1101 0011 0000 0000 0000 0000 0000
0000 0000 0000 0000 Em hex, isso vem a ser.
C0BA 6D30 0000 0000 H.
Agora, consideraremos o ato de converter do formato IEEE para um número decimal. Os passos são:
Exemplo 13.2
Converta o número real curto 42E64000H para um formato decimal.
Solução
i) Número em formato real curto: 0100 0011 0110 0110 0100 0000 0000 0000
ii) Separando o signo, expoente e mantissa
Sinal: 0, Expoente tendencioso: 1000 0110, Parte Mantissa: 110 0110 0100 0000 0000 0000
iii) Remova o viés do expoente:
1000 0110 é 134. Subtraindo 127, é 7,
O expoente é 7.
iv) Número em formato normalizado: 1,110011001 (excluindo todos os zeros extras e adicionando um '1'
antes da vírgula).
O número pode ser escrito como 1,110011001 × 27
Assim, a conversão feita neste exemplo verificou a conversão feita no Exemplo 13.1.
Zero Zero não é representado diretamente no formato reto, devido à suposição de um 1 inicial (seria
necessário especificar uma mantissa zero verdadeira para produzir um valor de zero). Zero é um valor
especial denotado com um campo expoente de zero e um campo de fração de zero. Observe que ÿ0 e +0
são valores distintos, embora ambos se comparem como iguais.
Machine Translated by Google
Operação n Resultado
÷ ± Infinito ± 0
Infinito × 0 NaN
Desnormalizado Se o expoente for todos 0s, mas a fração for diferente de zero (caso contrário, seria interpretada
como zero), então o valor é um número desnormalizado, que não tem um 1 inicial assumido antes do ponto binário.
Assim, isso representa um número (ÿ1)s × 0.f × 2 ÿ126, onde s é o bit de sinal ef é a fração. Para precisão dupla,
os números desnormalizados são da forma (ÿ1)s ×
0.f × 2ÿ1022. A partir disso, você pode interpretar zero como um tipo especial de número desnormalizado.
Infinito Os valores +infinito e –infinito são denotados com um expoente de todos os 1s e uma fração de todos os
0s. O bit de sinal distingue entre infinito negativo e infinito positivo. Ser capaz de denotar infinito como um valor
específico é útil porque permite que as operações continuem após situações de transbordamento. As operações
com valores infinitos são bem definidas no formato de ponto flutuante IEEE.
Not a Number O valor NaN (Not a Number) é usado para representar um valor que não representa um número
real. NaN's são representados por um padrão de bits com um expoente de todos os 1s e uma fração diferente de
zero. Existem duas categorias de NaN: QNaN (Quiet NaN) e SNaN (Signalling NaN).
Um QNaN é um NaN com o conjunto de bits de fração mais significativo. QNaNs propagam-se livremente
através da maioria das operações aritméticas. Esses valores saltam de uma operação quando o resultado não é
definido matematicamente. Um SNaN é um NaN com o bit de fração mais significativo limpo. É usado para sinalizar
uma exceção quando usado em operações. SNaNs podem ser úteis para atribuir variáveis não inicializadas para
interceptar o uso prematuro. Semanticamente, QNaNs denotam operações indeterminadas, enquanto SNaNs
denotam operações inválidas.
Operações Especiais As operações em números especiais são bem definidas pelo IEEE. No caso mais simples,
qualquer operação com NaN produz um resultado NaN. Outras operações são as mencionadas na Tabela 13.5.
Agora que discutimos brevemente o formato IEEE, voltemos ao nosso estudo das características do 8087. O
coprocessador matemático 8087 possui 68 instruções, para operações matemáticas complexas, incluindo funções
logarítmicas, aritméticas, exponenciais e trigonométricas. Lembre-se de que o 8086 possui apenas capacidade de
processamento de dados de 8 bits e 16 bits. 8087, por outro lado, possui um tamanho de registro de 80 bytes e
permite o uso dos seguintes formatos numéricos conforme mostrado na Tabela 13.6 e confi rna ao padrão de
ponto flutuante IEEE. Ele pode usar números inteiros, números BCD, precisão simples e dupla
Machine Translated by Google
números reais, bem como um formato 'real temporário' com um comprimento de palavra de 80 bits. Utiliza as diretivas
DW, DD ou REAL4, DQ ou REAL8 e DT ou REAL10 conforme tabela.
Lembre-se da discussão anterior (Seção.13.4.2), que para números reais, um número adicional de bits é usado para
representar o expoente polarizado. Assim, o 'curto real' precisa totalmente de 32 bits, o 'longo real' precisa de 64 bits e o
'real temporário' precisa de 80 bits. Observe também que DD significa 'defi ne double word', DQ para 'defi ne quad word'
e DT para 'defi ne dez bytes'.
Antes de entrarmos nos detalhes completos da arquitetura, valerá a pena entender os truques de programação
usando o coprocessador. Usaremos as instruções do 8087, que é o coprocessador básico, lembrando que os
coprocessadores de ordem superior possuem o mesmo conjunto de instruções mais alguns adicionais – mas os
coprocessadores mais novos são mais rápidos, devido ao avanço da tecnologia. Podemos executar os programas do
coprocessador em um PC, porque todos os PCs geralmente têm um coprocessador, a menos que especificamente
desativado.
No entanto, antes de começarmos a programar, precisamos conhecer a estrutura de registradores e os modos de
endereçamento. Não tentaremos passar pelo conjunto completo de instruções; em vez disso, a técnica será explicada
usando algumas instruções. O conjunto completo de instruções está disponível no Apêndice E.
Então (A × B)/C será calculado multiplicando A e B – este produto temporário estará no formato de 80 bits, e após
a divisão por C, se tiver que ser armazenado na memória no formato de 16 bits, ele será truncado ou arredondado se o
comprimento de palavra permitido para ele for menor. No entanto, o produto intermediário A × B tem um comprimento de
palavra grande, o que melhorará a precisão do resultado final.
Os registradores são rotulados como ST significando topo da pilha. Isso ocorre porque eles operam como uma pilha
de 8 locais. A qualquer momento, um dos registradores é considerado o topo da pilha e este é então designado como
ST(0). Este não é o nome de nenhum registro específico. Apenas indica o topo da pilha.
Machine Translated by Google
79 78 64 63 0
R1
R2
R3
R4
R5
R6
R7
R8
15 0
Registro de Controle
Registro de Status
Palavra de etiqueta
Ponteiro de Instrução
Ponteiro de dados
Na inicialização, um registrador é o topo da pilha (ST(0)). Quaisquer dados carregados posteriormente, irão para este registrador
se nenhum outro destino for especificado. Os próximos dados serão empurrados para o próximo registro, que será então
designado como ST(0). O ST(0) anterior agora se torna ST(1). Assim, os dados quando carregados nos registradores são
empurrados para a pilha. Então, o que acontece quando todos os registros (8 deles) se esgotam? A pilha opera de forma circular,
e os primeiros dados são sobrescritos.
Veja a Fig 13.16 para a forma como esses registradores são usados quando os dados NUM1, NUM2 e NUM3 são
carregados um após o outro (NUM1 sendo carregado primeiro e NUM3 por último). Veja um conjunto de registradores de tags
correspondentes a cada um dos 8 registradores do conjunto. A palavra tag marca o conteúdo de cada registro como mostrado na
Fig 13.17. As palavras de tag podem ser usadas para interpretar o conteúdo dos registradores. A palavra tag (2 bits) indica se o
conteúdo do registrador é válido, zero, especial ou vazio.
79 78 64 63 0
R1
R2
R3
R4
R5
R6
R7
R8
15 0
Registro de Controle
Registro de Status
Palavra de etiqueta
Ponteiro de Instrução
Ponteiro de dados
Na inicialização, um registrador é o topo da pilha (ST(0)). Quaisquer dados carregados posteriormente, irão para este registrador
se nenhum outro destino for especificado. Os próximos dados serão empurrados para o próximo registro, que será então
designado como ST(0). O ST(0) anterior agora se torna ST(1). Assim, os dados quando carregados nos registradores são
empurrados para a pilha. Então, o que acontece quando todos os registros (8 deles) se esgotam? A pilha opera de forma circular,
e os primeiros dados são sobrescritos.
Veja a Fig 13.16 para a forma como esses registradores são usados quando os dados NUM1, NUM2 e NUM3 são
carregados um após o outro (NUM1 sendo carregado primeiro e NUM3 por último). Veja um conjunto de registradores de tags
correspondentes a cada um dos 8 registradores do conjunto. A palavra tag marca o conteúdo de cada registro como mostrado na
Fig 13.17. As palavras de tag podem ser usadas para interpretar o conteúdo dos registradores. A palavra tag (2 bits) indica se o
conteúdo do registrador é válido, zero, especial ou vazio.
(uma) (b)
ST (0) NUM 1 ST (0)
(c) (d)
NUM 2 ST (0) NUM 3 ST (0)
NUM 1 ST (2)
Figura 13.16 | Usando os registradores de uso geral para carregar NUM1, NUM2 e NUM3
15 0
ETIQUETA (7) ETIQUETA (6) ETIQUETA (5) ETIQUETA (4) ETIQUETA (3) ETIQUETA (2) ETIQUETA (1) ETIQUETA (0)
VALORES DE ETIQUETAS
00 = VÁLIDO
01 = ZERO
10 = ESPECIAL
11 = VAZIO
um deles é um registrador enquanto o outro é um local de memória. Quando registradores são usados, existem
formas de endereçamento nas quais ST(0) está implícito e não precisa ser mencionado na instrução.
registro. Como os dados podem estar na forma de inteiro, ponto flutuante ou BCD, a operação de carregamento
tem três variações:
instrução pega um dado real da fonte (memória ou registrador), converte para formato real temporário e
carrega-o em ST(0), o topo da pilha atual . Assim, o destino está implícito.
Agora o registrador abaixo dele é o topo da pilha. As próximas duas instruções na lista acima fazem as
mesmas coisas – a única diferença é que os dados de origem (se estiverem na memória) são um inteiro ou BCD.
Tenha em mente que os dados nos registradores podem estar apenas no 'formato real temporário' (na
instrução, 'I' significa inteiro e 'B' implica dados BCD).
Neste caso, o processador converte do formato real temporário para real curto ou longo, inteiro ou BCD
(conforme o caso) antes de armazenar no destino. A fonte está sempre implícita como sendo o topo da
pilha.
Exemplo 13.3a
O programa a seguir carrega dois números em locais de memória para os registradores. Eles são somados
e a soma é colocada em um terceiro local de memória. Apenas dados inteiros são usados. Assim, o
formato de instrução contém a letra 'I' nele.
.8087
.MODELO PEQUENO
.DADOS
NUM1 DD 09
NUM2 DD 4
NUM3 DD?
.CÓDIGO
.COMECE
FIM ;inicialize o 8087
FILD NUM1 ;carrega o inteiro em NUM1 para ST(0)
FILD NUM2 ;carrega NUM2 para ST(0). Agora ST(1) contém
NUM1
FADD ST(0), ST(1) ;adiciona a soma dos dois registradores em ST(0)
FIST NUM3 ;salva a soma em NUM3
.SAÍDA
FIM
Machine Translated by Google
Exemplo 13.3b
13BD:0017 9B ESPERAR
O Exemplo 13.3b mostra o programa em 13.3a, conforme observado no depurador no modo 'trace'.
Nota A instrução WAIT é adicionada automaticamente. Isso é para sincronizar a operação do coprocessador com
o processador host (consulte a Seção.13.2.1).
Exemplo 13.3c
-d0000
13C0:0000 09 00 00 00 04 00 00 00-0D 00 00 00 00 00
-------------------------------------------------- --------------------------------------------
---------------------------
Nota Os números armazenados estão em negrito. Todos os números estão no formato inteiro.
Exemplo 13.4a
Adicione dois números reais, que estão na memória e armazene o resultado na memória.
Solução
.8087
.MODELO PEQUENO
.DADOS
NUM1 DD 230,25
NUM2 DD 85,27
NUM3 DD?
.CÓDIGO
.COMECE
FIM ;inicialize o 8087
FLD NUM1 ;carrega NUM1 para ST(0)
Machine Translated by Google
FLD NUM2 ;carrega NUM2 para ST(0). Agora ST(1) tem NUM1
FADD ST(0), ST(1) ;adiciona conteúdo de dois registradores
FST NUM3
.SAÍDA
FIM
Exemplo 13.4b
.8087
.MODELO PEQUENO
0000 .DADOS
0000 43664000 NUM1 DD 230,25
0004 42AA8A3D NUM2 DD 85,27
0008 00000000 NUM3 DD?
0000 .CÓDIGO
.COMECE
0017 9B DB E3 FIM
001A 9B D9 06 0000 R FLD NUM1
001F 9B D9 06 0004 R FLD NUM2
0024 9B D8 C1 FADD ST(0), ST(1)
0027 9B D9 16 0008 R FST NUM3
.SAÍDA
FIM
No Exemplo 13.4a, usamos dois números reais curtos, que são somados e a soma encontrada.
O Exemplo 13.4b mostra o arquivo de lista em que são vistas as formas hexadecimais dos dois números.
Usamos os mesmos números decimais do Exemplo 13.1. O arquivo de lista mostra que o número 230,25 foi
convertido em 43664000 H e o número 85,27 em 42AA8A3 DH.
Os dois exemplos de programação destacam o uso das instruções do coprocessador. Para se tornar
proficiente em programação, consulte o Apêndice E e execute vários programas.
| Tais sistemas são amplamente classificados como sistemas fortemente acoplados e fracamente acoplados.
| O processador deve estar no modo máximo, quando os recursos de multiprocessamento devem ser
ativado.
Machine Translated by Google
| Quando o 8086 é usado junto com o processador aritmético 8087, ele é chamado de coprocessador
configuração.
| O 8086 IOP é outro processador que pode ser usado em um sistema junto com o 8086.
| Para grandes sistemas, o multiprocessamento existe na forma de uma configuração estreitamente acoplada.
| Nesses casos, muitos módulos disputarão o barramento e precisarão de alguns protocolos específi cos para resolver o conflito.
| Para grandes sistemas, existe um árbitro de barramento IC 8289 que deve lidar com esses problemas.
| O 8087 é um IC especialmente projetado para lidar com cálculos aritméticos junto com o 8086, em um sistema.
| Para cada processador da família Intel x86, existe um coprocessador aritmético específico.
| Os números de ponto flutuante podem ser representados nos formatos de precisão simples ou precisão dupla.
| MASM pode ser usado para executar programas usando o conjunto de instruções de 8087.
PERGUNTAS
5. Como as conexões dos pinos BUSY-TEST entre um 8086 e um 8087 sincronizam as operações do 8086 e 8087?
6. Como o processamento aritmético se desenvolveu e mudou ao longo dos anos, em relação ao desempenho da Intel
processadores?
7. Por que os processadores de uso geral não estão equipados com instruções aritméticas complexas?
9. Por que é necessário ter um IC árbitro de barramento dedicado em um sistema de multiprocessamento fracamente acoplado?
13. Explique a necessidade de representação especial de números em ponto flutuante e diferencie entre números de precisão
simples e dupla.
14. Por que um viés é adicionado ao expoente na representação do número de ponto flutuante?
15. O que significa o formato real temporário e por que esse formato tem um tamanho de palavra grande?
EXERCÍCIO
3. Faça o processo inverso de converter do formato de ponto flutuante para o formato decimal para os números
da Questão 2.
80186
– embutido
1 4 microprocessador
Introdução
Agora que fizemos um estudo completo e detalhado do processador 8086, é hora de aprender sobre as
versões de ordem superior da família de microprocessadores x86. Neste e nos próximos dois capítulos,
revisaremos as diferenças e melhorias de cada um deles.
Nosso primeiro caso para estudo é o processador 80186/80188. Em termos de largura de barramento,
eles são semelhantes aos processadores 8086/8088, no sentido de que ambos possuem largura de barramento
interno de 16 bits – mas o 80186 tem largura de barramento externo de 16 bits, enquanto que para o 80188,
é de apenas 8 bits. Ambos têm uma largura de barramento de endereço de 20 bits. Esclarecida esta distinção,
passaremos a falar apenas sobre o 80186.
Com o lançamento do 8086, muitos projetistas de sistemas o usaram no projeto de sistemas embarcados
adicionando temporizadores, controladores de interrupção e controladores DMA em sua placa. Foi esse fato
que fez com que a Intel pensasse em lançar um controlador embutido e o 80186 acabou sendo o chip
resultante. Um processador embutido deve agir como um 'microcontrolador' que é um microprocessador com
muitos periféricos integrados ao chip. Para um microcontrolador, a capacidade de gerenciar dispositivos
periféricos é mais importante do que sua capacidade de computação. Assim, o 80186 não oferece muito mais
capacidade de processamento do que o 8086 (exceto por mais 7 novas instruções e novos tipos de operandos
para três instruções existentes), mas possui vários periféricos integrados no chip. Com exceção dos
componentes integrados, o microprocessador Intel 80186 não é muito diferente do 8086 e, portanto, pode ser
considerado uma versão embarcada do 8086.
Este processador não foi usado em PCs, mas tornou-se bastante popular no mercado de embutidos e
muitas versões diferentes do chip ainda estão disponíveis e em uso. A série 80186 foi geralmente destinada
a sistemas embarcados, ou como microcontroladores com memória externa. Ele inclui recursos como gerador
de clock, controlador de interrupção, temporizadores, gerador de estado de espera, canais DMA e lógica de
seleção de chip – todos eles estão disponíveis no chip.
História e Desenvolvimento
Foi em 1982 que a Intel introduziu a família 80186 de microprocessadores embutidos. Em 1987, foi lançada a segunda geração, ou
seja, 80C186, que era uma versão CMOS com geometria menor e um conjunto de recursos aprimorado, que era compatível com
pinos 80186. Mais tarde, o 80186 EB foi introduzido com um módulo estático e autônomo, conhecido como o núcleo modular 80C186,
no qual os periféricos foram redesenhados com interfaces padrão. O novo 80C186 EB foi o primeiro a usar esta capacidade modular.
A tendência do projeto era reduzir a dissipação de energia, que é um parâmetro chave para um produto embarcado. Outros modelos
do processador são 80C186 XL, 80C186 EA e 80C186 EC. O último modelo possui 14 periféricos on-chip. Consulte a Tabela 14.1.
PUSH
PAPA
• Instruções de string
INS
SAÍDAS
DIGITAR
SAIR
VINCULADO
14.1.1 | PUSH/POPA
PUSHA (Push All) e POPA (Pop All) permitem que todos os registradores de uso geral sejam empurrados e
popados, respectivamente. A ordem de empurrão é AX, CX, DX, BX, SP, BP, SI, DI. O valor do Stack Pointer
(SP) pressionado é o valor do Stack Pointer antes de o registro AX ser pressionado. Quando o POPA é
executado, o valor do Stack Pointer é exibido, mas ignorado. Observe que esta instrução não salva
registradores de segmento (CS, DS, SS, ES), o Ponteiro de Instrução (IP), a Palavra de Status do Processador
ou quaisquer registradores periféricos integrados.
MOV BP, SP
Assim, as variáveis de pilha podem ser acessadas através do registrador BP. A instrução ENTER possui dois
operandos – o número de bytes a serem reservados para variáveis na pilha e o nível de aninhamento do
procedimento. O nível de aninhamento léxico determina o número de ponteiros para quadros de pilha de nível
superior copiados no quadro de pilha atual. Esta lista de ponteiros é chamada de display. A primeira palavra
do display aponta para o quadro de pilha anterior. O display permite o acesso a variáveis de procedimentos
de nível superior (nível de aninhamento lexical inferior). Esta instrução é útil para linguagens de alto nível
estruturadas em blocos que usam níveis de aninhamento para controlar o acesso a variáveis de procedimentos
aninhados anteriormente.
Por exemplo, ENTER 6.0 reserva 6 bytes de armazenamento na pilha e especifica o nível de
aninhamento como 0. Ele deixa BP no topo da pilha e subtrai 6 de SP para permitir 6 bytes de armazenamento.
A instrução LEAVE inverte todas as anteriores. É equivalente às instruções:
MOV SP, BP
PA POP
Machine Translated by Google
i) EMPURRAR IMEDIATAMENTE
PUSH (Push imediato) permite que um argumento imediato, dados, seja empurrado para a pilha. O valor pode
ser um byte ou uma palavra. Os valores de byte são estendidos para o tamanho da palavra antes de serem
enviados.
ii) Para as seguintes instruções de deslocamento e rotação, permite que count seja um operando imediato
a) SHL
b) RAE
c) SHR
d) ROL
e) ROR
f) RCL
g) RCR
Lembre-se que para 8086, precisamos carregar a contagem das operações de deslocamento ou rotação no
registrador CL se não for = 1. Aqui podemos escrever instruções como:
SHL BX, 3
RCLAL, 5 e assim por diante
IMUL (multiplicação imediata inteira, com sinal) permite que um valor seja multiplicado por um operando imediato.
IMUL requer três operandos. O primeiro, destino, é o registro onde será colocado o resultado. O segundo, fonte,
é o endereço efetivo do multiplicador. A origem pode ser o mesmo registrador que o destino, outro registrador ou
um local de memória. O terceiro, data, é um valor imediato usado como multiplicando. O operando de dados
pode ser um byte ou uma palavra. Se os dados são um byte, seu sinal é estendido para 16 bits. Apenas os 16
bits inferiores do resultado são salvos. O resultado deve ser colocado em um registro de uso geral.
Agora, vamos tentar usar algumas dessas instruções em programas. O MASM 6.x permite o uso de todas
as instruções de um processador especificado pelas diretivas, ou seja, .186 / .286 /.386, dependendo das
instruções que estão sendo usadas.
Machine Translated by Google
Exemplo 14.1
O processador é conectado a uma porta de entrada e uma porta de saída, cada uma com apenas 12 linhas
de dados. A porta de entrada (com endereço 0C24H) é conectada às linhas de barramento de dados D3 a
D15, enquanto a porta de saída (com endereço 0C25H) é conectada às linhas de dados D0 a D15. No
entanto, como os dados podem ser lidos e escritos apenas como bytes ou palavras, algum processamento
deve ser feito para remover os dados lidos dos pinos desconectados.
Há três partes no programa. A primeira parte insere 10 palavras de dados, uma após a outra da porta de entrada
usando a instrução INS e isso pressupõe que os dados mudam continuamente e estão disponíveis para leitura. Esses
dados são armazenados no segmento de dados no local TAKE.
A segunda parte do programa pega cada palavra, mascara o nibble mais baixo e o desloca para a direita
em 4 posições. Assim, os dados relevantes estão nas três posições de nibble inferiores e são
armazenados no local GIVE.
A terceira parte do programa usa a instrução OUTS para enviar essa sequência de dados, uma de cada
vez, para o dispositivo de saída.
Solução
.MODELO PEQUENO
.186
.DADOS
TOMAR DW 10 DUP(0)
DAR DW 10 DUP(0)
.CÓDIGO
.COMECE
LEA DI, TAKE ;aponta DI para o destino
MOV DX, 0C24H ;carrega o endereço da porta de entrada no DX
CLD ;limpar sinalizador de direção
MOV CX, 10 ;contagem dos dados
REP INSW ;introduza as palavras string até CX = 0
;as 10 palavras estão disponíveis TAKE
MOV CX, 10 ;contagem dos dados ;aponta
LEA BX, TOME BX para o endereço dos dados ;move a primeira palavra para
TRANS: MOV AX, [BX] AX
E AX, 0FFF0H ;E isso, para mascarar o nibble inferior
SHR AX, 4 ;gire certo
MOV 20[BX], AX ;salvar em locais a 20 bytes de distância
INC BX ;incrementa o ponteiro
INC BX ;incrementa novamente pois os dados são uma palavra
LOOP TRANS ;repete até CX=0
;as 10 palavras válidas estão em GIVE
MOVA SIM, DÁ ;aponta SI para DAR
MOV DX, 0C25H ;carrega o endereço da porta de saída no DX
CLD ;limpa o sinalizador de direção
MOV CX, 10 ;contagem dos dados
REP OUTSW ;exibe as palavras string até CX = 0
.SAÍDA
FIM
Machine Translated by Google
O programa utiliza as novas instruções INS, OUTS e SHR, n. Se a diretiva .186 não for
usada, a mensagem de 'instrução inválida' será obtida.
INT3/INTA1
INT2/INTA0 SAÍDA TMR 1 SAÍDA TMR 0
VCC GND
NMI INT1 TMR EM TMR EM
CLK OUT
1 0
INT0
Temporizadores
Unidade de Execução
programáveis
X1 X2 Registro B2
0 1 Max. Contar
16 bits
RES Programável
VAI
Relógio
REDEFINIR Interromper Máx. Registro
Gerador Controlador
16 bits de Contagem
Em geral A Registros de Controle
Propósito Ao controle Registro de
DRQ0
DRQ1
Chip–Selecionar Programável
S0 - S1
Interface de barramento
Unidade Unidade DMA
0 1
Unidade 20 bits
CORAÇÕES
16 bits Ponteiros de origem
ARDY 20 bits
Segmento
Ponteiros de destino
TESTE
Registros
16 bits
AGUARDE
Contagem de transferência
6 bytes Programável
HLDA
Pré-busca Ao controle Ao controle
Fila Registros Registros
BHE/S7
DESLOCAMENTO
Registro de realocação
FEH
SIM
Descritores DMA Canal 1
DOH
CAH
Descritores DMA Canal 0
COH
A8H
Registros de Controle de Seleção de Chip
AH
66H
Registros de controle do temporizador 2
60H
5EH
Registros de Controle do Temporizador 1
58H
3EH
Registros do Controlador de Interrupção
20H
15 0
O processador fornece lógica de seleção de chip programável (consulte o capítulo 7) para memória e periféricos, e também pode
permitir a geração de estado de espera. Os sinais de seleção de chip tornam-se ativos na respectiva memória ou ciclos de leitura/
gravação de E/S. O número e o particionamento das linhas de seleção de chip dependem do número do modelo do 80186 que
está sendo usado, mas, em geral, as características são as seguintes.
Ele fornece 6 saídas de seleção diferentes para diferentes áreas de memória – memória superior, memória inferior e memória
intermediária. No diagrama de blocos, você pode ver os pinos UCS e LCS . Estes são os
pinos de seleção para a memória superior e inferior, respectivamente. A faixa da área de memória definida como 'superior' e
inferior é programável pelos registradores de controle no bloco de seleção de chip.
Você também pode ver três pinos intitulados MCS , a 0 ÿ3 . Estes são os 4 pinos que selecionam diferentes partes do
memória de médio alcance - novamente, o alcance e o endereço base das porções de memória que usamos para diferentes
aplicações são programáveis. Ele também fornece seleções de chip de periféricos (E/S) para até 7 periféricos. Os pinos que
geram a saída de seleção são as linhas PCS0 ÿ6 .
Em seguida, vamos dar uma olhada nos periféricos internos do processador. Como pode ser visto no
diagrama de blocos, eles são a unidade do temporizador, a unidade DMA e a unidade controladora de interrupção.
Existem três temporizadores programáveis internos de 16 bits. Dois deles têm dois pinos – um é o pino de saída do temporizador,
no qual os sinais gerados podem ser emitidos, o outro é o pino de entrada do temporizador, que é a entrada para ações de
contagem. O terceiro temporizador não está conectado a nenhum pino externo e é útil para codificação em tempo real e aplicações
de atraso de tempo. Além disso, o temporizador pode ser usado como um pré-escalador para os outros dois temporizadores.
O modelo EC do processador possui um temporizador de cão de guarda adicional. Este é um temporizador importante para
aplicativos incorporados onde a intervenção do usuário é impossível. Nesses casos, o temporizador do watch dog é configurado
para funcionar por um determinado período, e no final desse período, ou seja, quando o contador desce até zero, se o sistema
estiver em um estado de travamento ou o programa entrar em um loop infinito, o temporizador do watch dog causa uma
reinicialização do sistema ou ativa uma interrupção. Sob operação normal e correta do sistema, o temporizador do watch dog
nunca faz uma contagem regressiva até zero.
existem duas linhas de interrupção de hardware – uma é mascarável, a outra não. Se mais fontes de interrupção forem esperadas,
um chip externo, ou seja, o Priority Interrupt Controller 8259A é usado para lidar com elas – este chip tem a capacidade de priorizar e
sequenciar as interrupções recebidas, retornar sinais de reconhecimento para os dispositivos de interrupção e também enviar vetores
de interrupção para os processadores.
No 80186, há um controlador de interrupção no chip (interno ao chip) que expande suas capacidades de interrupção. O
diagrama de blocos (Fig 14.1) mostra que ele possui uma entrada NMI e quatro entradas INTR. Apesar de não ser visto no
diagrama de blocos, o controlador de interrupção tem a função de gerenciar as interrupções dos periféricos no chip também.
Machine Translated by Google
DMA DMA
Hora 0 Hora 1 Hora 2 0 1 INT0 INT1 INT2 INT3
Interromper
Prioridade
Resolver
O controlador de interrupção opera em dois modos – o mestre e o escravo. No modo mestre, a unidade de controle de
interrupção controla as interrupções dos periféricos no chip (temporizadores e unidades DMA) e os quatro pinos de interrupção
externos. A unidade sincroniza e prioriza todas as fontes de interrupção e apresenta o vetor de interrupção correto para a
CPU. Sistemas simples precisam usar apenas este modo mestre de operação.
Veja a Fig 14.4 da unidade de controle de interrupção no modo mestre de operação. Ele aceita interrupções dos
periféricos internos, ou seja, os temporizadores e a unidade DMA e os canais para a CPU.
No modo de operação escravo, um 8259A externo controla a interrupção mascarável para a CPU e atua como
controlador de interrupção mestre. A unidade de controle de interrupção processa então apenas as interrupções dos periféricos
no chip. Tal design é usado em grandes sistemas.
Esta seção foi feita para ver os aspectos importantes do chip 80186 – sem entrar em muitos detalhes. Cada um dos
periféricos funciona exatamente como alguns dos chips de interface que vimos anteriormente. A unidade DMA possui todos
os recursos que um controlador DMA dedicado (8237) possui, a unidade de controle de interrupção opera como o 8259 que
vimos no Capítulo 10, e a unidade temporizadora pode ser usada como qualquer unidade presente em um microcontrolador
típico como 8051 e como o chip temporizador dedicado 8254/8253 (Capítulo 10). Assim, podemos reconhecer que as
diferentes versões do 80186 têm um alcance de aplicação muito além do 8086.
Agora, só para ter uma ideia da utilidade do chip, vamos entrar nos detalhes de um dos periféricos internos, ou seja, o
Timer.
Sequência de temporização Qualquer temporizador tem um registro de contagem de 16 bits . Sempre que um evento de
temporização ocorre, o número (contagem) no registrador é incrementado em 1. Assim, em uma sequência contínua de
eventos de temporização, a contagem continua aumentando até que seja igual ao número armazenado em um
Machine Translated by Google
'registro de contagem máxima'. Neste ponto, o registrador de contagem rola para zero. O que foi alcançado é um 'período de atraso'
que depende dos números armazenados no registrador de contagem e no registrador de contagem máxima. O normal é começar com
um conteúdo de zero no registrador de contagem.
Eventos de temporização Um evento de temporização é aquele que faz com que o registrador de contagem incremente sua contagem.
Um temporizador pode contar eventos internos ou externos. Quando ocorre uma transição de baixo para alto nos pinos 'Timer in' dos
temporizadores 0 e 1, seus registros de contagem são incrementados. Isso implica que a fonte de temporização é externa ao
processador – dizemos que os temporizadores 'contam eventos externos'. Esse recurso está disponível apenas para os temporizadores
0 e 1. Observe que no diagrama de blocos (Fig 14.1), apenas os temporizadores 0 e 1 possuem pinos 'TIMER in'. A frequência máxima
permitida para o sinal de contagem externo é limitada a um quarto do CLKOUT do processador 80186. Se nenhum evento externo
precisar ser contado, a fonte de contagem pode ser o clock do processador e seu evento de temporização é então ¼
Frequência CLKOUT ou pode ser pré-escalada pelo Timer 2. O que tudo isso implica pode ser afirmado desta forma: Quando o
evento de tempo é de uma fonte externa, o timer atua como um contador, caso contrário
é um temporizador.
Temporizadores 0 e 1, cada um com um único pino de saída. A saída do Temporizador pode ser um único pulso, indicando o
fim de um ciclo de temporização, ou uma onda de ciclo de trabalho variável. Estas duas opções de saída correspondem ao modo de
contagem máxima única e modo de contagem máxima dupla, respectivamente. As interrupções podem ser geradas no final de cada
ciclo de temporização e podem causar o início de uma 'rotina de serviço de interrupção'.
Os temporizadores 0 e 1 são funcionalmente idênticos. A Figura 14.5 ilustra seu funcionamento. Cada um tem um pino de
entrada sincronizado e travado e um único pino de saída. Cada temporizador pode ser cronometrado internamente ou externamente.
Internamente, o temporizador pode incrementar a ¼ de frequência CLKOUT ou ser pré
dimensionado pelo Timer 2. Um timer que é pré-escalado pelo Timer 2 é incrementado quando o Timer 2 atinge seu valor máximo de
contagem. O temporizador 2 não possui pinos de entrada ou saída e pode ser operado apenas no modo de contagem máxima única.
T0 ENTRADA T1 ENTRADA
Transição Transição
Trava/Sincronizador Trava/Sincronizador
Temporizador 0
Trava de saída
T0
Registros Fora
Contando
Temporizador 1
CPU Elemento
Registros
CPU Interromper
Robusto
Relógio
Maxcount A Maxcount B
Máximo duplo
Modo de contagem
Uma CPU
Maxcount A
Relógio
Máximo único
Modo de contagem
Compare os modos de registro A maneira como o registro de contagem aumenta e compara seu valor com o número no registro
de contagem máxima já foi abordado. Isso ocorre quando o temporizador é usado no 'modo de contagem máxima única' que é
aplicável a todos os três temporizadores. A contagem do cronômetro desde sua contagem inicial (geralmente zero) até sua contagem
máxima (Maxcount Compare A ou B) e redefinindo para zero, define um ciclo de temporização. Um valor Maxcount Compare de 0
(caso especial) implica uma contagem máxima de 65.536. Para o valor Maxcount Compare de 4, o cronômetro conta de 0 a 3 e, em
seguida, redefine para 0, ou seja, tem quatro estados.
No entanto, apenas para os temporizadores 0 e 1, existe outro modo chamado 'modo de contagem máxima dupla'. Observe
na Fig 14.6, os registradores de contagem máxima A e B para os temporizadores 0 e 1. Isso permite a geração de ondas quadradas
assimétricas com muita facilidade. O modus operandi é o seguinte. Nesse modo, Maxcount Compare A e Maxcount Compare B são
usados. O cronômetro conta para o valor contido em Maxcount Compare A, redefine para zero, conta para o valor contido em
Maxcount Compare B e redefine para zero novamente. Este processo pode ser repetido. O uso de ambos os registradores permite
que os temporizadores contem até 131.072. O bit Register In Use (RIU) no registrador Timer Control indica qual registrador Maxcount
Compare está atualmente em uso.
Pinos de saída do temporizador No modo de contagem máxima única, o pino de saída do temporizador fica baixo por um período
de clock da CPU. Isso ocorre quando o valor de contagem é igual ao valor Maxcount Compare A. Se programado para funcionar
continuamente, o temporizador gera pulsos periódicos. Isso precisa que ALT = 1 seja selecionado no registro de controle.
No modo de contagem máxima dupla, o pino de saída do temporizador indica qual registro Maxcount Compare está em uso
no momento. Uma saída baixa indica Maxcount Compare B e uma saída alta indica Maxcount Compare A. Se programado para
funcionar continuamente, uma forma de onda repetitiva pode ser gerada se o modo alternativo (ALT = 1) for selecionado. Assim,
requer apenas que os números corretos sejam carregados nesses dois registradores de comparação para gerar ondas quadradas
de qualquer ciclo de trabalho. Consulte o Exemplo 14.2.
14,5 | Programação
Associados a cada temporizador estão vários registradores que estão no bloco de controle periférico, com endereços (off set na
PCB) conforme mostrado na Fig 14.7.
Os temporizadores 0 e 1 possuem os seguintes registradores:
T0 Comparar A
32H ou 52H
Contagem T0
30H ou 50H
Registradores de Controle – TCON1 e TCON2 São registradores de 16 bits, cujas configurações de bit
permitem escolher as diversas opções disponíveis para a operação do temporizador correspondente. A Fig 14.8
mostra os bits dos registradores de controle para os Temporizadores 0 e 1. A Tabela 14.2 explica a relevância
de cada bit dos registradores.
Para o Timer 2, o Timer Control Register TCON2 tem o formato mostrado na Figura 14.9.
Este tem apenas 5 bits com os significados exatamente os mesmos da Tabela 14.2, o restante dos bits são
marcados como reservados.
Machine Translated by Google
DENTRO Permitir Defina para ativar o temporizador. Este bit só pode ser escrito quando o bit INH está
definido.
INH Inibir Defina para habilitar gravações no bit EN. Desmarque para ignorar gravações no bit
INT Interromper Definido para gerar uma solicitação de interrupção quando o Registrador de
Contagem for igual a um Registrador de Contagem Máximo. Desmarque para desabilitar
solicitações de interrupção.
RIU Registre-se em uso Indica qual registrador de comparação está em uso. Quando definido, o registrador
de comparação atual é Maxcount Compare B; quando claro, é Maxcount Compare
A.
MC Contagem máxima Este bit é definido quando o contador atinge uma contagem máxima.
O bit MC deve ser apagado escrevendo para o Timer Control Register. Isso
não é feito automaticamente. Se MC estiver limpo, o contador não atingiu uma
contagem máxima.
RTG Reacionar Este bit especifica a ação causada por uma transição de baixo para alto na
entrada TMR INx. Defina o RTG para redefinir a contagem; limpe o RTG para habilitar
EXT Relógio externo Configure para usar o relógio externo; claro para usar o relógio interno. Os bits
TUDO Registro de comparação Este bit controla se o temporizador é executado no modo de contagem máxima
alternativo simples ou dupla. Defina para especificar o modo de contagem máxima dupla;
clear para especificar o modo de contagem máxima única.
CONT Modo contínuo Defina para fazer com que o temporizador funcione continuamente. Clear para
desabilitar o contador (limpar o bit EN) após cada sequência de contagem.
Observe que o endereço de cada um dos registradores é calculado somando seu offset correspondente
(Fig. 14.7) ao endereço base da PCB. Aqui o endereço base padrão, na reinicialização, é FF00H.
Exemplo 14.2
;este segmento de programa gera uma onda quadrada de determinada frequência e ciclo de trabalho
no pino de saída do Timer 1.
O Exemplo 14.3 mostra a geração de um pulso baixo de largura especificada, após um atraso especificado.
Assim, funciona como um one-shot. O atraso é especificado no registrador Compare A e a largura do pulso
mono é especificada no registrador Compare B. O cálculo para os valores nos registradores Comparar A e
B são exatamente como no Exemplo 14.3.
Exemplo 14.3
;este programa gera um pulso baixo na saída do Timer 0, após um atraso.
Neste caso, apenas um único pulso é necessário. Portanto, na palavra de controle carregada no registrador TOCON,
o bit CONT (D0) é 0. Portanto, a palavra de controle é 1100 0000 0000 0010, ou seja, C002H.
Quando a contagem máxima é atingida, o bit MC na palavra de controle é definido. Isso pode ser usado como um
indicador do fim do tempo. Para poder iniciar um novo ciclo de temporização, o bit MC deve ser apagado e isso é
feito aqui. Observe que o bit MC está sendo pesquisado para verificar o final de um ciclo de temporização. O
temporizador também pode ser operado no modo de interrupção, onde o ajuste do bit MC pode causar uma
interrupção do temporizador.
Interrupções do temporizador Todos os temporizadores podem gerar solicitações de interrupção internas. Embora todos
os três temporizadores compartilhem uma única solicitação de interrupção para a CPU, cada um tem sua própria localização
de vetor e prioridade interna. O Timer 0 tem a prioridade de interrupção mais alta e o Timer 2 tem a mais baixa. As
interrupções do temporizador são habilitadas ou desabilitadas pelo bit de interrupção (INT) no registrador de controle do temporizador.
Se habilitado, uma interrupção é gerada toda vez que um valor máximo de contagem é atingido. No modo de contagem
máxima dupla, uma interrupção é gerada toda vez que o valor em Maxcount Compare A ou Maxcount Compare B é
atingido.
Conclusão
Com isso, concluímos nossa discussão sobre o 80186. A discussão não é abrangente nem completa. O objetivo do
capítulo é garantir que este processador seja entendido como diferente em muitos aspectos dos outros membros da
família x86. Seu domínio de aplicação é, portanto, muito
Machine Translated by Google
diferente - ele não será encontrado em nenhum PC, novo ou antigo, mas pode ser visto como sendo usado em muitos projetos
incorporados até agora. Para obter um conhecimento abrangente sobre todos os periféricos dentro do chip, você pode consultar o
manual do usuário Intel 80186. Para testar os periféricos, também será necessário um treinador 80186.
| Os processadores 80186/80188 foram desenvolvidos em 1982 como uma solução para a necessidade de um processador
com periféricos embutidos.
| Este processador e suas muitas variantes contêm vários periféricos no chip – como temporizadores, controlador DMA,
controlador de interrupção e assim por diante.
| O 80186 tem algumas novas instruções em comparação com o 8086. Ele também tem novos modos para alguns antigos
instruções.
| Existem três temporizadores, dos quais apenas dois podem ser usados para contar eventos externos.
| Usando os registradores de comparação e registradores de controle, os contadores podem ser usados para gerar pulsos,
ondas quadradas contínuas e similares.
PERGUNTAS
EXERCÍCIO
2. Com relação à lógica de seleção de chip, descubra o que significa memória superior e memória inferior.
3. Escreva programas para gerar formas de onda simétricas de duas frequências diferentes.
o80286e
1 5 80386 processadores
Logo depois, em 1982, a Intel lançou o 80286, que passou a ser usado em PCs que passaram a ser
chamados de PC-AT onde AT significa 'tecnologia avançada'. Isso acabou sendo um grande salto para a Intel e
também para PCs. O PC-AT usava o 80286 como processador e sua tecnologia podia rodar todo o software escrito
para seu antecessor. Poderia ser operado em frequências de 6 MHz, 8 MHz, 10 MHz e 12,5 MHz. O 80286 acabou
sendo uma grande melhoria em relação ao 8086/8088. Podia se gabar de um desempenho, o dobro do 8086. Ele
tinha uma série de recursos que eram inteiramente novos no reino dos processadores.
i) O barramento de dados permaneceu o mesmo em 16 bits (interno e externo), mas não havia necessidade do
barramento de dados/endereço multiplexado, pois foram disponibilizados pinos separados para eles. A
contagem de pinos aumentou para que a embalagem não pudesse mais ser uma embalagem Dual in line
como o 8086. Em vez disso, a embalagem era uma matriz de grau de pinos (PGA).
ii) O barramento de endereços foi aumentado para 24 bits, podendo endereçar 224 bytes ou 16 Mbytes de
memória física.
iii) O tempo de ciclo de memória foi reduzido de 4 ciclos para 2 ciclos o que fez uma melhoria direta no fator
de velocidade. O cálculo dos modos de endereçamento mais complexos (como base + índice) teve
menos penalidade de clock porque foi realizado por um circuito especial. O 8086, seu antecessor, teve
que realizar um cálculo de endereço efetivo na ALU geral, levando muitos ciclos. Além disso, operações
matemáticas complexas (como MUL / DIV) levaram menos ciclos de clock em comparação com o 8086.
iv) A maior mudança e aprimoramento, no entanto, foi na forma da introdução do que foi chamado de 'Modo
de Endereçamento Virtual Protegido (PVAM)'. Vamos tentar entender o que exatamente é isso. Para o
8086, não há 'proteção' fornecida entre usuários ou entre software de sistema e software de aplicativo.
O MS-DOS permitia o acesso de qualquer pessoa a qualquer programa ou hardware por meio do
mecanismo de interrupções. Além disso, não havia facilidade para usar o processador em um ambiente
multitarefa. 80286 reverteu tudo isso – forneceu novos mecanismos e instruções que forneceram
proteção e multitarefa. Além disso, ele poderia usar o conceito de 'memória virtual' em que a memória
vista pelo usuário se torna muito maior do que a memória física real presente. Esta é a essência do
PVAM.
Quando o processador é ligado, ele está no 'modo real', onde se comporta como um 8086 acelerado – ele
tem apenas 20 linhas de endereço ativas e 1 MB de memória física. A partir deste modo, uma instrução
especial o muda para o modo protegido, onde as linhas de endereço ativas passam a ser 24, a memória
física passa a 16 MB e todos os mecanismos de proteção e memória virtual são ativados. Com todas essas
melhorias e mudanças, este processador foi popular por um curto período de tempo, mas uma reclamação
contra ele foi que ele não poderia voltar ao modo real, sem redefini-lo.
Mas foi esse processador que fez a verdadeira mudança na maneira como um computador pode ser
projetado e usado. Os conceitos no modo protegido permitiram que o primeiro sistema operacional baseado
em GUI (interface gráfica do usuário) da Microsoft, ou seja, o Windows 3.1, fosse projetado confortavelmente
para um PC. O design do 80286 foi seguido pela Intel levando a um processador melhor e maior (em termos
de dados e tamanho de endereço) chamado 80386 (1985). Todos os recursos do 80286 foram usados aqui,
e mais recursos foram adicionados também – podemos dizer que os recursos do 80286 são um subconjunto
dos recursos do 80386. Assim, será vantajoso para nós entrar em os detalhes da arquitetura do 80386, que
nos dará toda a sabedoria necessária para entender o '486 e o Pentium que se seguiram muito em breve.
15.2 | O 80386
Em 1985, a Intel lançou o processador 80386 que trazia em si todos os novos recursos que havia introduzido
em seu processador anterior, e também deu um grande salto – que foi a duplicação da largura do barramento
de dados para 32 bits e o aumento do barramento de endereços largura para 32 bits. Assim, a largura da
banda de dados dobrou, e a memória física endereçável passou a ser 232 ou seja, 4 GB. Assim, o 80386 foi
o primeiro processador de 32 bits da Intel. A Intel também fabricou um modelo chamado 80386 SX, que era
um processador de 32 bits internamente, mas tinha uma largura de barramento de dados externo de 16 bits.
No entanto, nossa discussão será sobre o 80386 DX, que é um processador de 32 bits interno e externo.
Quando ligado, o '386 está no modo real com 20 linhas de endereço e capacidade de acessar apenas
1 MB de memória física. A partir desse estado, ele pode ser levado ao modo protegido usando uma instrução
especial, cujos detalhes veremos em breve.
Machine Translated by Google
• O barramento de endereço tem 32 bits de tamanho e, portanto, a capacidade de endereçamento da memória é de 232 ou 4 GB.
• Todos os endereços têm 32 bits e, portanto, os registradores de endereço também têm 32 bits.
• O design '386 superou a maior reclamação contra seu antecessor – este processador pode alternar do modo protegido para o modo
real sem uma reinicialização do hardware.
• O processador possui todos os recursos do PVAM que seu antecessor tinha – além de um
modo de paginação.
Vamos entrar nos detalhes deste processador – primeiro a arquitetura interna e depois os recursos de hardware.
Os registradores EBP, ESI, EDI e ESP são registradores de endereço de 32 bits, pois todos os endereços têm 32 bits de
comprimento. O ponteiro de instrução EIP tem 32 bits, pois cada endereço de memória tem 32 bits. O mesmo é o caso do ponteiro de
pilha que agora é designado como ESP.
Registros Gerais
31 23 15 7 0
EAX AH MACHADO AL
EDX DH DX DL
ECX CH CX CL
EBX BH BX BL
EBP PA
COMO AS E
FOI A PARTIR DE
ESP SP
15 7 0
CS (Segmento de Código)
SS (Segmento de Pilha)
DS (segmento de dados)
Segmento
Registros ES (Segmento de Dados)
FS (Segmento de Dados)
GS (Segmento de Dados)
15 7 0
31 23
BANDEIRAS
31 23 15 7 0
000000000000000 RV N I ODITSZAPC
0 0 0 1
RFT PL FFFFFF F F F
Sinalizador de direção
Ativar interrupção
Sinalizador de armadilha
Sinalizar bandeira
Sinalizador zero
Transporte Auxiliar
Sinalizador de paridade
Carregar bandeira
ii) Um novo e poderoso modo de endereçamento chamado modo de endereçamento de índice escalonado foi
introduzido para o 80386. Neste modo, cada um dos registradores de 32 bits (exceto o ESP) pode ser
usado como um ponteiro que é multiplicado por um fator de escala .
Agora, vamos fazer alguns exercícios de programação usando as novas instruções do 80386.
Nota Este processador possui registradores de 32 bits e, portanto, toda a programação para isso
será feita no MASM32, que é o montador baseado em Windows de 32 bits. A instalação e uso deste
montador estão descritos no Apêndice F disponível online em www.pearsoned.co.in/lylabdas.
Exemplo 15.1
Encontre o endereço efetivo do operando para as seguintes instruções, dado ECX =
233411E2H, EDI = 10008967H e EAX = 78960900H
i) MOV [ECX*2], AX
ii) MOV EBX, [2341H + EDI*4]
iii) MOV BL, [EAX*8]
Solução
Lembre-se que o cálculo do 'endereço efetivo' não precisa do endereço base do segmento.
Dá o off set do operando a partir do endereço base.
i) O endereço efetivo é obtido multiplicando o valor em ECX por 2, o que dá 466823C4H. A palavra
do AX é movida para este endereço (off set).
Machine Translated by Google
ii) O endereço efetivo é obtido multiplicando o valor em EDI por 4 e somando 2341H ou seja, 4002259CH
+ 2341H = 400248DDH. A palavra dupla neste endereço é movida para EBX.
iii) O endereço efetivo é obtido multiplicando o valor em EAX por 8, que é 3C4B04800H. O byte neste
endereço é movido para BL.
Exemplo 15.2
Adicione um conjunto de palavras de 32 bits armazenadas na memória assumindo que o resultado não excederá 64 bits.
Nota Este programa foi executado no MASM 32 e os resultados foram observados usando o depurador
Olly, cujos detalhes estão disponíveis no Apêndice F.
.386
.MODELO FLAT, STDCALL
.CÓDIGO
Aqui, depois de adicionar os cinco dados de 32 bits armazenados em locais a partir de DATS, a soma é
8C3F 2586H que está em EAX. Observe que para a instrução ADD EAX, [DATS + EBX*4], o fator de
escala usado é 4. Isso ocorre porque os dados têm 4 bytes de comprimento e, portanto, o endereço de
cada dado é deslocado do próximo dado em 4.
Se o problema fosse adicionar palavras (2 bytes), teríamos usado um fator de escala de 2.
Assim, o modo de endereçamento escalonado é útil para adicionar tabelas armazenadas na memória, quando o
conteúdo das tabelas tem 2 ou 4 bytes de comprimento.
Exemplo 15.3
.386
.MODELO FLAT, STDCALL
.CÓDIGO
DATS DW 0560H
Essas instruções varrem uma palavra ou palavra dupla em busca de um bit '1' e armazenam o índice do primeiro bit
definido em um registrador. A cadeia de bits que está sendo varrida pode estar em um registrador ou na memória. O
sinalizador ZF é definido se a palavra inteira for zero (nenhum bit definido é encontrado); ZF é apagado se um bit '1' for
encontrado. Se nenhum bit definido for encontrado, o valor do registrador de destino é indefinido.
BSF (Bit Scan Forward) Esta instrução varre da ordem inferior para a ordem superior (começando do índice de bits
zero)
BSR (Bit Scan Reverse) Esta instrução varre da ordem superior para a ordem inferior (começando do índice de bit
15 de uma palavra ou índice 31 de uma palavra dupla).
Exemplo 15.4
.386
.MODELO FLAT, STDCALL
.CÓDIGO
DATS DW 0560H
Exemplo 15.5
.386
.MODELO FLAT, STDCALL
.CÓDIGO
DAT1 DW ÿ269
DAT2 DB 56
DAT3 DB - 123
No Exemplo 15.5, os números são expressos no formato decimal. No formato hexadecimal, são
DAT1 = FEF3H
DAT2 = 38H
DAT3 = 85H
Nota O primeiro número é armazenado como uma palavra e os próximos dois são armazenados como bytes. O
resultado de cada uma das operações é mostrado no campo de comentários do programa.
Pin Grade Array Um pin grid array (PGA) refere-se à disposição dos pinos na embalagem do circuito
integrado. Em um PGA, os pinos são dispostos em uma matriz quadrada que pode ou não cobrir o fundo
da embalagem. Os PGAs são usados principalmente em aplicativos que exigem mais pinos do que os
pacotes mais antigos, como o pacote dual-in-line (DIP), fornecem. A Fig. 15.4 mostra um PGA.
Machine Translated by Google
Barramento de endereços
Relógio
A2–A31
BE3
dados de 32 bits
D0–D31 BE2
32 bits Endereço
Banco
BE1
Permitir
PUBLICIDADES
BE0
ESTE
0 D/C
PRONTO
Ciclo de ônibus
3 MINHA
Definição
8 TRANCAR
AGUARDE
Arbitragem de ônibus 6
HLDA
Perec
Ocupado Coprocessador
Erro Sinal
DENTRO
NMI
VCC
Interrupções
REDEFINIR
GND Poder
Barramento de dados O barramento de dados tem largura de 32 bits e é designado como D0 a D31. Não é multiplexado,
como no 8086, e carrega apenas dados. Como os dados podem ser usados como 8, 16 e 32 bits, o barramento de dados é
agrupado em quatro combinações de 8 bits e o acesso a cada uma dessas combinações é selecionado por um sinal de
habilitação separado para os bancos de memória/IO do sistema.
Barramento de endereços O endereço do processador tem 32 bits de largura, mas as linhas de endereço dedicadas são
apenas A2 a A31 , ou seja, 30 linhas. As linhas de endereço A0 a A1 estão ausentes, mas são codificadas como quatro
sinais de habilitação de barramento BE0 a BE3 (ativo baixo) que habilitam separadamente quatro bancos de memória. Cada
banco de memória possui uma largura de barramento de dados de 8 bits e os dados nos bancos podem ser acessados pela
ativação seletiva dos bancos. Consulte a Figura 15.5.
Existem quatro sinais de habilitação de banco BE0 a BE3. Eles são habilitados seletivamente dependendo dos bancos
que contêm o byte de dados, palavra ou palavra dupla. Se uma palavra dupla tiver que ser lida, todos os quatro sinais de
habilitação de banco devem ser ativados.
Exemplo 15.6
Para acessar uma palavra, dado o endereço físico como FFFF FFFCH, quais bancos devem ser habilitados e qual deve ser
o status dos sinais de habilitação do barramento?
Solução
Para ler uma palavra, dois bytes devem ser obtidos, ou seja, dois bancos devem estar habilitados. O endereço especificado
e o próximo endereço serão ativados.
FFFF FFFCH e FFFF FFFDH. Esses endereços estão no Banco 0 e no Banco1. Portanto, os sinais de habilitação do
banco correspondente devem ser reduzidos. Assim, BE0 e BE1 devem ser baixos e BE2 e BE3 devem ser altos (endereços
com os dois bits mais baixos 00 serão do banco 0, com 01 no banco 1, 10 no banco 2 e 11 no banco 3).
1G × 8 1G × 8 1G × 8 1G × 8
16 bits 16 bits
32 bits
D/C (Dados/Controle) O sinal alto indica que o barramento de dados contém dados para memória ou E/S. O status baixo
deste pino indica que o processador está parado ou está executando um ciclo de reconhecimento de interrupção.
Controle de barramento Esses sinais são usados para circuitos de controle de barramento eficientes.
ADS: Address Data Strobe: Este sinal se torna ativo sempre que o processador emite uma memória válida ou endereço
de E/S.
NA: Próximo endereço: Este sinal faz com que o processador emita o endereço da próxima instrução ou dados no próprio
ciclo de barramento atual. Th é usado para pipelining de endereço.
B16: O tamanho do barramento 16 seleciona um barramento de dados de 32 bits (B16 = 1) ou um barramento de dados de 16 bits (B16 = 0).
Pinos do Coprocessador São pinos que recebem sinais do coprocessador, que é externo ao 80386. O 80387 é um
coprocessador compatível operando de forma semelhante ao 8087 (coprocessador aritmético) discutido no Capítulo 13.
PEREQ: A solicitação do coprocessador é uma solicitação de um coprocessador ao 80386 para liberar o controle do
barramento para que o coprocessador 80387 obtenha uma conexão direta.
BUSY: Esta é uma conexão direta entre o 80386 e o coprocessador, que indica que o coprocessador está ocupado. Este
sinal é usado pela instrução WAIT para esperar até que o coprocessador termine sua tarefa.
Clock Th fornece o tempo para o processador. A freqüência do sistema é metade da freqüência do relógio conectado a
este pino. Para que a frequência do sistema seja de 33 MHz, a frequência a ser dada ao pino deve ser de 66 MHz. Não há
gerador de clock interno – portanto, um chip de clock externo deve ser usado.
Reset Th é um sinal de entrada sensível de alto nível. Quando resetado, o controle vai para a localização FFFF FFF0H. O
processador acorda no modo real e os 12 bits superiores do endereço permanecem altos até que um salto distante seja
executado. Este pino está incluído na lista de pinos de interrupção, pois a reinicialização possui um vetor pré-definido para
o qual o controle é ramificado.
Os outros pinos mostrados na Fig 15.4 têm as mesmas funções que têm no 8086 e foram discutidos no Capítulo 6.
A principal característica do modo real é que ele tem acesso apenas a 1 MB de memória física, e o cálculo do
endereço é feito como no 8086, com o endereço base sendo adicionado diretamente ao off set. O conjunto de registradores
disponível no modo de endereço real inclui todos os registradores definidos para o 8086 mais os novos registradores
introduzidos pelo 80386 ou seja, FS, GS, registradores de depuração, registradores de controle e registradores de teste.
Machine Translated by Google
Quando o processador é resetado ou após ser ligado, ele está no modo real, sendo o vetor de reset o endereço
FFFF FFF0H. Os 12 bits de endereço superiores permanecem altos até que uma chamada ou salto FAR seja
executado. A primeira instrução JMP ou CALL distante faz com que A31-A20 caia para baixo e assim o 80386 pode
executar instruções no megabyte inferior de memória física (00000 a FFFFFH). Essa redução automática das linhas
de endereço A31-A20 permite que os projetistas de sistemas usem uma ROM na extremidade superior do espaço
de endereço (de 1 MB) para inicializar o sistema. A primeira instrução tem um endereço na parte superior da
memória física de 1 MB e que normalmente é ROM – assim o processador continua no modo real, trabalhando
dentro da memória física de 1 MB.
Discutiremos agora os recursos de modo protegido do processador, começando com o gerenciamento de
memória. Antes de fazermos isso, é necessário entender um conceito muito importante sobre memória.
Principal Secundário
CPU
Memória Memória
Caso não seja encontrado lá, deve ser trazido a partir do disco rígido. Isso leva uma pequena quantidade de
tempo. Esta é a razão pela qual achamos nosso computador 'lento' se o tamanho da RAM for baixo.
No entanto, mesmo que a RAM seja de grande capacidade, não é necessário que nossos arquivos de
aplicativos estejam presentes lá. Gerenciar o sistema de forma que os arquivos importantes sejam encontrados
na memória principal na maioria das vezes faz parte da 'esperteza' do sistema operacional.
Isso significa que o processador '386 faz tudo isso? Definitivamente não, mas o processador fornece
hardware extra, instruções extras e uma 'unidade de gerenciamento de memória' inteligente que permite que o
sistema operacional lide com muitas dessas tarefas com eficiência.
iii) Multitarefa
iv) Exceções e Interrupções
Apesar de discutirmos cada um deles separadamente, eles não são realmente desarticulados – por exemplo,
a proteção faz parte do gerenciamento de memória; gerenciamento de memória e proteção devem ser levados
em consideração quando a multitarefa é feita, e assim por diante.
Seletor
Essas traduções são realizadas de uma forma que não é visível para os programadores de aplicativos. O 80386
tem segmentação e paginação. Se ambos os esquemas estiverem ativos, o endereço lógico fornecido pelo
programa é convertido em um endereço linear pelo hardware de tradução de endereços da unidade de
segmentação. Este endereço linear é interpretado como um endereço de página e dado à unidade de paging
que o converte em um endereço físico. Mas a paginação pode ser desligada por certas configurações de
registro. Nesse caso, apenas a segmentação é efetiva e, em seguida, o endereço lógico é convertido
diretamente em um endereço físico. Vamos lidar com 'segmentação' e 'paginação' separadamente.
15.7.1 | Segmentação
Uma instrução típica pode ser
MOVE EAX, CUSTO
Qualquer local que deva ser acessado estará em um segmento específico. Um segmento pode ser de
diferentes tipos e também possui muitos atributos. Tudo isso é reunido no que se chama de 'descritor' do
segmento. Assim, qualquer segmento possui um descritor, que fornece todas as informações sobre o segmento,
ou seja, descreve o segmento. Veja na Figura 15.9 a estrutura de um descritor típico de um segmento de dados/
código usado em um programa aplicativo. (Para um segmento de sistema operacional, alguns bits do descritor
serão diferentes deste.)
Um descritor é uma entidade de 8 bytes (numerada de 0 a 7) que descreve o segmento apontado por ele.
Vamos ver o conteúdo do descritor na Fig 15.9
i) Contém o endereço base de 32 bits do segmento específico. Este endereço é obtido como o
concatenação dos bytes 2, 3, 4 e 7 do descritor.
32 0
Desvio + Operando
Selecionado
Segmento
32 0
Base
UMA
Limite
Base (B31–B24) GD 0 DENTRO
6
(L19–L16)
eu
Base (B15–B0) 2
Limite (L15-L0) 0
15 0
ii) Os bytes 0, 1 e 4 bits do byte 6 constituem o limite do segmento. Este é um número de 20 bits e
especifica a extensão máxima do segmento. Existem dois casos para o limite e isso é decidido pelo
bit G (granularidade) do byte 6. Se G = 0, impõe um limite máximo de 64 K para o tamanho do
segmento. Então os bits limite L16 a L19 devem ser tomados como zeros, e os bits L0
a L15 dão o tamanho deste segmento em particular. Lembre-se que com 16 bits, o tamanho máximo
do segmento é 64 K.
Mas se o bit G = 1, o número L0 a L19 deve ser um múltiplo de 4 K (212). Assim, o tamanho máximo
possível de um segmento é 220 × 212 = 232 = 4 GB. É assim que o tamanho máximo de um segmento
no modo protegido se torna 4 GB. No descritor, o número correspondente ao limite, dá o tamanho
deste segmento específico.
iii) O byte 5 do descritor é chamado de byte de acesso. Contém os bits que especificam o tipo e os direitos
de acesso ao segmento apontado por este descritor.
Os vários bits no byte de acesso significam o seguinte. Consulte a Fig. 15.10.
Bit 0 A: Acessado O bit é definido quando o segmento correspondente é acessado. O sistema operacional
testa esse bit periodicamente para descobrir a frequência de uso desse segmento – isso é necessário para
algoritmos que precisam ter uma medida da 'importância' desse segmento, ou seja, se este for um
segmento acessado com muita freqüência, é melhor mantê-lo na memória principal.
Bit 4 S: Segmento indica que este é um descritor de segmento de dados ou código para um programa
aplicativo (S = 1), ou é um descritor de segmento do sistema (S = 0).
Bit 3: Executável E Este bit indica se o segmento é executável (E = 1), ou seja, segmento de código, ou
não executável (E = 0), ou seja, segmento de dados.
Bits 1, 2: Tipo O valor do tipo depende do bit E (bit 3 do byte de acesso) e as definições correspondentes
são dadas na Tabela 15.2.
Bits 5, 6 DPL Este é um campo de dois bits que significa 'nível de privilégio do descritor' e faz parte do
'mecanismo de proteção' que discutiremos com mais detalhes na Seção 15.10.
Bit 7 P: Bit Presente A configuração deste bit mostra que o segmento correspondente a este descritor
está agora presente na memória principal. Se P = 0, significa que o correspondente
Machine Translated by Google
P DPL S E XR/WA
7 0
segmento não está na memória principal. Assim, é gerada uma interrupção do tipo 11 que inicia um ISR para trazer o
segmento para a memória principal.
Byte 6 Quatro bits são usados como parte do campo limite. O byte 6 tem quatro bits além dos bits limite
G: Granularidade Th é bit (discutido anteriormente) decide se o campo limite deve ser multiplicado por 1 ou 4 K. Se G = 0, o
multiplicador é 1. Se G = 1, o multiplicador é 4 K.
D Seleciona o modo de instrução padrão para descritores de segmento de código. Se D = 0, os registradores e a memória
têm 16 bits de largura como no 80286; se D = 1, eles têm 32 bits de largura como no 80386.
AVL Th é bit pode ser usado pelo sistema operacional da maneira que precisar. Muitas vezes é usado simplesmente para
especificar que o segmento descrito está disponível. O bit 5 do byte 6 deve ser 0.
Limite
Base (B31–B24) G00 0 6
(L19–L16)
Base (B15–B0) 2
Limite (L15-L0) 0
15 0
Em qualquer sistema, haverá vários segmentos de vários tipos criados para várias aplicações – portanto,
deve haver tantos descritores também. Esses descritores são armazenados em tabelas chamadas 'tabelas de
descritores'. Existem dois tipos de tabelas de descritores – a tabela de descritores local e a tabela de descritores
global.
LDT GDT
D–1 D–1
70 0 7
Se uma tarefa de aplicativo estiver em execução, o descritor do LDT dessa tarefa estará disponível no Registro
da Tabela de Descritores Local (LDTR). Em breve, obteremos os detalhes de todos os registradores de processador
envolvidos no mecanismo de tradução de endereços.
15.7.4 | Seletor
Lembre-se que qualquer endereço lógico para o 8086 pode ser especificado na forma
Endereço base do segmento: Off set
Para o modo protegido 80386, o formato de qualquer endereço lógico é modificado para ser
Seletor de segmento: Off set
O off set tem 32 bits como mencionado anteriormente, mas o seletor tem apenas 16 bits e tem a estrutura
mostrada na Figura 15.13. Ele contém um número de 13 bits chamado índice. Este número é um indicador de onde
na tabela de descritores está localizado o descritor do segmento específico.
Assim, para cada descritor, o seletor é um ponteiro para sua posição na tabela de descritores. Como o índice tem 13
bits, o número de descritores para os quais ele pode apontar é 213 , ou seja, 8192, isso significa que qualquer tabela
de descritores pode ter 8192 descritores armazenados nela.
No seletor, há um bit chamado TI que significa 'Indicador de Tabela'. Isso indica
se o seletor corresponde a um descritor no LDT (TI = 1) ou no GDT (TI = 0).
RPL Th é um campo de dois bits 'Requested Privilege Level' que faz parte do mecanismo de proteção, que será
discutido em detalhes na Seção 15.10.4. O valor do seletor é fixado pelo software vinculador ou carregador.
Registros para tradução de endereços Para entender o conceito de tradução de endereços no modo protegido,
devemos ter uma ideia clara dos registros que estão envolvidos nisso. Correspondendo ao tipo de segmento em uso,
existem os registradores de segmento conforme mostrado na Fig. 15.14. Cada registrador de segmento possui uma
parte visível de dois bytes (16 bits) e uma parte oculta de 8 bytes na qual o descritor correspondente é carregado,
quando o segmento correspondente está sendo acessado.
Agora, vamos considerar um caso simples de tradução de endereços. Observe os seguintes pontos.
O GDT e o LDT são, como mencionado anteriormente, arrays ou segmentos de memória. Então eles também têm
descritores.
Machine Translated by Google
15 210
Segmento
Registros Parte oculta de 8 bytes (descritor)
CS Seletor
Seletor SS
DS Seletor
Seletor PT
Seletor FS
Seletor GS
Seletor TR
LDTR
Seletor
GDTR
IDTR
31 Registro de Controle 0
CR0 RSU
CR1
CR2
CR3
O GDT contém os descritores dos segmentos usados nos programas do sistema – existe
apenas um GDT para todo o sistema. Como tal, não há seletor para o GDT. Na inicialização, o
descritor do GDT será carregado no GDTR. Uma vez configurado, o sistema pode começar a
executar as tarefas do aplicativo. A Fig 15.15 mostra o descritor de um GDT carregado no GDTR.
Observe que o GDT pode conter no máximo 8192 descritores e o campo limite indica o
tamanho do GDT (aqui, um GDT de tamanho máximo é mostrado).
Existem tantos LDTs quantas tarefas no sistema. Os descritores de todos os LDTs estão
no GDT. Quando uma tarefa de aplicativo é executada, o seletor de seu LDT será carregado no
Machine Translated by Google
D-8191
D-1
D-0
a parte visível do LDTR e, em seguida, o descritor correspondente é retirado do GDT e carregado na parte
oculta do LDTR. É então que essa tarefa se torna ativa. (Quando esta tarefa é abandonada e uma nova é
retomada, o conteúdo do LDTR será alterado para favorecer a nova tarefa).
Esta instrução precisa de um operando de um segmento de dados para ser movido para o registrador de 32
bits EAX. O segmento possui um descritor e um seletor criado pelo software do sistema. Os dados
necessários têm um valor deslocado marcado como COST que corresponde a, digamos, 0012 5674H.
Olhando para a Figura 15.16, tente seguir os passos descritos abaixo. As etapas para acessar os dados são:
i) Por se tratar de um segmento de dados a ser acessado, o seletor do segmento de dados será carregado
na parte visível do registrador DS, ou seja, na parte do registrador de segmento. O seletor contém um
número de 13 bits – o índice. Isso é multiplicado por 8 e adicionado ao endereço base da tabela de
descritores (GDT ou LDT, dependendo do valor do bit TI no seletor).
ii) Observe que o endereço base da tabela de descritores está disponível no registrador GDT (GDTR), ou
registrador LDT (LDTR) do processador. Assim, o descritor do segmento de dados é obtido da tabela
de descritores, e este é carregado na parte oculta do registrador DS.
Como um programa aplicativo é considerado aqui, o descritor do segmento de dados será obtido do
LDT da tarefa do aplicativo.
iii) O descritor do segmento de dados possui o endereço base do segmento de dados. Th é usado para
localizar o segmento de dados. Este é o endereço base mais o off set mencionado na instrução, ou
seja, 0012 5674H (com label COST) são adicionados para obter o endereço físico do operando, que é
então movido para o registrador EAX.
A explicação acima deve ser suficiente para entender a tradução de um endereço lógico especificado na
instrução para um endereço físico na memória, no caso de segmentação.
Machine Translated by Google
Seletor Desvio
Endereçado
Dados
+
Segmento
Visível Registro
15 0 Parte oculta
Segmento
RPL GDT
Base
ou LDT
T1
Segmento de dados
em memória
×8
Descritor (carregado
na parte oculta do
registrador de segmento)
GDTR
Base do
ou
LDT/GDT
LDTR
Fisica
Memória
(26 × 240 = 64 TB). Assim, o espaço de endereço lógico ou virtual é de 64 TB, que é muito maior do que a memória física
real de 4 GB.
Esse cálculo deixa clara a ideia de como o conceito de memória virtual cria um tamanho de memória ampliado. O
mecanismo de tradução de endereços discutido acima tem a função de mapear esse grande espaço de memória virtual
para uma memória física muito menor. Os programadores de aplicativos não precisam conhecer os detalhes desse
mapeamento.
Na verdade, o usuário geralmente pensa que a memória disponível para ele é infinita.
Essa ilusão é criada por ter uma memória secundária e transportar dados entre as memórias principal e secundária de
acordo com as necessidades do usuário. Esse mecanismo subjacente não é da conta do usuário – o SO tem o dever de
realizar essa tarefa com eficiência.
15.9.1 | paginação
O mecanismo de paginação é, em muitos aspectos, semelhante à segmentação – no entanto, um pedaço menor de
memória é tratado neste caso. Lembre-se de que um segmento pode ter tamanho variável com tamanho físico máximo
de 4 GB, mas o tamanho de uma página é fixado em 4 KB. Este tamanho pequeno é o que torna a paginação tão atraente.
Assim como na segmentação, sempre que queremos executar um aplicativo, esperamos que a página necessária
esteja na memória principal – caso contrário, ela deve ser trazida para a memória principal. O charme da paginação é que
ela permite que apenas uma página (ou seja, apenas 4 K) seja trazida (ou trocada, se necessário). Em contraste, a
segmentação requer que todo o segmento seja tratado.
A paginação não é um conceito novo, mas o 80286 não permitia paginação – o '386 permite paginação e
segmentação – o que implica que qualquer segmento pode ser considerado composto por um número de páginas e
tratado como um segmento ou como um número de páginas. páginas separadas. Isso é bastante lógico porque sabemos
que às vezes podemos precisar apenas de uma parte do segmento de dados/código disponível para um aplicativo.
i) Um campo de 10 bits chamado DIR que aponta para um descritor de página em um diretório de página.
ii) Um campo PAGE de 10 bits que é usado como um índice na tabela de páginas determinada pela página
diretório.
iii) Um off set de 12 bits que aponta para o byte requerido dentro da página localizada.
31 22 21 12 11 0
VOCÊS
Página Desvio
31 22 12 0 Quadro de página
VOCÊS
Página Desvio
Memória
Entrada PG TBL
Entrada DIR
CR3
Uma página ou quadro de página, como pode ser referido, é uma unidade de 4 K-bytes de endereços contíguos de memória
física. Veja a Fig 15.18 para entender os dois níveis de tradução de endereços na paginação. Observe que o endereço base
do diretório da página atual deve estar no registro CR3.
Este registrador está no processador e também é chamado de Page Directory Base Register (PDBR).
O diretório de páginas contém descritores de página, que são semelhantes aos descritores de segmento, exceto que são
entradas de 4 bytes, ou seja, 32 bits de comprimento. Assim, o diretório de páginas contém os descritores para tabelas de
páginas. Uma tabela de páginas também é uma página (4 K de tamanho) – portanto, possui um descritor de 4 bytes que
está no diretório da página.
No primeiro nível de tradução de endereço, os bits do campo DIR do endereço linear são usados como índice para
localizar um descritor de página no diretório de página atual. Isso conterá, entre outras coisas, o endereço base de uma
tabela de páginas. No próximo nível de tradução, o campo PAGE do endereço linear é usado como índice para localizar
uma entrada na tabela de páginas. Esta entrada contém o endereço da página requerida na memória física. Adicionando o
campo OFFSET (no endereço linear) a este endereço, fornece o endereço físico dos dados necessários. Observe que este
é um mecanismo de tradução de endereços de dois níveis e os dois níveis são semelhantes. No primeiro nível, um diretório
de páginas é acessado e, no segundo, uma tabela de páginas é acessada. Tanto o diretório de páginas quanto a tabela de
páginas são páginas de 4 K-bytes.
Agora, para ter uma ideia da quantidade de memória endereçável com paginação, vamos fazer um pouco de cálculo.
Volte para o formato do endereço linear. Como o campo DIR é de 10 bits
longas, tabelas de páginas de 210 ou 1 K são possíveis. Cada entrada na tabela de páginas é indexada pelo campo PAGE
de 10 bits do endereço virtual – portanto, possui 210 entradas de descritores de página – o que significa que 210 páginas
podem
ouser endereçadas.
4 GB, Cada página
que é a memória pode conter
física completa 212 (4 K) bytes.
do processador 80386Assim, a memória
(e também total é 210
o tamanho × 210
máximo de×um
212segmento
= 232 bytes
no
modo protegido).
A Fig 15.19 mostra o formato de uma entrada da tabela de páginas. Vamos discutir o seu conteúdo.
Endereço do quadro da página O endereço do quadro da página especifica o endereço físico inicial de uma página.
Como as páginas estão localizadas em limites de 4 K, os 12 bits de ordem inferior são sempre zero. Em uma página
Machine Translated by Google
31 12 11 0
DENTRO R
Aproveitar 00E00 / / P
Endereço do quadro de página 31...12
S Dentro
P - Presente
R/W – Leitura/Gravação
EUA - Usuário/Supervisor
D - Sujo
Avail – Disponível para uso do programador de sistemas
diretório, o endereço do quadro de página é o endereço base de uma tabela de página. Em uma tabela de página de
segundo nível, o endereço do quadro de página é o endereço da página que contém o operando de memória desejado.
P bit Th is bit tem a mesma função que o bit P na segmentação, ou seja, P = 1, indica um acesso de página válido. P =
0 indica que esta página não está na memória física e, portanto, gera uma exceção que inicia um ISR para trazer a
página para a memória física.
D Dirty é indefinido para o diretório de páginas, mas usado na tabela de páginas. Significa que a página foi modificada.
A Acessado é definido como 1, sempre que o diretório da página é acessado. Certos bits são deixados em 0, o que
indica reservado pela Intel.
Fisica
32 entradas
Memória
Tradução Combine
Linear
Encadernação de bloqueio
Endereço
Amortecedor
Incompatibilidade
31 0
Página Página
Mesa
Diretório
15 0 31 0
Seletor Desvio
Lógico
Tabela de Descritores Endereço
Segmento +
Descritor
Quadro de página
Linear
Endereço VOCÊS
Página Desvio
Fisica
Endereço
Diretório de páginas
Tabela de páginas
CR3
Quando o 80386 é usado para executar software projetado para arquiteturas que não possuem segmentos, pode
ser conveniente 'desligar' efetivamente os recursos de segmentação do 80386.
O 80386 não possui um modo que desabilite a segmentação, mas o mesmo efeito pode ser obtido carregando os
registradores de segmento com seletores para descritores que possuem endereços base 0, e definindo os limites para
permitir o acesso a todo o 32 bits espaço de endereçamento. Feito isso, não há mais a necessidade de alterar os
registradores de segmento. Os off-sets de 32 bits usados pelas instruções 80386, em modo protegido, são suficientes
para acessar todo o espaço de endereçamento linear. Este é chamado de modelo 'flat'. Em um modelo 'plano' de
organização de memória, o programador de aplicativos vê um único array de até 232 (4 GB) bytes.
15.10 | Proteção
Na seção anterior, você viu a palavra 'proteção' sendo usada sem que lhe dissessem exatamente o que é e como é
alcançada. Portanto, a primeira coisa a ser feita nesta seção é ter uma ideia clara da palavra 'proteção', na forma
como ela é usada no modo de endereçamento virtual protegido de 80386. Existem muitos aspectos para proteção
neste contexto .
Proteção entre tarefas Um sistema pode ter várias tarefas, algumas das quais estão ativas e outras não. Um requisito
é proteger as tarefas do usuário umas das outras – isso significa que o código e os dados de um usuário devem ser
isolados de todos os outros usuários – uma vez que o código e os dados estão em segmentos, isso implica que os
segmentos de uma tarefa não devem ter acesso a os segmentos de outras tarefas do usuário. Essa proteção é
implementada com LDTs separados para cada tarefa. Os descritores dos segmentos de cada tarefa são mantidos em
tabelas de descritores locais separadas. De cada vez, apenas uma tarefa de usuário está ativa e apenas um LDT pode
ser usado.
Proteção entre o usuário e as tarefas do sistema Os programas do sistema, ou seja, as tarefas associadas ao
sistema operacional, gerenciam o sistema do computador como um todo. Assim, essas tarefas são muito importantes
e não devem ser pisoteadas pelos usuários, ou seja, tarefas de aplicativos. Isso é alcançado pelo conceito de níveis
de privilégio. As tarefas do sistema recebem um nível de privilégio alto, enquanto as tarefas do usuário estão em um
nível de privilégio mais baixo – e o acesso direto de segmentos de uma tarefa de nível de privilégio mais alto não é
permitido. Assim, as tarefas do usuário são impedidas de acessar os segmentos no nível do sistema.
Capturando Erros de Violação de Endereço Esse aspecto garante que endereços além do limite de um segmento
não sejam acessados. Qualquer tentativa é imediatamente abortada. Deve-se lembrar que todos esses recursos são
fornecidos no hardware do processador e, quando um sistema operacional é projetado usando esses recursos de
hardware, o design do sistema operacional se torna relativamente fácil. Agora, vamos entrar nos detalhes.
• Verificação de tipo.
• Verificação de limites.
• Restrição no domínio acessível.
Machine Translated by Google
A tradução de endereços e o acesso à memória já foram discutidos. O hardware de proteção é parte integrante dessa
unidade, que se aplica tanto à segmentação quanto à paginação. Assim, é necessário ter em mente que a proteção é
discutida separadamente, apenas para facilitar o entendimento. Cada referência à memória é verificada pelo hardware para
verificar se ela atende aos critérios de proteção. Todas essas verificações são feitas antes do início de um ciclo de memória.
Qualquer violação impede o início desse ciclo e resulta em uma exceção. Como as verificações são executadas
simultaneamente com a formação do endereço, não há penalidade de desempenho. Tentativas inválidas de acesso à
memória resultam em uma exceção (uma exceção é uma interrupção causada por um erro).
Erros de programação podem ocorrer se um seletor de segmento errado for carregado em um registrador de segmento.
Tenha em mente que um segmento de código sozinho é um segmento executável. Ele pode ser lido, mas não pode ser
escrito. Os segmentos de dados devem ser legíveis e os segmentos de pilha devem ser graváveis. Assim, as seguintes
condições devem ser verificadas.
ii) Seletores de segmentos executáveis que não são legíveis não podem ser carregados no segmento de dados
registros.
iii) Somente seletores de segmentos de dados graváveis podem ser carregados no SS.
Quando uma instrução com referência de memória deve ser executada, a verificação de tipo é realizada para confirmar que
ii) nenhuma instrução pode escrever em um segmento de dados se o bit gravável não estiver definido,
iii) nenhuma instrução pode ler um segmento executável a menos que o bit legível seja definido.
fora do segmento não ocorre. O valor do campo limite deve ser interpretado de forma diferente para segmentos de expansão
para cima (dados) e segmentos de expansão para baixo (pilha). Capturar e prevenir erros de violação de endereço ajuda
bastante a evitar falhas no sistema.
Confiança Quando uma tarefa deve ser executada, é o código que é executado – para executar o código, são necessários
dados de vários segmentos – também, o código de outros segmentos pode ser necessário quando uma ramificação para
um segmento diferente deve ser feita. A tarefa que faz isso deve ser uma tarefa 'confiável' – o segmento de código que
executa a tarefa deve ser um segmento confiável. Só então ele pode ter permissão para acessar outros segmentos. O nível
de privilégio concedido a este segmento depende de quanta confiança é depositada nele. Se for concedido o nível de
privilégio mais alto, significa que é permitido o acesso a qualquer outro segmento de que precise. Um nível de privilégio tão
alto é concedido apenas a segmentos de tarefas do sistema operacional, ou seja, tarefas com status de supervisor, que são
as tarefas mais confiáveis.
As tarefas no nível do aplicativo geralmente estão em níveis de privilégios baixos – elas não são confiáveis o suficiente para
permitir que usem todos os segmentos disponíveis. Tudo isso significa que todos os segmentos recebem um nível de
privilégio específico (geralmente um número), e uma tarefa em um nível de privilégio baixo só pode acessar segmentos no
mesmo nível ou em um nível de privilégio inferior.
Proteção Agora pense em um segmento de dados ou mesmo em um segmento de código que contém um procedimento a
ser acessado de outros segmentos de código. Vamos chamá-lo de um segmento-alvo. Qual é a extensão da proteção que
ele tem? Pode ser usado por qualquer tarefa? Nesse caso, é um segmento no nível de privilégio mais baixo e, portanto, o
'menos protegido'. Se for altamente protegido, será concedido o nível de privilégio mais alto e, então, apenas as tarefas com
o status de supervisor poderão usá-lo.
CPL (Nível de Privilégio Atual) CPL é armazenado no seletor do registrador de segmento de código atualmente em
execução (bits 0 e 1); CPL representa o nível de privilégio da tarefa atualmente em execução, ou seja, o programa ou
procedimento. Normalmente, o CPL é igual ao nível de privilégio do segmento de código do qual as instruções estão sendo
buscadas. Assim, este também é o nível de privilégio no byte de acesso do descritor deste segmento de código (exceto para
o que é chamado de segmento de código 'conforme'). A CPL também é designada como TPL ou Nível de Privilégio de
Tarefa.
DPL (Nível de Privilégio do Descritor) DPL é o nível de privilégio de um objeto que está sendo acessado pela tarefa
atual. É o nível de privilégio do segmento de destino e está contido no byte de acesso do descritor do segmento
correspondente. A discussão acima pode parecer um pouco complexa, mas o que realmente é feito é apenas uma simples
comparação de números. Em termos simples, o que é feito é que o CPL da tarefa em execução é comparado
Machine Translated by Google
Tarefa B
Formulários
Serviços personalizados
Serviços do sistema
Núcleo
Tarefa C Tarefa A
com o DPL do segmento alvo. Após a comparação, o acesso é permitido somente se o CPL for maior
ou igual ao DPL do segmento de destino. Tenha em mente que um nível de privilégio mais alto
corresponde a um número mais baixo.
RPL (Requestor Privilege Level) Vê-se que os dois bits mais baixos de qualquer seletor são reservados
para o campo RPL – esses bits têm efeito na validação de privilégios. Este campo RPL do seletor de um
segmento alvo pode ser usado para 'enfraquecer' o CPL, se desejado. Se o RPL do seletor for 2 enquanto o
CPL da tarefa for 1, o nível de privilégio efetivo é o maior deles, ou seja, 2. Assim, a tarefa se torna menos
privilegiada. A tarefa é efetivamente excluída do acesso a um segmento de dados que, de outra forma, a
tarefa poderia ter o privilégio de usar. (Isso pode parecer desnecessário, mas geralmente é usado para evitar
o uso inadequado de ponteiros que podem corromper a operação de código ou dados mais privilegiados de
um nível menos privilegiado.)
Mas o efeito oposto de fazer RPL = 0 não tem nenhum efeito. Se o RPL do seletor for numericamente
menor que o CPL, ele não terá efeito.
Visível de 16 bits
Seletor Descritor Invisível
CS CPL
Seletor de Segmento
para Segmento Alvo
Privilégio
RPL Acesso/Sem acesso
Verificar
Segmento alvo
Descritor
DPL
Figura 15.23 | O nível de privilégio verifica uma tarefa ao acessar um segmento de dados
As instruções podem carregar um registrador de segmento de dados (e subsequentemente usar o segmento alvo)
somente se o DPL do segmento alvo for numericamente maior ou igual ao máximo do CPL e do RPL do seletor.
Em outras palavras, um segmento de código só pode acessar dados que estejam no mesmo nível ou menos
privilegiado.
O segmento de dados possui um DPL no byte de acesso de seu descritor, e este número designa o nível de
privilégio do segmento de dados. Em seguida, o segmento de dados deve estar no mesmo nível de privilégio ou
inferior em comparação com o CPL da tarefa. O domínio acessível de uma tarefa varia de acordo com seu CPL. Se
o CPL de uma tarefa for zero, os segmentos de dados em todos os níveis de privilégio estarão acessíveis; quando
CPL é um, apenas os segmentos de dados nos níveis de privilégio de um a três são acessíveis; quando CPL é três,
apenas os segmentos de dados no nível de privilégio três são acessíveis. Esta propriedade do mecanismo de
proteção é utilizada, por exemplo, para evitar que procedimentos de aplicações leiam ou alterem tabelas do sistema
operacional.
Em suma, a seguinte equação numérica deve ser satisfeita: CPL ÿ DPL. No entanto, o CPL pode ser
enfraquecido pelo RPL. Assim, definimos o Nível de Privilégio Efetivo (EPL) como o máximo numérico de RPL e
CPL. Assim, a condição final para acesso é que EPL ÿ DPL.
A Figura 15.23 mostra o conceito de verificação de nível de privilégio quando uma tarefa tenta acessar um
segmento de dados. Se a condição requerida for satisfeita, o acesso é permitido, caso contrário não é.
Estamos falando de segmentos de código que precisam acessar segmentos que contêm dados. No entanto, muitas
vezes os segmentos de código precisam acessar outros segmentos de código. Isso acontece quando uma chamada
distante ou instrução de salto ou ret é encontrada. (Isso também ocorre no caso de interrupções, mas isso será
discutido separadamente). Existem alguns problemas nesse tipo de transferência de controle.
• Podemos ir para um segmento de código de nível de privilégio inferior, mas ao retornar, causa nível de privilégio
violações, portanto, de fato, esse tipo de acesso não é possível.
• Não é permitido ir para segmentos de código de nível de privilégio mais alto, mas há uma maneira indireta
de fazer isso e aquilo está usando 'portões'.
Segmento de código em conformidade Um segmento de código em conformidade é aquele que não possui um nível de privilégio
próprio. Ele pode ser chamado por programas em qualquer nível de privilégio e, em seguida, adquire o CPL do programa chamador.
O bit 2 do byte de acesso de um descritor de segmento de código especifica se é um segmento conforme (C = 1) ou não conforme
(C = 0). Este mecanismo é adequado para lidar com programas que compartilham código, mas são executados em diferentes
níveis de privilégio, por exemplo, bibliotecas compartilhadas.
Ele permite o compartilhamento de procedimentos, para que possam ser chamados de vários níveis de privilégio. Eles são
geralmente usados para bibliotecas matemáticas e manipuladores de exceção.
Para um segmento de código em conformidade, os dois bits mais baixos do seletor não precisam ser os mesmos que o
Bits CPL no byte de acesso do descritor do segmento de código.
Segmento de código não conforme Mas a maioria dos segmentos de código não está em conformidade. As regras básicas de
privilégio significam que, para segmentos não conformes, o controle pode ser transferido apenas para segmentos executáveis no
mesmo nível de privilégio. Há uma necessidade, no entanto, de transferir o controle para níveis de privilégios mais altos – por
exemplo, quando um programa aplicativo de baixo privilégio deseja usar um serviço do sistema que está em um nível de privilégio
alto. Um exemplo será quando um programa aplicativo deseja gravar dados em disco, o que envolve o uso de um driver de
dispositivo. Neste caso, um acesso indireto é permitido através de um 'gate' que é armazenado no LDT ou GDT.
• Portão de tarefas
• Portão de interrupção
• Portão de chamada
• Ponto de entrada para um procedimento no segmento de código especificado (off set no segmento).
• Contagem de parâmetros – se ocorrer uma troca de pilha, especifica o número de parâmetros opcionais a serem copiados entre
as pilhas.
• Para uma instrução CALL: DPL do segmento de código alvo ÿ CPL (somente chamadas para o
segmento de código privilegiado são permitidos através de uma porta) – em termos numéricos.
• Para uma instrução JMP: DPL do segmento de código = CPL. Os portões não podem ser usados para saltar para um nível de
privilégio diferente.
Este mecanismo de acesso indireto permite o acesso somente se uma determinada verificação for feita. O nível de privilégio do
programa chamador (ou seja, CPL) é comparado com o da porta de chamada. Se o primeiro tiver um nível de privilégio maior ou
igual ao DPL do portão, o acesso é permitido - caso contrário
Machine Translated by Google
15 0
Deslocamento (O31–O16) 6
Contagem de palavras
P DPL 0 Tipo 0 00 4
(C4–C0)
Seletor 2
Deslocamento (O15–O0) 0
é negado. Isso pode ser elaborado desta forma – uma porta de chamada com DPL 2 pode ser usada por um programa com CPL
2 para acessar um serviço do sistema no nível 0 – mas a mesma porta não pode ser usada por um programa com CPL 3 A Figura
15.24 mostra uma porta de chamada.
A instrução Call xxxxx pode ser usada onde xxxxx pode ser especificado como um nome de porta, mas geralmente gera um seletor
que nos leva a uma entrada no GDT ou LDT, onde a porta está armazenada. No portão de chamada, o detalhe do segmento de
código alvo está disponível e, usando isso, o programa chamador insere o segmento de código com um privilégio mais alto, mas
apenas no ponto de entrada definido (no portão).
Lembre-se de que um portão não pode ser usado para inserir segmentos de código em níveis de privilégio mais baixos.
15.11 | Multitarefa
O que significa a palavra multitarefa no contexto de computadores e processadores? Se um computador pode lidar com várias
tarefas ao mesmo tempo, ele tem a capacidade de multitarefa. No entanto, a frase 'ao mesmo tempo' é um pouco complicada. Um
único processador pode executar a tarefa de executar vários programas ao mesmo tempo, ou seja, em paralelo?
Improvável. A maioria de nós observou o sistema operacional Windows permitindo que várias tarefas sejam atendidas
simultaneamente. Então, existem sistemas com apenas um processador, mas vários terminais e vários usuários. Parece que todos
os programas dos usuários estão sendo feitos simultaneamente. No entanto, na verdade, esse não é o caso. Um único processador
pode executar a execução de apenas uma sequência de código.
Quando várias tarefas devem ser tratadas, a alternância de tarefas está sendo feita.
Um programa em execução é chamado de processo ou tarefa. Suponha que existam 10 tarefas que o sistema tem que lidar
– o sistema operacional tem que organizar uma sequência de como organizar a execução dessas tarefas. Este sistema operacional
multitarefa pode usar um dos muitos conceitos disponíveis. Existe o método de 'fatia de tempo' em que uma tarefa recebe um certo
tempo para ser executada – depois disso, a tarefa deve dar lugar à execução da próxima tarefa e assim por diante. Dessa forma,
todas as dez tarefas são executadas em uma rodada, e o usuário/usuários sente que todas as tarefas estão sendo executadas
simultaneamente. Na próxima rodada, mais uma vez todas as tarefas são executadas e isso continua.
No agendamento de tarefas baseado em prioridade, as tarefas mais importantes podem ser executadas, enquanto as tarefas
de baixa prioridade são feitas para aguardar. Existe também o sistema de agendamento cooperativo em
Machine Translated by Google
que uma tarefa tem permissão para executar até sua conclusão. É o sistema operacional que decide o mecanismo de agendamento de
tarefas. O Windows é um sistema operacional multiusuário, enquanto o DOS é um sistema operacional de usuário único.
Troca de Tarefas Quando uma tarefa é temporariamente abandonada e outra é retomada, diz-se que ocorreu uma
troca de contexto ou troca de tarefas.
conteúdo dos registradores em uso, no estado da pilha e em todas as informações necessárias para retomar a tarefa
antiga. Isso é semelhante a retornar de uma interrupção, mas mais variáveis e mais parâmetros precisam ser salvos
antes de alternar para uma nova tarefa.
Se se diz que um processador tem capacidade de 'multitarefa', isso significa que ele possui recursos de hardware
para lidar com todos os problemas associados à alternância de tarefas. Deve ter os mecanismos necessários,
instruções, registros e hardware adicional necessário. Esses recursos estão disponíveis no 80386 e são úteis para
projetar um sistema operacional multitarefa para este processador.
TSS e LDTs Foi mencionado anteriormente que se houver 'n' tarefas em um sistema, haverá n
LDTs – ou seja, para cada tarefa existe um LDT e cada LDT contém os descritores dos segmentos necessários para
executar determinada tarefa. Quando uma tarefa específica é executada, o seletor de seu LDT é carregado no LDTR
do processador. Assim, precisamos lembrar que um LDT está associado a uma tarefa específica e que existem tantos
LDTs no sistema quantas tarefas. Os descritores de todos os LDTs de um sistema são armazenados no GDT do
sistema.
Semelhante a esta, existe outra estrutura associada a uma determinada tarefa e que é o seu 'Task State
Segment' ou TSS. Cada tarefa tem um TSS. Todas as informações referentes a uma determinada tarefa são
armazenadas em seu TSS, que também é um array de memória ou segmento armazenado na memória principal.
O TSS possui os seguintes campos.
i) Um conjunto dinâmico que muda toda vez que ocorre uma troca de tarefa. Eles são:
• Os registros gerais (EAX, ECX, EDX, EBX, ESP, EBP, ESI e EDI).
ii) Um conjunto estático que o processador lê, mas não altera. Este conjunto inclui:
• O seletor do LDT da tarefa.
• O registro (PDBR) que contém o endereço base do diretório da página da tarefa (leia
somente quando a paginação está habilitada).
• O bit T (bit de trap de depuração) que faz com que o processador gere uma exceção de depuração quando
ocorre uma troca de tarefa.
31 23 15 7
00000000 00000000 GS 5C
00000000 00000000 FS 58
00000000 00000000 DS 54
00000000 00000000 SS 50
00000000 00000000 CS 4C
FOI 44
Contexto de
COMO AS 40
Tarefa atual
EBP 3C
ESP 38
EBX 34
EDX 30
ECX 2C
EAX 28
Bandeiras E
24
00000000 00000000 S S2 18
ESP2 14
Pilhas para
00000000 00000000 S S1 10
CPL
ESP1 0C
0, 1, 2
00000000 00000000 S S0 8
ESP0 4
00000000 00000000 Voltar Link para TSS anterior 0
O TSS é um segmento e, portanto, possui um descritor que é armazenado no GDT do sistema (assim
como o descritor do LDT). O descritor de um TSS é semelhante a um descritor de segmento, exceto
que possui um 'B' ou bit ocupado. O bit B no campo de tipo indica se a tarefa está ocupada. O bit B
permite que o processador detecte uma tentativa de alternar para uma tarefa que já está ocupada.
15.11.2 | Registrador de
Tarefas O processador possui um registrador chamado registrador de tarefas (TR) que aponta
para a tarefa atual. Quando uma tarefa específica é executada, o seletor do TSS é carregado
na parte visível do registro de tarefas. O seletor contém o índice que localiza o descritor do
TSS correspondente no GDT. Então o descritor do TSS desta tarefa é carregado na parte
oculta do registro.
Machine Translated by Google
Dois pontos importantes em relação à execução da tarefa atual é que ela possui o seletor TSS no registrador
de Tarefas (TR) e o seletor LDT no registrador LDT (LDTR). Isso inicia as ações necessárias para acessar o
conteúdo do LDT e TSS que pertencem a essa tarefa.
Quando ocorre a troca de tarefas, o conteúdo desses registros é alterado.
i) No primeiro caso, usando instruções como JMP taskname ou CALL taskname pode-se carregar o seletor do
TSS correspondente no registrador de tarefas (TR) que obtém o descritor TSS do GDT.
ii) No segundo caso, a troca de tarefas é indireta. Há um 'portão de tarefa' envolvido, assim como o portão de
chamada que discutimos na seção anterior. Em ambos os casos, uma nova tarefa é iniciada.
iii) A comutação de tarefas também pode ocorrer pela ocorrência de uma interrupção. Isso também é lógico, mas
envolve uma 'tabela descritora de interrupção' que ainda vamos discutir. De qualquer forma, sabemos que
uma interrupção ou exceção faz com que a tarefa atual seja abandonada e uma nova seja retomada. Assim,
pode levar a uma troca de tarefas quando existe o mecanismo de acesso ao TSS de uma nova tarefa.
iv) Seja invocado como uma tarefa ou como um procedimento da tarefa interrompida, um manipulador de
interrupção sempre retorna o controle ao procedimento interrompido na tarefa interrompida. Se o sinalizador
de tarefa aninhada (NT) estiver definido, no entanto, o manipulador é uma tarefa de interrupção e o IRET
alterna de volta para a tarefa interrompida.
i) Se a comutação ocorrer por uma instrução JMP ou CALL, aplicam-se as regras usuais de níveis de privilégio
para o descritor TSS ou porta de tarefas, e a comutação de tarefas ocorre somente se as condições forem
satisfeitas. A verificação do bit P e do bit limite do descritor TSS também é feita.
ii) O contexto da tarefa atual é salvo, ou seja, o conteúdo dos registradores é copiado para o TSS.
O registrador EIP que agora está armazenado no TSS estará apontando para a próxima instrução após
aquela que causou a troca de tarefa. Essas ações correspondem a 'salvar o contexto' da tarefa abandonada.
iii) Em seguida, iniciam-se as ações para assumir a nova tarefa. O Registro de Tarefas (TR) é carregado com o
seletor da nova tarefa. O seletor é o operando de uma instrução de transferência de controle ou é obtido de
uma porta de tarefa que obtém o descritor TSS e, em seguida, o TSS da memória.
iv) Agora a nova tarefa pode ser prosseguida. Para isso, seu estado é carregado do TSS nos registradores
correspondentes. Os registradores carregados são o registrador LDT, o registrador fl ag; a
Machine Translated by Google
registros gerais EIP, EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, os registros de segmento ES, CS, SS, DS, FS e GS e PDBR.
v) Cada chave de tarefa também define o bit TS (comutação de tarefa) no MSW (palavra de status da máquina)
ou seja, CR0.
O campo de back-link do TSS e o bit NT (Nested Task) da palavra sinalizadora juntos permitem que o 80386 retorne automaticamente
a uma tarefa que chamou outra tarefa ou foi interrompida por outra tarefa. Quando uma instrução CALL, uma instrução de interrupção,
uma interrupção externa ou uma exceção provoca uma mudança para uma nova tarefa, o 80386 automaticamente preenche o back-
link do novo TSS com o seletor do TSS da tarefa de saída e, ao mesmo tempo, time, define o bit NT no registrador de flag da nova
tarefa. O sinalizador NT indica se o campo de backlink é válido. A nova tarefa libera o controle executando uma instrução IRET. Ao
interpretar um IRET, o 80386 examina o sinalizador NT. Se NT estiver definido, o 80386 volta para a tarefa selecionada pelo campo de
back-link.
Agora, para as diferenças – em vez da 'tabela de vetor de interrupção', aqui está a 'Tabela de descritor de interrupção (IDT) que
possui os vetores de interrupção. Há um e apenas um IDT para um sistema. Ele pode estar localizado em qualquer lugar da memória
física, e isso é especificado pelo descritor desta tabela que estará no GDT. Quando o sistema está em modo protegido, o descritor do
IDT é carregado no registrador IDT (IDTR).
Descritores IDT Existem três tipos de descritores que podem ser colocados no IDT. Eles são:
• Portões de tarefas
• Portões de interrupção
• Portões de armadilha
Os portões de tarefas já foram discutidos. Uma interrupção pode causar troca de tarefas se o segmento alvo corresponder a uma tarefa
diferente. É por isso que podemos ter portões de tarefas também no IDT.
Sabemos que uma porta contém um ponto de entrada em um segmento de código. Ele contém um seletor do segmento de código
de destino e o off set do ponto de entrada permitido. Os portões de chamada já foram discutidos. Uma interrupção é semelhante a uma
chamada – a resposta é semelhante, mas o mecanismo de iniciação é diferente. Além disso, uma interrupção faz com que os
sinalizadores sejam salvos na pilha e a instrução de retorno seja IRET em vez de RET. Portanto, não temos portões de chamada no
IDT, mas sim portões de trap e interrupção.
A diferença entre um portão de interrupção e um portão de interrupção está no efeito em IF (o sinalizador de habilitação de
interrupção). Uma interrupção que vetora através de uma porta de interrupção redefine IF, evitando assim que outras interrupções
interfiram com o manipulador de interrupção atual. Um IRET subsequente
Machine Translated by Google
IDT
Segmento executável
Desvio
Ponto de entrada
LDT ou GDT
EU IRIA
interrupção
Descritor de segmento
Base
A instrução restaura IF para o valor na imagem EFLAGS na pilha. Uma interrupção através de um trap gate não muda IF. A
figura mostra a canalização de uma interrupção do IDT para o vetor de interrupção. Como os descritores estão envolvidos
nessa sequência, a verificação do nível de privilégio também é feita para interrupções. A regra de privilégio que governa os
procedimentos de interrupção é semelhante àquela das chamadas de procedimento.
15.12.1 | Exceções
As exceções são causadas por condições de erro. Para o caso do 8086, sabemos que um erro de divisão por zero causa
uma interrupção do tipo 0. Podemos chamá-lo de exceção. O 80386 tem mais condições de erro sob as quais podem ocorrer
interrupções. A Tabela 15.2 mostra a lista das 80386 interrupções.
Compare com a Tabela 8.2, que fornece a listagem de interrupções para um PC.
0 Erro de divisão
1 Exceções de depuração
2 Interrupções não mascaráveis
8 Falha dupla
9 (Reservado)
10 TSS inválido
13 Proteção geral
14 Falha de página
15 (Reservado)
16 Erro do coprocessador
17-31 (Reservado)
De fato, todas as instruções que envolvem carregamento/armazenamento de registradores de modo protegido são privilegiadas
instruções.
Para alternar para o modo protegido, várias operações de inicialização precisam ser feitas. Isso pode ser feito no próprio
modo real. (Essas coisas também podem ser feitas no modo protegido, mas deve-se garantir que os procedimentos de inicialização
não usem recursos do modo protegido que ainda não foram inicializados.) Por exemplo, o GDTR deve apontar para um GDT válido,
o IDTR deve apontar para um IDT válido e assim por diante – após todas as inicializações serem feitas, a comutação pode ser feita.
Em seguida, para passar para o modo protegido, o bit PE (Protection Enable) do registro de controle CR0 deve ser definido.
Quem conhece o 80286 vai lembrar que existe uma instrução LMSW (Load Machine Status Word) que foi executada com PE = 1.
É esse mesmo registrador MSW que foi renomeado como CR0 para o '386.
Machine Translated by Google
A diferença entre o '286 e o '386 é que no caso do primeiro não é possível retornar ao modo
real sem fazer um reset de hardware. No entanto, no caso do '386, é possível retornar ao modo real
limpando o bit PE e carregando-o novamente em CR0.
Obviamente, várias condições terão que ser organizadas antes de retornar ao modo real. Todas
essas condições podem ser colocadas dentro de um procedimento, sendo a instrução final a limpeza
do bit PE de CR0. Assim, o processador retorna ao modo real.
15.14 | Conclusão
Com isso, chegamos ao fim de nossa discussão sobre 80386. A maioria dos recursos importantes
foram explicados, mas para poder escrever instruções para usar todos esses recursos, é necessário
mais estudo e mais informações (do manual de programação). A tentativa aqui tem de dar uma ideia
das capacidades de um dos processadores mais sofisticados da família Intel. O 80486 e o Pentium
possuem todos esses recursos, portanto, este capítulo deve ser entendido para apreciar as
características do Pentium.
| O 80286 tinha muitos recursos aprimorados em comparação com o 8086 e impulsionou o desenvolvimento do PC-
AT e do primeiro sistema operacional baseado em Windows – Windows 3.1.
| O 80386 foi o próximo processador da Intel em que a grande mudança é o aumento do número de pinos de endereço
e dados para 32.
| Ele possui várias novas instruções e também aprimoramentos em algumas instruções existentes.
| A ideia de memória virtual é ter um espaço de memória ampliado que é mapeado para um espaço de memória menor.
memória física.
| Descritores são entidades de 8 bytes nas quais são armazenadas as informações correspondentes a um segmento.
| A unidade de paging da MMU pode ser desligada , mas não a unidade de segmentação.
| A proteção tem muitos aspectos, incluindo proteger as tarefas umas das outras e também a necessidade de proteger as
tarefas no nível do sistema das tarefas do usuário.
| O conceito de níveis de privilégio é usado para prescrever o nível de confiança e o nível de proteção
para cada segmento.
| As portas de chamada são usadas para acessar segmentos de código em um nível de privilégio mais alto.
| O 80386 é uma CPU multitarefa, o que significa que pode cuidar de várias tarefas.
| As tarefas não são executadas simultaneamente; o tempo de CPU é alocado para diferentes tarefas.
| A tabela de vetor de interrupção é substituída por uma tabela de descritor de interrupção enquanto estiver no modo protegido.
PERGUNTAS
1. Quais foram as principais mudanças incorporadas no 80286 em relação ao 8086?
3. Cite a principal mudança que fez do 80386 um grande salto na tecnologia do processador.
13. Por que dizemos que um segmento com CPL = 0 é um segmento altamente confiável?
EXERCÍCIO
3. Adicione o conteúdo de uma tabela de tamanho 27 contendo números de 16 bits usando o modo indexado em escala
de endereçamento.
5. No modo virtual 8086, as instruções do BIOS e DOS podem ser usadas por programas baseados em 8086? Como?
Machine Translated by Google
Machine Translated by Google
thepentium
1 6 processador
Introdução
Este capítulo foi intitulado 'Pentium', mas aqui também discutiremos o 80486. No Capítulo 15, o primeiro
processador de 32 bits da Intel, ou seja, o 80386, foi discutido com o objetivo de decifrar as complexidades
de um processador complexo. Uma vez que o '386 é bem entendido, o '486 e o Pentium não têm nada
além de alguns 'aprimoramentos'. Isso significa que a arquitetura interna do '486 e do Pentium é mais ou
menos a mesma do '386. Eles têm a mesma unidade de gerenciamento de memória, mecanismos de
proteção e unidades multitarefa que discutimos no Capítulo 15. Assim, uma discussão sobre esses
recursos é redundante e nos concentraremos nos recursos adicionais do 80486 e do Pentium, além dos o
de 80386.
i) O processador 80486 foi introduzido pela Intel em 1989. A primeira diferença importante que o '486
tem em relação ao seu antecessor é que ele possui uma unidade de ponto flutuante integrado no
próprio chip. Os processadores anteriores tinham a unidade aritmética como uma unidade separada
– o 8086 tinha o 8087, o 80186 tinha o 80187, o 80286 tinha o 80287, o '386 tinha o '387 e assim por diante.
Logicamente, o 80486 deveria ter um coprocessador aritmético 80487 externo ao chip, mas em vez
disso, a Intel colocou o coprocessador aritmético dentro do chip e chamou o chip inteiro de 80486DX.
Para melhorar seu segmento de mercado, a Intel também vendeu um processador '486 sem FPU
(unidade de ponto flutuante, como é chamado o coprocessador aritmético). Foi nomeado como
80486SX, mas na verdade era apenas o processador 80486 com sua FPU desligada.
ii) O segundo aprimoramento importante é a adição de 8 KB de cache no chip, tanto para dados quanto para
código. Todos os processadores predecessores tinham cache fora do processador. Com esse aprimoramento,
o cache no chip passou a ser designado como cache L1 (nível 1), enquanto o cache fora do chip é chamado
de cache L2 (nível 2). O registro de controle CR0 é usado para controlar o cache interno com dois novos
bits de controle que não estavam presentes no microprocessador 80386.
iii) O cache interno melhorou substancialmente a velocidade de acesso à memória, mas as versões posteriores
tinham algo chamado 'clock duplicando'. Novas edições foram lançadas com frequências de clock mais
altas, pois tiveram a ideia de dobrar a frequência do clock interno em relação ao clock externo. Esses
processadores com clock duplo receberam o nome de 80486DX2. Um modelo muito popular desta série
tinha uma frequência de clock externa de 33 MHz enquanto trabalhava a 66 MHz internamente. Este
princípio (over-clocking) foi permitido de uma forma ou de outra em todas as gerações posteriores de CPUs,
embora existam problemas associados a ele. É apenas uma opção permitida para um processador e está
especificada nas especificações da placa-mãe.
iv) Comparado com o 80386, o '486 é um processador com pipeline pesado. Ele tem um pipeline de 5 estágios,
conforme mostrado na Fig 16.1. Cada estágio leva um ciclo de clock, mas quando o pipeline estiver cheio,
cada instrução será executada em um único clock.
Referindo-se à Figura 16.1, os estágios no pipeline são como PF-Pre-fetch, D1-decode1, D2-decode2,
EX-Execute e WB-Write back. I1 a I5 correspondem a cinco instruções no pipeline. De acordo com esta
figura, existem dois estágios de decodificação. Isso se deve aos variados modos de endereçamento do
80486 e à necessidade de verificações de proteção antes que qualquer acesso seja permitido. Este
processador possui um pipeline de 5 estágios – se os estágios de pipeline são divididos em etapas cada
vez menores, é chamado de 'super pipeline', mas essa ideia não é usada no 808486.
v) Os processadores '486 e superiores suportam transferências em modo de rajada. Este recurso é útil para
economizar tempo ao acessar dados de endereços consecutivos. Vamos tentar entender essa importante
característica. A Figura 16.2 mostra o tempo do ciclo de leitura para um ciclo de leitura de memória comum.
Dois ciclos de clock são necessários para transferir dados (que tem 32 bits). O primeiro ciclo de clock T1
fornece o endereço de memória e sinais de controle, enquanto em T2, os dados são transferidos entre a
memória e o microprocessador. A figura mostra o caso de duas palavras de 32 bits sendo transferidas. ADS
é strobe de endereço. Assim, são necessários dois ciclos de clock para transferir 32 bits de dados. Se 128
bytes de dados devem ser transferidos, obviamente serão necessários 8 ciclos de clock. Agora, vamos
contrastar isso com um ciclo de explosão. Um ciclo de rajada exigirá apenas 5 ciclos de clock para transferir
128 bytes de dados. Como obtemos tal número? Consulte a Figura 16.3.
Um ciclo de rajada transfere vários bytes de dados pelo barramento durante um longo ciclo de memória.
Por exemplo, uma transferência de um item de dados de 128 bits em um barramento de 32 bits normalmente
ocorreria em quatro grupos, cada grupo contendo um dado de 32 bits. Mas no modo burst, o
Tempo
EU
1 PF D1 D2 EX WB
EU
2 PF D1 D2 EX WB
EU
3 PF D1 D2 EX WB
EU
4 PF D1 D2 EX WB
EU
5 PF D1 D2 EX WB
T1 T2 T1 T2
CLK
Endereço
Dados
PUBLICIDADES
T1 T2 T2 T2 T2
CLK
Endereço
Dados
PUBLICIDADES
BRDY
endereço inicial (do primeiro byte) é usado pelo processador para calcular os endereços restantes para os
bytes de dados subseqüentes. Existem várias maneiras de fazer isso, mas para entendê-lo, pense desta
forma – uma ordem de rajada sequencial do endereço zero transferiria primeiro os dados de 32 bits que
residem no endereço zero. As próximas transferências seriam para os dados nos endereços 4, 8 e 12, em
ordem.
A Figura 16.3 mostra um ciclo de rajada que lê quatro palavras de 32 bits (um total de 128 bytes) em
cinco períodos de clock. Para iniciar o processo, o processador envia o primeiro endereço e afirma o sinal
BLAST (não mostrado na figura) alto. O sinal BRDY (Burst ready) é ativado no primeiro T2. O processador
lê a palavra de dados em dois ciclos e emite o próximo endereço. Como os dados estão em endereços
sucessivos, apenas os bits de endereço mais baixos precisam ser alterados. Quando o processador tiver
lido o número necessário de palavras de dados, ele afirma o sinal BLAST baixo para encerrar o modo de
rajada. Esse ciclo de leitura em rajada é chamado de leitura 2-1-1-1, onde quatro leituras de dados são
realizadas em 5 ciclos de clock.
vi) O processador tem um acréscimo importante em termos de quatro pinos (um para cada banco de memória)
para paridade, que é gerado por ele, durante cada ciclo de escrita. A paridade é gerada como paridade par
Machine Translated by Google
P P P P
UMA UMA UMA UMA
R R R R
1G × 8 1G×8 1G × 8 1G × 8
EU EU EU EU
T T T T
S S S S
e um bit de paridade é fornecido para cada byte de memória. Os bits de verificação de paridade aparecem
nos pinos DP0–DP3, que são entradas de paridade, bem como saídas de paridade. Estes são normalmente
armazenados na memória durante cada ciclo de gravação e lidos da memória durante cada ciclo de leitura.
Em uma leitura, o microprocessador verifica a paridade e gera um erro de verificação de paridade, se ocorrer
no pino PCHK. Um erro de paridade não causa alteração no processamento, a menos que o usuário aplique
o sinal PCHK a uma entrada de interrupção. A Figura 16.4 mostra os bancos de memória do 80486 com os
sinais de habilitação do banco (BE s) e o bit de verificação de paridade para cada canal.
vii) Outro aprimoramento que precisa ser mencionado é a adição de algumas novas instruções listadas
abaixo:
Destas, as três últimas instruções estão relacionadas às operações de cache. A primeira instrução
BSWAP é muito útil para sistemas que usam o formato big endian, ao invés do formato little endian
usado pela Intel. Mudar de um formato para outro envolve apenas a troca dos bytes de uma palavra.
Agora, antes de avançar para o próximo tópico, vamos tentar entender o significado e as implicações
de uma questão que precisa de cuidadosa consideração.
largura era de 16 bits. No entanto, para '386 em diante, a largura do barramento é de 32 bits e os dados são divididos em 4 bancos de
memória. Para Pentium, a largura do barramento de dados externo é de 64 bits. Em todos esses casos, ocorrerá uma penalidade de
barramento se o endereço de memória não estiver 'alinhado'. Uma penalidade de desempenho ocorre devido a dados desalinhados. O que
se entende por alinhamento de dados?
Dados de 2 bytes Um item de dados de 16 bits é alinhado se estiver armazenado em um endereço múltiplo de dois.
Isso implica que o bit menos significativo do endereço deve ser 0. Este é o caso que discutimos para o 8086, onde o LSB do endereço sendo
0, significa que o endereço é um número par.
Data de 4 bytes Vamos pensar desta forma – se todos os 4 bytes estiverem em uma linha, eles podem ser acessados em um ciclo, caso
contrário, mais um ciclo é necessário. Isso significa que um item de dados de 32 bits está alinhado se estiver armazenado em um endereço
múltiplo de 4. Isso implica que os dois bits menos significativos do endereço devem ser zero.
Dados de 8 bytes Um item de dados de 64 bits é alinhado se estiver armazenado em um endereço múltiplo de 8. Isso significa que os três
bits menos significativos do endereço devem ser 0. Esse alinhamento é importante para os processadores como o Pentium que tem um
barramento de dados de 64 bits.
A família de processadores Pentium, que tem suas raízes no processador Intel 486, usa o conjunto de instruções Intel 486 (com
algumas instruções adicionais). O termo 'processador Pentium' refere-se a uma família de microprocessadores que compartilham uma
arquitetura e um conjunto de instruções comuns, mas cada nova versão do Pentium tem recursos cada vez mais recentes. O primeiro
processador Pentium foi lançado no ano de 1993 e tinha muitas novidades em relação ao seu antecessor, ou seja, 80486. A principal
melhoria é que ele possui um barramento de dados de 64 bits, enquanto continua sendo um processador de 32 bits. processador de bits
internamente. Veja a lista abaixo.
• Arquitetura superescalar
Previsão de filial
A largura do barramento de dados foi duplicada. Qual é a vantagem disso? É que os dados podem ser recebidos
como 64 bits de uma só vez. O que pode ser feito com dados de 64 bits quando os registradores do processador
têm apenas 32 bits de largura? A resposta é que, como a largura de banda do barramento dobrou, o dobro da
quantidade de dados pode ser enviada/recebida da/para a memória.
Consulte a Figura 16.5. Existem 8 bancos de memória ativados por oito sinais BE . A partir desta matriz de
banco de memória, os dados podem ser acessados para processamento interno como 8, 16 ou 32 bits. No entanto,
o envio ou recebimento de dados fora do chip pode ocorrer a uma taxa de 64 bits por ciclo de memória. Este é um
grande aprimoramento.
Pentium é um 'processador superescalar' que é pipeline. Pipelining ainda é de apenas 5 etapas. Ser superescalar
significa ter mais de uma unidade de execução – aqui, existem duas unidades de execução inteiras (cada uma delas
é pipeline). Eles são chamados de tubos U e V – ambas as unidades são ligeiramente diferentes em seu poder de
processamento, o que significa que uma unidade pode lidar com operações mais complexas que a outra. É o tubo U
que pode lidar com operações mais complexas. Veja a Fig 16.6 que mostra as unidades de execução do Pentium e
do '486. Observe as diferenças.
,
486 Pentium
A unidade de ponto flutuante foi completamente redesenhada sobre a CPU Intel '486. Operações mais rápidas fornecem
velocidade de até 10x para operações comuns, incluindo adição, multiplicação e carregamento.
A FPU possui um pipeline de oito estágios para agilizar as operações. A Figura 16.7 mostra que as unidades responsáveis
por buscar e decodificar são comuns – uma vez finalizada a decodificação, ela passa para a fase de execução. Nesta
fase, a execução ocorre tanto na tubulação em U, na tubulação em V ou na unidade de ponto flutuante, dependendo do
tipo de dados e da complexidade da operação necessária. Feito isso, o resultado é gravado no cache de dados.
A Figura 16.7 também mostra que existem caches separados de instruções e dados. O Pentium tem dois caches no
chip com taxa separada, um para dados e outro para código. Cada cache tem 8 KB de tamanho, com uma linha de 32 bytes
Cache de instruções
Pré-busca de instruções
Decodificar-1
Decodificar-2
inteiro inteiro
FPU VAI VAI
Tubo V Tubo U
Dados
Cache
tamanho e é associativo de conjunto de 2 vias. Cada cache tem um Translation Lookaside Buffer (TLB) dedicado para
traduzir endereços lineares em endereços físicos. O cache de código (instrução) é um cache inerentemente protegido
contra gravação. Os caches podem ser habilitados ou desabilitados por software ou hardware.
Aumentar o número de unidades de execução traz consigo um novo conjunto de problemas. Os programas são escritos
por um programador para execução serial. No entanto, ao tentar executar este programa em duas unidades de execução
paralelas, o problema de 'dependência de dados' pode surgir para certas sequências de programas. Por exemplo, se a
primeira linha do programa pede a adição de dois números e a segunda linha precisa do resultado da primeira instrução
para sua conclusão, obviamente essas duas instruções não podem ser executadas em paralelo. Nesses casos, a
reordenação ou reescalonamento de instruções deve ser feita e, no momento, esse problema foi entregue ao compilador
para resolver.
Outra novidade que o Pentium possui é a unidade de previsão de ramificação. Isso é útil na prevenção de 'travamento
de pipeline' no caso de uma instrução de desvio ocorrendo na sequência.
Vejamos mais de perto o que é chamado de 'unidade de filial'. Esta unidade inclui a 'unidade de execução de
ramificação' e a 'unidade de previsão de ramificação'. Pense no que deve acontecer se uma instrução de desvio
condicional for encontrada. Primeiro, a condição deve ser avaliada, então o endereço da ramificação deve ser calculado
e, em seguida, o código deve ser buscado no novo endereço da ramificação e a execução da instrução deve prosseguir.
Todas essas etapas envolvem um atraso. Para evitar o atraso, uma técnica chamada 'execução especulativa' é
implementada. Neste, um risco calculado é assumido e uma ramificação específica é feita para continuar a execução da
instrução em sequência. Nesse meio tempo, a condição de ramificação é avaliada. Se a 'execução especulativa' tivesse
tomado o rumo correto, tudo estaria bem. Caso contrário, o pipeline terá que ser liberado e tudo refeito. Esta é de fato
uma catástrofe menor, considerando que o atraso assim incorrido causa uma penalidade de desempenho.
A outra técnica, ou seja, a previsão dinâmica baseia-se no uso do histórico de ramificações anteriores para o
programa. Há uma 'Tabela de Histórico de Filial', bem como um 'Buffer de Alvo de Filial'. Este último armazena os
endereços de destino das ramificações executadas anteriormente, para que a execução especulativa possa usar
qualquer um desses endereços de destino, quando a ramificação tiver que ocorrer. Isso pressupõe que os endereços de
destino usados anteriormente provavelmente serão necessários novamente.
O Pentium usa previsão de ramificação estática e dinâmica e verifica-se que uma taxa de sucesso
de cerca de 75 a 85% é possível.
Lembre-se de que a unidade de paginação '386 suporta apenas páginas com tamanho máximo de 4 K. Isso é assim
para 80486 também. A Unidade de Gerenciamento de Memória dos processadores Pentium contém extensões opcionais
para a arquitetura que permitem tamanhos de página de 2 MB e 4 MB.
Machine Translated by Google
Neste modo, a dissipação de energia é reduzida desligando todos os periféricos e até mesmo o sistema quando não
está em uso. Este não é o único recurso deste modo, que funciona como um gerenciador de alto nível e também possui
recursos extras para maior segurança.
Tamanho do cache L2 256 K ou 512 K 512 K (fora do chip) 512 K (no chip)
(no chip)
Características Sem MMX MMX MMX, SSE
Faremos uma breve revisão das melhorias desses processadores em relação ao seu antecessor, o primeiro Pentium.
Ele introduziu vários recursos arquitetônicos exclusivos que nunca haviam sido vistos em um processador de PC antes. O
Pentium Pro foi o primeiro CPU convencional a mudar radicalmente a forma como executa instruções, traduzindo-as em
microinstruções do tipo RISC e executando-as em um núcleo interno altamente avançado. O Pentium Pro atinge um
desempenho aproximadamente 50% maior do que um Pentium com a mesma velocidade de clock. Além de sua nova
forma de processar instruções, o Pentium Pro incorpora diversos outros avanços técnicos que contribuem para este
aumento de desempenho.
• Cache de Nível 2 Integrado O Pentium Pro apresenta um cache secundário de desempenho dramaticamente mais
alto em comparação com todos os processadores anteriores. Em vez de usar o cache baseado na placa-mãe
Machine Translated by Google
rodando na velocidade do barramento de memória, ele usa um cache de nível 2 integrado com seu próprio barramento,
rodando na velocidade total do processador, normalmente três vezes a velocidade que o cache roda no Pentium. O cache do
Pentium Pro também não é bloqueante, o que permite que o processador continue sem esperar uma falta de cache.
• Otimização de 32 bits O Pentium Pro é otimizado para execução de código de 32 bits (que a maioria dos sistemas operacionais
e aplicativos modernos usam) e, portanto, oferece uma melhoria de desempenho maior em relação ao Pentium ao usar o
software mais recente.
• Barramento de endereço mais amplo O barramento de endereço no Pentium Pro foi ampliado para 36 bits, proporcionando
uma capacidade máxima de endereçamento de 64 GB de memória.
• Maior multiprocessamento As configurações de 'multiprocessador' Quad são suportadas com o Pentium Pro em comparação
com apenas dual com o Pentium. Isso significa que quatro processadores Pentium Pro podem ser interconectados no
barramento do processador Pentium Pro.
• Instruções de conclusão fora de ordem fluindo pelos pipelines de execução podem ser
executado 'fora de ordem'.
• Renomeação de registradores Esta é uma das soluções para o travamento do pipeline que pode ocorrer quando a dependência
de dados impede que duas instruções sequenciais sejam executadas em paralelo nos pipes U e V. Esse recurso melhora o
desempenho paralelo dos pipelines.
• Execução especulativa O processador usa execução especulativa para reduzir o tempo de parada do pipeline em seu núcleo
RISC.
16.5.1 | MMX
Em 1997, um novo conjunto de instruções para multimídia e chamado MMX (para Multimedia Extension) foi introduzido nos
processadores Pentium. Esses processadores P5 foram designados como Pentium MMX. MMX também é um recurso em P-II e
P-III como mostra a Tabela 17.1. A tecnologia MMX foi projetada para acelerar aplicativos multimídia e de comunicação, incluindo
novas instruções e tipos de dados que permitem que os aplicativos atinjam um novo nível de desempenho. Ele explora o
paralelismo inerente a muitos algoritmos de comunicação e multimídia, mas mantém total compatibilidade com os sistemas
operacionais e aplicativos existentes.
16.5.2 | SSE
Th significa 'Streaming SIMD Extension', onde SIMD significa 'Instrução Única, Dados Múltiplos'. O SSE inclui 50 novas instruções,
que permitem cálculos avançados simultâneos de mais números de ponto flutuante com uma única instrução. Ele acelera o
desempenho em uma ampla variedade de aplicativos, como vídeo, áudio, gráficos 3D e processamento de imagens.
Machine Translated by Google
16,6 | Pentium-IV
Em novembro de 2000, a Intel apresentou seu processador de sétima geração Pentium-IV, que tinha altas velocidades
de clock (a partir de 1,5 GHz) como um recurso importante, e um recurso de arquitetura totalmente novo chamado de
arquitetura 'netburst', que inclui o seguinte:
Não discutiremos tudo isso em detalhes aqui – em vez disso, falaremos sobre as novas tendências em design de
processos.
Arquivo de registro
VAI
Barramento do sistema
Interface de barramento
eu eu eu eu
Interface de barramento
um multiprocessador de chip ou CMP, ou podem ser integrados em várias matrizes em um único pacote de
chip. As Figuras 16.8a eb mostram as diferenças entre um processador de núcleo único e um processador
de vários núcleos. As figuras devem esclarecer o que exatamente um núcleo deve significar. Em um
processador de núcleo único, há apenas uma ALU e um arquivo de registro, que é o que se entende por
'núcleo'. Em um processador multicore, existem muitos desses núcleos. Os núcleos na Figura 16.8b
compartilham a mesma interconexão com o resto do sistema. Cada 'núcleo' implementa de forma
independente otimizações como execução superescalar, pipelining e multithreading – o último termo precisa
de mais explicações e isso será apresentado em breve.
Os benefícios da tecnologia multicore devem ser suportados por software – então apenas os benefícios
de desempenho serão óbvios. A pesquisa está em andamento neste campo e ser capaz de paralelizar um
programa de forma eficaz é a chave para o sucesso. Agora, para entender a ideia de paralelismo, vamos
conhecer alguns novos termos.
Machine Translated by Google
16.7.1.1 | Fio
A ideia de thread não é muito nova, só que se tornou mais relevante e importante nos dias de hoje.
Um thread de execução resulta de uma bifurcação de um programa de computador em dois ou mais
tarefas em execução. Cada fio
• cada thread tem todos os estados (instruções, dados, contador de programa, estado de registro e assim por diante)
necessário para executar.
Se um encadeamento for considerado uma 'tarefa', um único processador terá que fazer a troca de contexto para executar
vários encadeamentos. No entanto, uma thread também pode ser considerada como um subconjunto de uma tarefa,
nesse caso, a execução de threads concorrentes pode ser gerenciada pelo próprio software. Assim, como vemos abaixo,
o SO pode gerenciar multithreading com apenas uma unidade de processamento.
16.7.1.2 | Multithreading
Esta é a capacidade de um sistema operacional executar diferentes partes de um programa, chamadas de threads,
simultaneamente. O programador deve projetar cuidadosamente o programa de tal forma que todas as threads possam
ser executadas ao mesmo tempo sem interferir umas nas outras. O multithreading como um modelo de programação e
execução amplamente difundido permite que vários threads existam no contexto de um único processo. Essas threads
compartilham os recursos do processo, mas são capazes de executar de forma independente.
Quando há suporte de hardware para multithreading, o sistema se torna mais eficaz
ILP (Paralelismo de Nível de Instrução) Vimos uma série de etapas usadas no projeto de processadores Pentium para
obter mais instruções executadas em unidade de tempo. Eles incluem pipeline de instruções, arquitetura superescalar,
execução fora de ordem, previsão de desvio e execução especulativa. Todos estes são categorizados sob o título de
'paralelismo de nível de instrução'. Assim, os processadores superescalares exploram o ILP executando várias instruções
de um único programa em um único ciclo.
Processadores multicore usam TLP executando diferentes threads em paralelo nos diferentes núcleos.
Com TLP insuficiente, os diferentes núcleos ficarão ociosos.
Machine Translated by Google
Tópicos
Cache L1 Cache L1
Cache L2
Memória
Figura 16.9 | Um processador dual core com cache L1 separado e cache L2 comum
Processadores Intel Xeon de núcleo duplo A maioria dos sistemas operacionais modernos, como Linux e Microsoft
Windows, suportam TLP. Além do suporte ao sistema operacional, são necessários ajustes no software existente
para maximizar a utilização dos recursos de computação fornecidos pelos processadores multinúcleo. A Figura 16.9
mostra um processador xeon de núcleo duplo com núcleos duplos e um cache L1 separado para cada núcleo e
executando vários threads em cada núcleo.
Os processadores Intel Dual Core permitem que dois threads sejam totalmente processados em seus próprios núcleos de processador.
A tecnologia Hyper threading permite que processadores dual core executem até quatro threads simultâneos em
uníssono.
O processador Quad Core permite que quatro threads sejam processados em paralelo. A tecnologia Hyper threading
permite que processadores quad core executem até oito threads simultâneos em uníssono.
Alguns nomes de processadores da Intel foram mencionados ao longo do livro. No entanto, existem vários
outros nomes de processadores Intel que você provavelmente verá e ouvirá. Xeon é um desses nomes. Intel Xeon é
uma versão de alto desempenho dos processadores Intel para desktop destinados ao uso em servidores e estações
de trabalho de última geração. As CPUs Xeon têm os mesmos recursos dos microprocessadores de desktop Pentium
4/D, Core 2 Duo/Quad. Além disso, as CPUs Xeon podem funcionar em sistemas de processador duplo. As CPUs
Xeon geralmente têm um tamanho maior de cache de nível 2 e podem incluir um cache de nível 3 grande. Todos
esses recursos extras são necessários para sua base de aplicativos (servidores), que é mais desafiador do que um
PC desktop.
Machine Translated by Google
| O processador 80486 possui vários recursos aprimorados em comparação com seu antecessor 80386.
| Possui o modo de transferência de dados em rajada que aumenta significativamente a velocidade de transferência de dados.
| Ele tem cache de nível um colocado no chip, o que foi um grande passo na história do microprocessador.
| Um aprimoramento importante é que ele possui um barramento de dados de 64 bits, enquanto o processador é internamente
32 bits.
| Possui uma arquitetura superescalar, o que significa que possui duas unidades de execução inteiras.
| O Pentium Pro é o primeiro dos processadores Intel de sexta geração da família x86.
| A simultaneidade pode ser alcançada pelo paralelismo no nível de thread e no nível de instrução.
PERGUNTAS
1. Qual é a diferença entre 80386 DX e SX?
EXERCÍCIO
6. Encontre os nomes e recursos dos processadores multicore que não são da Intel.
7. Descubra os nomes e detalhes dos processadores da Intel, que não possuem a 'arquitetura x86'.
Machine Translated by Google
o x8 6 baseado
1 7 computador pessoal
| Por que a alta velocidade é necessária para o AGP. | As características dos computadores portáteis.
| Os barramentos de E/S, como ISA e PCI.
Introdução
Ao longo dos capítulos deste livro, foi mencionado que a aplicação mais importante do processador x86
de todas as diferentes gerações estava no computador pessoal. Os mais potentes desses processadores
são usados como servidores, mas a popularidade da série x86 decorre de seu uso como unidade de
processamento do PC, que se tornou um eletrodoméstico doméstico e de escritório – um equipamento
sem o qual a sobrevivência é muito difícil, pois se misturou ao nosso estilo de vida.
Neste contexto, este último capítulo é dedicado a criar uma compreensão do interior de um PC.
Este capítulo não foi escrito do ponto de vista de um leigo. Ele foi escrito para um leitor que tenha uma
compreensão moderadamente boa do conteúdo dos capítulos anteriores deste livro.
O objetivo deste capítulo é transmitir uma certa quantidade de conhecimento do significado das
terminologias e técnicas usadas no projeto e uso de um PC. Este capítulo visa 'compreender o PC' –
não se afirma que o leitor será capaz de configurar o seu próprio PC, actualizá-lo ou mesmo reparar o
seu PC. A questão é que, uma vez desenvolvido um entendimento básico, podem ser buscadas outras
referências pelas quais as atividades acima mencionadas possam ser experimentadas. Em resumo,
este capítulo tem como objetivo levar nosso estudo dos processadores x86 a um ponto culminante bem-sucedido.
Nota Em muitas das figuras, novos termos serão vistos. Pode ser necessário ler todo o capítulo e
depois voltar às figuras para entender esses termos. A maneira de compreender o conteúdo deste
capítulo é lê-lo uma vez, sentir os termos usados e depois lê-lo novamente desde o início.
vi) Conectores para dispositivos opcionais como disco rígido externo, memória flash, dispositivos infravermelhos,
dispositivos de dente azul, câmera digital e assim por diante.
Nesta lista, os três primeiros conjuntos são obrigatórios para qualquer sistema. O quarto e o quinto conjuntos são
necessários para obter toda a utilidade de um computador, ou seja, gostaríamos de imprimir, ouvir música, ler ou gravar
CDs/DVDs, acessar a internet e assim por diante. O último conjunto é para usos especializados. Tudo isso mostra que o
campo de aplicação dos computadores é grande, e recebemos muito serviço dele – mas um sistema tão grande com
componentes incompatíveis precisa trabalhar em sincronismo. Para todos os serviços, o chip da CPU será chamado para
ação e isso implica que cada um desses componentes deve ser capaz de se comunicar com o processador. Th é onde os
ônibus entram em cena. Sabemos que os ônibus carregam dados de endereço e informações de controle. Barramentos
rápidos são usados para comunicação entre a memória principal e o processador, e barramentos relativamente lentos são
usados para periféricos. Como os periféricos são de diferentes tipos e especificações, existem diferentes tipos de
barramentos dentro do PC – esta será uma das principais áreas de nossa discussão – qual barramento, com que velocidade
se conecta ao disco rígido, ao processamento de vídeo unidade e assim por diante. Ao longo dos anos, a largura de banda
de dados dos ônibus e a velocidade aumentaram muitas vezes – rastrearemos a evolução ao longo dos anos e
convergiremos para o que está em voga atualmente. Também tentaremos adivinhar a direção em que as mudanças estão
acontecendo. Correspondendo a cada um dos barramentos, existem conectores e devemos conhecer suas características
também.
O PC x86 começou com 8088 como sua CPU, mas o processador popular atual é o Pentium – ele é de 32 bits
internamente, mas tem uma largura de barramento de dados externo de 64 bits – processadores que são 'internamente' de
64 bits também estão surgindo – mas ainda não atingiram o mercado geral de PCs desktop/laptop. Portanto, vamos supor
que o processador em nossa discussão seja alguma versão do Pentium, cujos diferentes tipos já foram abordados no
Capítulo 16. Com esse pano de fundo, vamos tentar entender o funcionamento do PC moderno.
17.2 | A placa-mãe
Começaremos com o que é considerado a parte mais importante do PC – a placa-mãe, a placa do sistema ou simplesmente
chamada de 'placa'. Esta é a placa de circuito que contém todos os elementos essenciais para fazer um computador
funcionar – isso significa muitas coisas. O primeiro e mais importante item desta placa é a CPU, ou seja, o processador.
Além de segurar a CPU, a placa-mãe é o centro por meio do qual ocorrem todas as comunicações no sistema do
computador. Ele abriga a RAM, ROM, outro hardware e todos os periféricos estão conectados a ele. Ele também contém
todos os circuitos de controle essenciais para o funcionamento do sistema.
A placa-mãe possui slots ou soquetes para conectar vários periféricos ou sistema de suporte/
hardware. Há uma porta gráfica acelerada, que é usada exclusivamente para placas de vídeo;
Machine Translated by Google
Adaptador ATA que fornece as interfaces para os discos rígidos; ranhuras para cartões de RAM; e conectores PCI (Peripheral
Component Interconnect), que fornecem conexões eletrônicas para placas de som, placas de rede e assim por diante.
A Figura 17.1 mostra a imagem de uma placa-mãe lançada em 2003 (marca ASUS). Agora, no ano de 2009, esta é
considerada uma placa antiga. Veremos uma placa mais recente mais tarde, mas dar uma olhada na placa mais antiga nos
permitirá ver as mudanças graduais que aconteceram nas abordagens da placa-mãe, e também é útil para entender as
funções dos vários componentes que compõem a placa-mãe.
i) Jumpers, que são usados em algumas placas-mãe para configurar a tensão e vários
velocidades.
ii) Um número de pinos usados para conectar o botão de reset, como o LED para atividade do disco rígido,
alto-falante embutido.
DIMM
Processador tomadas
Soquete
Unidade de disquete
Conector
Conector ATX
Norte
Ponte ATA
Ranhura AGP
Flash Bios
Ranhuras PCI
Lítio
Sul Super
Bateria
Ponte Chip de E/S
Ethernet
Porta Paralela Porta serial
Rato
17.3 | Chipset
Uma palavra comumente usada quando se fala em placas-mãe é 'chipset'. O que exatamente é?
Um chipset é um grupo de CIs trabalhando juntos para controlar o fluxo de dados de/para e dentro da
placa-mãe. Podemos chamá-los de 'controladores' da comunicação feita neles. No Capítulo 6, descobrimos
que o 8086 precisa de vários chips para armazenamento em buffer, desmultiplexação, geração de sinais
de controle e assim por diante. Nos Capítulos 9, 10 e 11, mais chips de interface foram discutidos para
lidar com dados paralelos, dados seriais, DMA e assim por diante. Cada uma dessas funções exige o uso
de chips separados que devem ser programados individualmente. Se todas essas funções pudessem ser
feitas por um conjunto menor de chips controladores dedicados, obviamente seria ótimo – e esse é o papel
assumido pelo chipset da placa-mãe.
Para cavar um pouco da história – no IBM PC e PC-XT, vários chips adicionais foram usados para
realizar as funções do controlador de barramento, gerador de relógio, temporizador do sistema,
controladores de interrupção, controladores DMA e assim por diante. No entanto, em 1986, após o
lançamento do AT baseado em 80286, uma empresa chamada Chips and Technology introduziu um
conceito revolucionário ao projetar o 82C206. Tratava-se de um único chip que integrava nele todas as
funções dos principais chips da placa-mãe em um sistema compatível com AT. Este chip inclui as funções
do Gerador de Relógio 82284, Controlador de Barramento 82288, Temporizador do Sistema 8254,
Controladores de Interrupção 8259 duplos, Controladores DMA 8237 duplos e até mesmo o chip CMOS/Clock MC14
Isso significa que praticamente muitos dos chips em uma placa-mãe (exceto a RAM e ROM) podem
ser substituídos por um único chip. Quatro outros chips aumentaram o 82C206 atuando como buffers e
controladores de memória, assim todo o circuito da placa-mãe foi realizado com um total de cinco chips.
Este primeiro chipset foi chamado de chipset CS8220 pela Chips and Technologies.
Esta idéia logo se tornou muito popular e muitos fabricantes lançaram muitos tipos diferentes de
chipsets. Um ponto importante é que os chipsets devem ser projetados 'para' a CPU que está sendo
usada. Assim, uma vez que uma CPU fosse lançada, os fabricantes de chipsets deveriam intervir e projetar
e vender o chipset – só então o novo chip poderia ser usado em uma placa-mãe. Como a Intel continuou
lançando versões mais recentes de seus processadores, descobriu que o atraso na colocação do
processador na placa-mãe era causado pelo atraso na fabricação do chipset por outras empresas. Intel então
Machine Translated by Google
decidiu fabricar chips e chipsets compatíveis em paralelo, ganhando assim uma grande margem em termos
de tempo.
Agora, a Intel é a principal fabricante de processadores e placas-mãe com chipsets compatíveis.
Alguns outros fabricantes de chipsets, por exemplo, são VIA, NVIDIA, SiS e ASUS.
A Intel é um grande fabricante e existem outros fabricantes em Taiwan, e lentamente a China está a
caminho de se tornar um importante centro de fabricação de placas-mãe.
A Ponte Norte também lida com todo o tráfego mais rápido, como a transferência de dados de/para e
o AGP. Na placa-mãe, a Ponte Norte fica próxima ao processador e é coberta por um dissipador de calor
para cuidar da grande quantidade de calor que gera. Na Fig 17.1, o posicionamento da Ponte Norte próximo
ao slot do processador está marcado, mas não é visto como um dissipador de calor que a cobre.
O South Bridge lida com dados dos barramentos PCI, USB, ATA e ISA (agora obsoletos).
A ponte sul é um controlador para E/S que pode ser mais lento que o barramento do sistema principal.
Nesta configuração, existem portas que conectam as E/S à placa-mãe por meio de adaptadores que são
conectados aos slots (soquetes) da placa-mãe. A Fig 17.3 mostra um diagrama esquemático das pontes e
os periféricos que cada uma delas atende.
A Ponte Sul é normalmente complementada por um pequeno controlador Super I/O que cuida de
várias funções menos críticas que também costumavam ser atribuídas a chips controladores separados no
passado. Costumava ser conectado à ponte sul através do barramento ISA; em arquiteturas modernas, a
interface LPC (Low Pin Count) é usada. Por exemplo, a maioria dos chips Super I/O contém controladores
para as portas seriais, porta paralela, unidade de disquete e interface teclado/mouse. Veja a Fig 17.4 e
também veja a Fig 17.1 que mostra o chip super I/O, que é um controlador para a porta serial, porta
paralela, mouse e teclado PS/2 e uma unidade de disquete. As velocidades desses dispositivos são relativamente baixas.
Desenvolvimentos nos últimos anos levaram os fabricantes de chipsets a tentar colocar cada vez mais
funções no chipset. Essas funções extras são normalmente:
• Placa de vídeo (integrada na ponte norte)
• Placa de som (na ponte sul)
CPU ATA
Controlador PCI
Sul
Ponte
Controlador ATA
LPC
Outros dispositivos de E/S
Super E/S
O GMCH faz a interface entre o barramento do processador de alta velocidade e a interface do hub e o
barramento AGP, enquanto o ICH faz a interface entre a interface do hub e as portas ATA (IDE), as portas
SATA e o barramento PCI. O ICH também inclui um novo barramento de baixa contagem de pinos (LPC),
consistindo basicamente em uma versão do PCI projetada principalmente para suportar o BIOS ROM da
placa-mãe e os chips Super I/O.
A arquitetura IHA começou a ser usada nos chipsets da série 800 da Intel, que é a primeira arquitetura
de chipset a se afastar do design Northbridge/Southbridge. A Figura 17.5 mostra o IHA para a série de
chipsets 8xx da Intel.
Deve ser convincente que certos componentes precisam e podem transferir dados em velocidades mais altas
do que outros. Para transferência de dados de/para a RAM, a melhor situação será quando a RAM for tão
rápida quanto o processador – isso depende da SDRAM disponível. Para um processador de 133MHz, uma
SDRAM PC133 corresponde à mesma velocidade. No entanto, agora as velocidades do processador
aumentaram dinamicamente e essa RAM obviamente não será boa o suficiente para um processador novo e mais rápido
Machine Translated by Google
3,2 GB/s
ATA 100
266 MB/s
VAI
dirige
Áudio
Ranhuras PCI
E/S
Controlador
133 MB/s
Centro 2
(ICH2)
10/100
Ethernet
USB
Instantâneo
BIOS
CNR
Figura 17.5 | Componentes do IHA para uma placa-mãe Intel típica (série 8xx)
No entanto, conforme discutido no Capítulo 12, as limitações de velocidade da memória são resolvidas pelo uso de
caches. Veremos mais tarde que os designs de placas-mãe de canal duplo também tentam melhorar as velocidades de
transferência de dados.
17.4.1 | Barramento do
processador Também chamado de Barramento Frontal (FSB), este é o barramento de maior velocidade no
sistema e está no núcleo do chipset e da placa-mãe. Esse barramento é usado principalmente pelo processador
para passar informações de e para o cache ou memória principal e a Ponte Norte do chipset. O barramento do
processador em um sistema moderno roda a 800 MHz ou superior e normalmente tem 64 bits de largura.
transferência de dados que ocorre pela Ponte Norte é para o AGP. O que é AGP? Significa Accelerated
(Advanced) Graphics Port – é uma porta dedicada que liga a placa controladora gráfica de um computador
pessoal diretamente à memória do computador.
Machine Translated by Google
O barramento AGP é um barramento de 32 bits de alta velocidade projetado especificamente para uma placa
de vídeo. Como o vídeo e os gráficos 3D precisam de acesso de alta velocidade à RAM do sistema, foram
projetadas placas de vídeo especiais, com RAM on-board extra, um processador gráfico especializado e outros recursos.
No entanto, esta placa será inútil a menos que tenha acesso de alta velocidade à CPU e à RAM do sistema.
Essa necessidade fez com que a Intel projetasse uma porta especial para ele, localizada próxima ao processador
conectado à Ponte Norte ou Hub Controlador de Memória do chipset e se manifesta como um único slot AGP nos
sistemas que o suportam.
AGP é um barramento de alta velocidade com uma frequência de clock de 66,66 MHz. No modo básico,
chamado AGP 1x, existe apenas um canal de transferência de 32 bits (4 bytes) fazendo com que sua largura de
banda seja de 66,66 × 4 = 266 MBps. Existem placas AGP numeradas como 2x, 4x e 8x ÿ 2, 4e 8 são o número
de canais de transferência de dados possíveis, onde a taxa de dados para 8x deve obviamente ser 266 × 8 MBps.
Na Fig 17.1, é visto um slot AGP que suporta taxa de transferência x4. Observe que ele tem o mesmo tamanho do
soquete PCI, mas é de cor diferente e não está na mesma linha dos soquetes PCI.
A razão para ter uma porta AGP especial na ponte norte é que o processamento gráfico, especialmente os
gráficos 3D, precisam de processamento de alta velocidade. Conectar uma placa gráfica dedicada ao PCI (veremos
o que é, em breve) significava que o processamento gráfico estaria sujeito à limitação de velocidade do barramento
PCI. Foi idéia da Intel ter uma porta AGP na ponte norte, em vez de os dados terem que ser buscados através do
barramento de expansão PCI. O AGP pode lidar com pelo menos o dobro da taxa de transferência de um
barramento PCI padrão. O AGP foi desenvolvido pela Intel e o suporte AGP foi adicionado a versões posteriores
do Microsoft Windows. No entanto, isso também perdeu sua relevância com o advento do novo PCI Express. Nas
placas-mãe feitas depois de 2006, a interface gráfica PCI Express (PCIe) mais recente e mais rápida substituiu
mais ou menos o AGP.
17.5.1 | UM ônibus
ISA significa 'Arquitetura de Padrões da Indústria' e existiu por muito tempo, durante o qual houve modificações.
Seguiu-se o EISA (Extended ISA) – depois veio o barramento VESA, o barramento VL e também a Arquitetura de
Microcanais (MCA).
O ISA, que era um barramento de 8 MHz e 16 bits, desapareceu dos sistemas recentes após aparecer pela
primeira vez no PC original na forma de 8 bits e 5 MHz e no IBM AT de 1984 na forma de 16 bits e 8 MHz. Esse
barramento estava diretamente relacionado aos processadores para os quais foi criado – 8088 e 80286. Nos
padrões atuais, é um barramento muito lento – mas era suficiente no início para os periféricos lentos da época.
Na busca de um barramento mais rápido, a Intel criou o MCA (Microchannel Architecture) que era um
barramento de 32 bits, mas também poderia ser usado para aplicativos de 16 bits. Foi uma melhoria em relação
ao ISA, mas não chegou ao mercado de PCs desktop.
Nessa época, foram feitas tentativas de melhorar o ISA, e barramentos como EISA (32 bits a 8 MHz), VL-Bus
(desenvolvido para vídeo pela VESA, a Video Electronics Standards Association)
foram tentados, mas nenhum deles realmente fez uma grande diferença. O ônibus VL estava bom para apenas um
Machine Translated by Google
dispositivo, mas quando mais dispositivos entraram em cena, havia uma chance de interferir nas atividades da CPU -
essa era sua desvantagem.
PCI significa Peripheral Component Interconnect e substituiu o barramento ISA na placa-mãe. Durante o início da
década de 1990, a Intel introduziu um novo padrão de barramento – o barramento PCI (Peripheral Component
Interconnect). PCI apresenta uma espécie de híbrido entre ISA e VL-Bus.
Como este é o barramento de E/S usado atualmente (mas está sendo rapidamente substituído pelo PCI Express),
vamos nos aprofundar um pouco mais. A Figura 17.1 mostra três soquetes PCI.
Os sistemas que integravam o barramento PCI tornaram-se disponíveis a partir de 1993 e assim permaneceram.
As informações normalmente são transferidas através do barramento PCI a 33 MHz e 32 bits por vez.
A largura de banda é de 133 MBps, como mostra a fórmula a seguir:
Embora PCI de 32 bits e 33 MHz seja o padrão encontrado na maioria dos PCs, agora existem várias variações.
Existem as versões PCI de 66 MHz e 32 bits e as versões de 64 bits e 66 MHz e até mesmo a PCI de 133 MHz de 64
bits. A última versão é usada principalmente em servidores.
Anteriormente, os problemas de configuração eram tratados por jumpers em cada placa adicional. Esses
jumpers selecionariam memória ou espaço de E/S, vetores de interrupção e canais DMA. Tudo isso exigia
experiência e um conhecimento bastante bom do hardware e software associados. Se configurado incorretamente,
o resultado seria um sistema com falhas de difícil diagnóstico. O advento do PCI, com seu recurso plug 'n play,
resolveu esses problemas.
iv) O barramento PCI permite o que é chamado de 'bus mastering', o que significa que permite que qualquer
periférico assuma o controle do barramento – isso é mais relevante para DMA entre periféricos e memória
principal.
A Fig 17.6 mostra quatro slots PCI em uma placa-mãe.
bem como conectores PCIe existentes lado a lado. Uma consequência direta do advento deste novo padrão
foi o desaparecimento dos conectores AGP da placa-mãe. O design atual das placas AGP é baseado em
PCIe.
Os slots PCIe começaram a aparecer nas placas-mãe a partir de 2004. Consulte a Fig 17.7, que mostra
três slots PCIe lado a lado. Por que eles têm comprimentos diferentes? Obviamente, por atender a um número
diferente de pistas. O mais longo da Fig 17.7 é um conector 16x para uma placa gráfica avançada, exigindo
transferência de alta velocidade e, portanto, mais pistas. Os conectores PCIe estão disponíveis em configurações
1x, 4x, 8x e 16x.
Os tamanhos dos conectores com diferentes fatores de escala do PCI Express são diferentes. O conector
PCIe 1x possui 36 pinos de sinal, o conector 4x possui 64 pinos de sinal, o conector 8x possui 98 pinos de sinal
e o conector 16x possui 164 pinos de sinal. Uma placa PCI express é compatível para cima, então uma placa 1x
caberá em qualquer slot de cartão, uma placa 4x caberá em uma porta 8 ou 16x e assim por diante. Uma placa
adaptadora usando pistas de 16x só caberá em um conector de tamanho x16, obviamente.
Uma característica importante deste novo barramento é que ele é 'hot pluggable' e hot swappable. o que
essas palavras significam? A troca a quente descreve a alteração de componentes sem interrupção significativa
do sistema, enquanto a troca a quente descreve a alteração ou adição de componentes que interagem com o
sistema operacional. Não é necessário desligar o computador enquanto faz isso – é semelhante à porta USB,
por exemplo.
17.5.4 | USB
Esta significa Universal Serial Bus e é uma interface muito importante para os usuários – todos nós
experimentamos a facilidade de conectar diferentes tipos de dispositivos ao PC através da porta USB.
A porta USB está disponível no gabinete (pode ser colocada na parte frontal ou traseira) – e é hot pluggable e
hot swappable – esses recursos o tornam muito útil para nós usuários – agora a tendência é mudar muito os
periféricos à porta USB – assim temos impressoras, mouses, teclados, scanners, câmeras, disco rígido externo
e assim por diante, todos interligados ao PC através da porta USB.
Comecemos pela sua história. A especificação USB 1.0 foi introduzida em 1996. A especificação USB 1.0
original tinha uma taxa de transferência de dados de 12 Mbit/s. O USB foi criado por um grupo central de
empresas que consistia em Compaq, Digital, IBM, Intel, Northern Telecom e Microsoft. Um dos co-inventores do
USB foi Ajay Bhatt, que mais tarde recebeu crédito da Intel. A especificação USB 2.0 foi lançada em abril de
2000 e padronizada no final de 2001, com taxa de dados de 480 Mbit/s.
A especificação USB 3.0 foi lançada em 12 de novembro de 2008 pelo USB 3.0 Promoter Group. Sua taxa de
transferência máxima é até 10 vezes mais rápida que a versão USB 2.0. Foi apelidado de 'Super Speed USB'. A Intel
diz que o aumento de velocidade é possível usando fibra ótica além dos fios comuns. A porta USB 3.0 será compatível
com as portas USB atuais. Quais são os equipamentos que necessitam desta alta taxa de sinalização? Os discos
rígidos, mouses e impressoras atuais provavelmente têm velocidade muito limitada para usar os novos 4,8 Gigabit/
s de largura de banda, mas poderíamos usar a largura de banda para transportar sinais de vídeo de alta definição.
Muito em breve, podemos esperar aplicações inovadoras para este novo padrão que está apenas começando a abrir
suas asas.
O Universal Serial Bus é controlado por host e pode haver apenas um host por bus. Um sistema USB consiste em um
controlador de host e vários dispositivos conectados em forma de árvore usando dispositivos de hub especiais. Os
hubs podem ser em cascata, até 5 níveis. Até 127 dispositivos podem ser conectados a um único controlador de host.
Para o usuário, isso significa que até 127 dispositivos podem ser conectados a qualquer barramento USB a qualquer
momento. E se mais dispositivos precisarem ser usados? Basta adicionar outra porta/host.
USB, como o próprio nome sugere, é um barramento serial. Utiliza 4 fios blindados dos quais dois são de
alimentação (+ 5 V e GND). Os dois restantes são sinais de dados diferenciais de par trançado. Ele usa um esquema
de codificação NRZI (Non Return to Zero Invert) para enviar dados com um campo de sincronização para sincronizar
os relógios do host e do receptor. O USB suporta plug and play com drivers carregáveis e descarregáveis
dinamicamente. Isso significa que o usuário simplesmente precisa conectar o dispositivo no barramento. O host
detectará essa adição, interrogará o dispositivo recém-inserido e carregará o driver apropriado, desde que um driver
esteja instalado para o dispositivo conectado. O usuário final não precisa se preocupar com termos como IRQs e
endereços de porta ou reinicializar o computador. Quando o uso terminar, o usuário pode simplesmente desconectar
o cabo – o host detectará sua ausência e descarregará automaticamente o driver.
Todos os periféricos USB são escravos que obedecem a um protocolo definido. Eles devem reagir às transações
de solicitação enviadas do PC host. O periférico responde a transações de controle que, por exemplo, solicitam
informações detalhadas sobre o dispositivo e sua configuração. O periférico envia e recebe dados de/para o host
usando um formato de dados USB padrão. Esta movimentação de dados padronizada de/para o host do PC e
interpretação pelo periférico, dá ao USB sua enorme fl exibilidade com pequenas alterações no software do host do
PC. Agora, a porta USB está disponível em vários outros dispositivos, como tocadores de música dedicados - assim,
tornou-se onipresente (o que significa que é como ser onipresente).
O conector USB fornece um único fio de 5 volts a partir do qual os dispositivos USB conectados podem alimentá-los.
Um determinado segmento do barramento é especificado para fornecer até 500 mA. Isso geralmente é suficiente para
alimentar vários dispositivos, embora esse orçamento deva ser compartilhado entre todos os dispositivos a jusante de
um hub sem energia. Um dispositivo alimentado por barramento pode usar tanto dessa energia quanto permitido pela
porta à qual está conectado. Quando os dispositivos USB (incluindo hubs) são conectados pela primeira vez, eles são
interrogados pelo controlador do host, que pergunta a cada um deles qual é o requisito máximo de energia. Dispositivos
que precisam de mais de 500 mA de corrente podem usar uma fonte de alimentação externa – assim, vemos
impressoras e certos discos rígidos externos com fonte de alimentação externa, enquanto mouses e teclados baseados
em USB não precisam de energia extra.
Machine Translated by Google
17.6 | ATA
Agora, vamos voltar e olhar para o hub do controlador South Bridge/IO na Fig 17.1. Existe uma palavra ATA – o que ela
significa e com o que ela se conecta? A palavra ATA significa AT Attachment, onde AT representa o barramento AT (o
barramento ISA) que foi encontrado no PC-AT.
Esta designação refere-se ao fato de que esta interface foi originalmente projetada para conectar um drive e um
controlador combinados diretamente ao barramento de 16 bits encontrado nos computadores do tipo PC-AT. Este tipo
de interface também é chamado de IDE ou Integrated Drive Electronics que é um termo de marketing usado por algumas
empresas para implicar que os controladores do disco rígido foram integrados ao próprio disco, em vez de tê-lo como
um complemento separado. no cartão conectado ao barramento ISA (como foi feito anteriormente). O ATA é pensado
principalmente como a interface para o disco rígido, embora também se refira à unidade das unidades ópticas (CD/DVD).
a menor unidade de armazenamento físico em um disco e quase sempre tem 512 bytes de tamanho (Fig 17.8).
Cada placa de disco rígido é dividida em faixas. Cada trilha é subdividida em vários setores, a menor unidade do
disco. Um setor normalmente contém 512 bytes de dados. Os arquivos individuais são gravados em vários setores do
disco (pelo menos um) e essa tarefa é realizada pelo sistema de arquivos que faz parte do sistema operacional. Ao
longo dos anos, a capacidade do disco rígido aumentou, devido a dois fatores – as placas magnéticas tornaram-se mais
densas e leem/
cabeças de gravação tornaram-se mais rápidas. Juntos, isso levou a discos rígidos mais rápidos com capacidade muito
alta.
Muitas versões do ATA apareceram ao longo dos anos. As taxas de dados mais recentes são ATA/66 a 66 MB/
segundo, ATA/100 a 100 MB/segundo e ATA/133 a 133 MB/segundo. Até o padrão ATA/66, o cabo de conexão tinha
apenas 40 condutores, mas os mais novos têm 80 condutores,
Machine Translated by Google
Uma trilha
1 Setor = 512 bytes
Figura 17.9 | PCB sob o disco rígido com um controlador e eletrônica de unidade associada
Mestre
Canal principal
ATA Escravo
Ônibus
Mestre
Hospedeiro
Controlador Mestre
Canal secundário
Escravo
com cada linha tendo uma conexão de aterramento individual, eliminando assim ruídos e conversas cruzadas e
melhorando a largura de banda. A Fig 17.11 mostra dois conectores ATA em uma placa-mãe.
Após o ATA/133, o serial ATA (SATA) entrou em cena – ele foi projetado para ser compatível com
versões anteriores do ATA paralelo (também chamado de PATA), o que significa apenas que o Serial ATA é
compatível com o software ATA paralelo – ele emula totalmente todos os comandos, registros e controles, para
que o software existente seja executado na nova arquitetura sem nenhuma alteração. Em outras palavras, o
BIOS, os sistemas operacionais e os utilitários existentes que funcionam no ATA paralelo também funcionam
no Serial ATA. No entanto, SATA é um padrão serial; é uma interface que usa cabos com apenas 7 fios em vez
dos cabos de 40/80 fios usados na interface Parallel ATA.
As unidades ópticas também estão se tornando mais prontamente disponíveis com conexões SATA.
As taxas de dados SATA são 150 MBps para SATA-150, 300 MBps para SATA-300 e 600 MBps para SATA-600.
Veja os conectores SATA de tamanho menor (quatro) na Fig 17.12.
Machine Translated by Google
A RAM nos primeiros dias foi fabricada como um chip DIP. Agora, as RAMs estão na forma de
módulos, que são placas com os chips de RAM embutidos e que podem ser plugados em soquetes feitos
para esse fim. São placas de circuito impresso com um lado dedicado à colocação dos chips de memória.
O módulo anterior mais popular era chamado SIMM (Single In Line Memory Module). Costumava haver
SIMMs para memórias de 8 bits e 16 bits para os PCs da geração anterior. Existem dois tipos de módulos
SIMM, de acordo com o número de conectores: módulos SIMM com 30 conectores são memórias de 8
bits com as quais os PCs de primeira geração foram equipados ('286, '386), módulos SIMM com 72
conectores são memórias capaz de armazenar 32 bits de dados simultaneamente. Essas memórias são
encontradas em PCs desde o 386DX até os primeiros Pentiums. No Pentium que possui um barramento
de dados de 64 bits, são necessários dois módulos SIMM.
O módulo de memória popular atual é o DIMM (Dual In Line Memory Module) e sua diferença mais
importante é que é uma memória de 64 bits. Como o Pentium e muitos outros processadores têm largura
de barramento de 64 bits, dois SIMMs instalados em pares combinados podem ser substituídos por
apenas um módulo DIMM. Fisicamente, os DIMMs diferem dos SIMMs de maneira importante. Os SIMMs
têm contatos em ambos os lados da placa de circuito, mas estão ligados entre si (são chamados de
conexões redundantes). DIMMs também possuem contatos em ambos os lados – porém eles possuem
conexões separadas em cada lado da placa de circuito. Portanto, um DIMM de 168 pinos tem 84 pads
em cada lado, mas eles não são redundantes. Isso permite que a embalagem seja menor, mas torna os
DIMMs um pouco mais sensíveis à inserção correta e bom contato elétrico.
DIMMs estão disponíveis com faixas de 72 pinos a 240 pinos, que atendem a diferentes aplicações.
Por exemplo, um DIMM de contorno pequeno (SO) com 72 pinos é usado em laptops para oferecer
suporte à miniaturização. Veja as fotos do módulo DIMM DDR e do módulo DDR2 nas Figuras 17.13 e
17.14 respectivamente.
A RAM é classificada com um número na forma xyyy, que é uma medida do número de ciclos de
clock necessários para acesso no modo de rajada (Seção 12.3). A DRAM assíncrona padrão de 60ns
normalmente é executada com temporização do modo de rajada 5-3-3-3 (Seção 12.3). Isso significa que
o primeiro acesso leva um total de cinco ciclos e os ciclos consecutivos levam três ciclos cada. Sem a
técnica de rajada, o acesso à memória seria 5-5-5-5 porque a latência total é necessária para cada
transferência de memória. Isso levaria 20 ciclos, enquanto os modos de rajada precisam de apenas 14 ciclos.
Figura 17.13 | DIMM para DDR – com três entalhes nas laterais e um entalhe ao longo dos contatos
Machine Translated by Google
O desempenho da SDRAM ainda é melhor. Um tempo de SDRAM típico para um acesso de rajada seria 5-1-1-1, o
que significa que quatro leituras de memória seriam concluídas em apenas oito ciclos de barramento do sistema.
Nos controladores de memória que suportam dois canais, a conexão do barramento de dados com a RAM é
de 64 × 2 = 128 linhas, que devem ser conectadas a dois módulos de memória. A CPU pode então acessar esses
128 bits em paralelo, o que teoricamente duplica a largura de banda da memória e aproxima as velocidades de
acesso à memória às velocidades do processador. Por exemplo, muitos dos chipsets da família Intel 8xx usam
memória DDR de canal duplo. Eles também suportam o barramento de sistema do processador Pentium–4 de 800
MHz, que pode transferir 8 bytes (64 bits) por vez para uma largura de banda de 800 × 8 =
6.400 MBps. Esta é a velocidade na qual o processador 'pode' acessar a memória. Mas, como obter memória para
corresponder a essa velocidade? Com um processador FSB de 800 MHz instalado, essas placas possuem
controladores de memória com 128 linhas de dados que se conectam a dois módulos de memória padrão PC3200,
que operam em paralelo. Assim, a largura de banda total é agora 3200 × 2 = 6400 Bps, o que pode
Machine Translated by Google
corresponder à velocidade do processador. Os resultados práticos não coincidem com esses números calculados,
mas há definitivamente uma melhora. (Há também uma arquitetura de canal triplo para alguns dos chipsets de
processadores mais recentes da Intel).
Para garantir os benefícios da dual channeling, esta facilidade deve estar habilitada na BIOS e, é obrigatório
ter dois módulos de memória em dois soquetes, instalados corretamente (consulte o manual do chipset). Assim,
se for usar 2 GB de memória, ela deve ser instalada como dois módulos de 1 GB (em soquetes da mesma cor),
em vez de um único módulo de 2 GB. Para obter ajuda na instalação correta, os soquetes DIMM são codificados
por cores nos chipsets Intel. A Fig 17.15 mostra quatro desses soquetes DIMM de canal duplo. Outras placas-
mãe não seguem o mesmo método de identificação.
Assim, vemos que os drivers para todos os hardwares estão na ROM do sistema como rotinas de 'BIOS'.
Essa ideia de colocar todos os drivers na ROM do sistema foi pensada e implementada há muito tempo, durante
o período inicial de desenvolvimento do PC, e surpreendentemente essa ideia ainda está em voga – mas
algumas coisas mudaram, obviamente. Sabemos que muitos anos atrás, o número de dispositivos externos que
podiam ser conectados ao PC eram apenas alguns - então, naturalmente, os drivers de dispositivo desses
poderiam caber na ROM disponível.
Agora, as coisas mudaram – além dos muitos novos dispositivos de hardware que precisam ser conectados
ao PC, existem vários tipos e marcas de cada um desses dispositivos – como vídeo alimentado por hardware
extra que entrou no PC como uma placa adaptadora – existem muitos tipos de placas de vídeo com ampla gama
de especificações feitas por diferentes fabricantes. Naturalmente, os drivers de todos eles não podem ser pré-
programados no BIOS do sistema. O método de usar essas novas placas adaptadoras é ter nessa placa uma
ROM contendo os drivers de dispositivo necessários. A ROM do sistema é pré-programada para escanear uma
área predeterminada da memória procurando por qualquer ROM de placa adaptadora e, se alguma for
encontrada, seu código é testado e subsequentemente executado, essencialmente ligando-os e adicionando sua
funcionalidade ao BIOS existente. Assim, a ROM do sistema adquiriu os drivers dessas placas adaptadoras,
expandindo assim a funcionalidade do BIOS do sistema. Essa idéia é importante, especialmente para hardware
como adaptadores de vídeo, porque o monitor não funcionará a menos que o adaptador de vídeo seja instalado
primeiro. Para o não tão essencial
Machine Translated by Google
(para inicialização), os drivers são colocados nos arquivos do SO que podem ser carregados na RAM do sistema
e também vinculados aos drivers na ROM do BIOS do sistema.
Com o tempo, as coisas foram mudando. A tendência voltou-se para os fabricantes de novos hardwares e
adaptadores que escrevem seus próprios drivers de dispositivo e os carregam na RAM durante a inicialização.
Como os sistemas operacionais mais recentes são de 32 bits/64 bits, os drivers de dispositivo também são
semelhantes. Esses novos drivers de dispositivo são carregados na RAM logo após a inicialização. Assim, a
funcionalidade dos drivers originais de 16 bits no BIOS do sistema é substituída pelos novos drivers, e o BIOS
ROM existe apenas para iniciar o sistema, inicializar hardware específico, oferecer segurança e realizar alguns
procedimentos iniciais básicos. configuração. No entanto, depois que o sistema operacional é carregado, um
novo conjunto de drivers que agora estão na RAM assume o controle. No entanto, sabemos que podemos usar o
ROM BIOS no modo DOS, porque o DOS é um sistema operacional de 16 bits.
Os sistemas de PC modernos não usam mais o chip Motorola – em vez disso, eles incorporam as funções
desse chip no chipset da placa-mãe (South Bridge) ou chip Super I/O, ou usam uma bateria especial e um
módulo NVRAM. Devido à capacidade de baixo consumo de energia do CMOS, a vida útil da bateria dura até
dez anos. A memória e o relógio em tempo real são geralmente alimentados por uma célula tipo moeda de lítio
CR2032 (Ver Fig 17.1).
Muitos sistemas mais novos têm RAM CMOS com capacidade de 2 KB a 4 KB ou mais. O espaço extra é
usado para armazenar as informações do Plug and Play detalhando a configuração das placas adaptadoras e
outras opções no sistema. Como tal, não existem padrões 100% compatíveis para como as informações CMOS
são armazenadas em todos os sistemas, mas todas as informações armazenadas aqui são consideradas como
parte do próprio ROM BIOS e, portanto, novamente significa que estão diretamente relacionadas ao hardware
da placa-mãe.
DIMM
tomadas
Processador
Fã
Aquecer
Afundar
Escurecer
Figura 17.17 | Outra visão da mesma placa-mãe com o processador coberto e um DIMM (módulo de memória) inserido
por isso. Estes são vistos na Fig 17.17. Nesta figura, um módulo DDR é mostrado em um dos soquetes
DIMM.
Agora, cabe ao leitor interessado descobrir como é uma placa-mãe muito nova.
A mudança mais observável será que o número de slots PCI será menor - pode haver um slot PCI e
muitos slots PCIe. Outra mudança importante serão os conectores na parte traseira do gabinete – veja
a Fig 17.18. Não há porta paralela ou porta serial; como mencionado nos capítulos anteriores, eles
estão prestes a se tornar obsoletos – mas às vezes são retidos como portas legadas ou para dispositivos
especiais. Por exemplo, no Capítulo 9, usamos um kit de treinamento para o qual o código binário do
nosso programa foi baixado do PC usando uma porta serial. Isso significa que uma porta serial deve ser
especificada ao solicitar o PC para uso junto com o kit de treinamento. Outra opção seria usar um
conversor USB para porta serial.
A outra grande mudança é que existem várias portas USB – por quê? O USB tornou-se um
barramento muito popular e muitos dispositivos diferentes podem ser conectados através dele – assim,
mouses, teclados, impressoras, modems e cartões de memória podem ser conectados a essa porta
muito versátil chamada porta USB. Esta placa, mostrada na Fig 17.18, tem os conectores PS/2 para
mouse e teclado, mas muitos PCs novos são equipados apenas com portas USB para esses dois periféricos também.
Machine Translated by Google
Existem dois conectores de vídeo – um é a porta VGA comum, para conectar a um monitor analógico
– o outro é a porta DVI (Digital Video In) que fornece uma saída digital para conectar a um monitor
digital. Há também uma porta Firewire. O que é uma porta fi rewire? É uma porta serial semelhante
ao USB. FireWire é um método de transferência de informações entre dispositivos digitais,
especialmente equipamentos de áudio e vídeo. Também é conhecida como porta IEEE 1394. A porta
FireWire é de uso comum desde 1995, quando a Apple Inc. começou a incluir a porta em várias
filmadoras digitais. O IEEE 1394 foi adotado como interface de conexão padrão HANA (High-Definition
Audio-Video Network Alliance) para comunicação e controle de componentes A/V (áudio/visual).
Muitos tipos de equipamentos, como câmeras digitais e filmadoras, costumavam ter portas de fiação,
que agora foram substituídas por portas USB. No entanto, equipamentos premium e profissionais
para áudio e vídeo ainda possuem essas portas. FireWire é rápido – a versão mais recente atinge
velocidades de até 800 Mbps. Em algum momento no futuro, espera-se que esse número salte para
inacreditáveis 3,2 Gbps.
17.11 | PS/2
O que é PS/2? Isso significa IBM Personal System/2, uma versão do PC lançada pela IBM em 1987.
Há um pouco de história associada a isso. Foi a IBM que fabricou o primeiro PC e também o
popularizou. No entanto, logo, muitos outros fabricantes se apresentaram para fazer clones do IBM-
PC. Sentindo que deveria estabelecer seu domínio sobre o mercado de PCs, a IBM lançou um
modelo proprietário chamando-o de IBM PS/2. Ele tinha muitos recursos novos e bons, como o
barramento MCA, uma nova versão do SIMM e assim por diante. No entanto, devido ao alto custo da
arquitetura proprietária, ela não conseguiu segurar o mercado e logo foi considerada um fracasso
comercial. No entanto, muitos dos padrões usados neste modelo foram adotados e permaneceram
no mundo dos PCs. Foi no modelo PS/2 que o pequeno disquete de 3,5'' foi introduzido e também o
SIMM de 72 pinos que se tornou um padrão por si só. Também os conectores PS/2 do teclado e
mouse ainda estão por aí, embora estejam sendo gradualmente substituídos por versões USB. O
padrão VGA para vídeo foi introduzido no PS/2 e também se tornou um padrão.
Para concluir, digamos que o PS/2 foi um fracasso para a IBM, mas contribuiu para a indústria de
PCs.
posicionamento de conectores, orifícios de parafusos e assim por diante. O maior componente (e também o mais
importante) em um PC é a placa-mãe – seu tamanho, posição, ângulo em que é colocado são importantes. É com
base nisso que o sistema de refrigeração, as placas plug-in e a posição da fonte de alimentação podem ser
decididas. Por tudo isso, o formato é um padrão e, ao longo dos anos, os padrões mudaram – as placas-mãe mais
antigas foram feitas para o gabinete AT. A partir de 1996, o gabinete ATX (AT Extended) é o padrão mais popular e
existem versões dele como mini e micro-ATX. O padrão ATX mudou um pouco desde o ano em que foi introduzido
até agora.
Veja os conectores ATX na Fig 17.1 e Fig 17.15. Eles são os conectores de alimentação necessários para os
componentes da placa-mãe (há outros conectores de alimentação para o disco rígido e unidades ópticas).
Anteriormente, os conectores ATX tinham 20 pinos, mas os conectores mais novos têm 24 conexões para dar conta
de algumas dimensões de tensão extra.
Uma fonte de alimentação ATX não se conecta diretamente ao botão liga/desliga do sistema, permitindo assim
que o computador seja desligado via software. Todos nós já vimos a sequência de como um computador é desligado
com o sistema operacional iniciando e controlando. No entanto, todas as fontes de alimentação ATX têm um
interruptor manual na parte traseira para garantir que o computador esteja realmente DESLIGADO e que nenhuma
energia seja enviada aos componentes. Se esta chave estiver LIGADA, a energia ainda flui para os componentes
mesmo quando o computador parece estar desligado.
Em 2003, a Intel propôs o BTX (Balanced Technology Extended)
como sucessor do ATX. Esses gabinetes estão ficando disponíveis - na verdade, a mudança de ATX para BTX tem
sido bastante lenta. O BTX é projetado para eventualmente substituir o fator de forma ATX. Um dos principais pontos
de foco são os requisitos de refrigeração dentro do gabinete, devido aos crescentes requisitos de energia dos
componentes da placa-mãe.
Com processadores que excedem 1000 W em saída térmica, bem como reguladores de tensão, chipsets de
placas-mãe e placas de vídeo aumentando a carga térmica em um sistema, o BTX foi projetado para permitir que
todos os componentes principais produtores de calor sejam montados em linha a partir de frente para trás, para que
um único módulo térmico de alta eficiência (dissipador de calor) possa resfriar o sistema. Portanto, a ideia de ter
mais e mais fãs não precisa ser acatada. A placa-mãe é colocada de tal forma que o fluxo de ar através do gabinete
seja mais fácil. O próprio gabinete foi modificado para que as aberturas frontais e traseiras estejam disponíveis para
enviar o fluxo de ar necessário pela placa-mãe e pela parte traseira do computador. Os demais componentes da
placa-mãe também foram deslocados para acomodar todo esse posicionamento.
Efetivamente, o fator de forma BTX tenta aumentar o resfriamento do gabinete para que possa fornecer um
fluxo constante de ar fresco que os componentes modernos de alta potência precisam, minimizando a quantidade
de ruído que ele cria. O redesenho da placa-mãe deve permitir que isso aconteça com um mínimo de resfriamento
ativo (como, por exemplo, usando ventoinhas), com um único 'módulo térmico' tanto resfriando o processador quanto
criando o fluxo de ar que resfria os outros componentes. Além do ATX e do BTX, existem gabinetes de tamanho
menor com esses padrões – são os mini ATX, micro ATX, mini BTX e assim por diante.
Esses são padrões para design geral de placas-mãe e gabinetes – mas as empresas fabricantes de PCs
geralmente não aderem a esses padrões. Eles têm seus próprios designs proprietários – pense na Dell, HP, Compaq
e seus computadores. O problema de tais projetos proprietários é que é preciso voltar a eles para atualização, reparo
e assim por diante. Não se pode simplesmente pegar um componente 'de prateleira' e usá-lo nesses projetos
proprietários.
17.13 | Laptops
Os PCs que discutimos até agora são chamados de desktops, pois são colocados em mesas e projetados para
serem estacionários – portanto, peso e dimensões não são um grande problema. O uso de
Machine Translated by Google
laptops (também chamados de notebooks), em vez de desktops está em alta e possuir um laptop está se
tornando uma moda e uma mania. Então, vamos dar uma olhada em um laptop e seus recursos.
Um laptop é um PC portátil – o que significa que duas de suas características importantes devem ser
compacidade e baixo peso. Assim, em laptops, muitos sacrifícios têm que ser feitos resultando em menos
desempenho – mas para superar essas limitações, processadores especiais de baixo consumo de energia,
pequenos dissipadores de calor, placas especiais, gabinetes pequenos e afins estão sendo pensados,
pesquisados e estão sendo desenvolvidos. A probabilidade é que os laptops tenham todas as suas funções
integradas à placa-mãe, incluindo os controladores e processadores de vídeo, som e assim por diante. A
possibilidade de adicionar cartões extras é quase zero. A capacidade do disco rígido e a memória RAM também serão men
Ao comprar um laptop, as especificações devem ser decididas ali mesmo – porque a possibilidade de
atualização é improvável. No máximo, um slot de memória extra está disponível – mas isso pode ser tudo.
Há também um mini laptop que agora está disponível, que é chamado de 'netbook'. Não é muito diferente
de um laptop, mas suas especificações são menores – o que significa que seu poder de computação é muito
menor, mas é suficiente para aplicativos comuns como navegação na web e computação de escritório – suas
principais características são o baixo peso e tamanho pequeno – as telas são pequenas (9'' a 10''). Ele pode ser
transportado confortavelmente durante a viagem, mas em casa (ou no escritório), telas externas e teclados
podem ser conectados a ele para facilitar o uso. As unidades ópticas também podem ser externas, conectáveis
através da porta USB.
No outro extremo do espectro, existem laptops de alto desempenho com modelos especiais projetados
com recursos gráficos extras e excelentes adicionados. Por exemplo , 'Alienware' é um laptop para jogos de
última geração que possui recursos gráficos extraordinários, o que também é útil para edição de vídeo e
aplicativos semelhantes. A empresa foi criada em 1996, e foi adquirida pela Dell em 2006. No entanto, tem o
status de subsidiária da Dell, mantendo sua autonomia ao usar táticas de mercado e economias de escala da
Dell, servindo para reduzir seu fator custo – mas ainda é um laptop bastante caro. No geral, um laptop é uma
boa ideia, mas pelo mesmo preço, um modelo mais sofisticado de desktop pode ser comprado.
Laptops e desktops Enquanto a Fig 17.19 mostra dois laptops com tamanhos de tela de 12'' e 9'' – entenda
que os tamanhos de tela são medidos 'diagonalmente' – a Fig 17.20 mostra um desktop com um gabinete alto
e proprietário da Dell junto com um teclado e um monitor .
Machine Translated by Google
| Os chipsets consistem em dois chips importantes que são a Ponte Norte e a Ponte Sul.
| A Ponte Sul pode ter um chip adicional chamado chip Super I/O.
| A Intel mudou sua arquitetura de chipset para o que é chamado de 'Intel Hub Architecture'.
| Tem havido uma série de barramentos de expansão usados em PCs e um desses barramentos é o barramento ISA que
está obsoleto agora.
| O barramento mais recente é o barramento PCI que também está gradualmente dando lugar ao PCI-Express.
Machine Translated by Google
| PCI Express e USB são barramentos seriais ao contrário dos barramentos paralelos de épocas anteriores.
| O controlador para as unidades de disco rígido e unidades ópticas está integrado na própria unidade.
| O ATA paralelo está sendo gradualmente substituído pelo ATA serial (SATA).
| A versão PS/2 dos computadores pessoais foi um desastre comercial para a IBM, mas os padrões e
tecnologia que introduziu enriqueceram o mundo do PC.
| A palavra 'fator de forma' refere-se às dimensões físicas dos componentes importantes de um sistema.
O fator de forma correspondente ao BTX é a tendência atual do mercado.
| Os laptops são uma forma portátil do PC de mesa, e muitos compromissos são feitos em seu design, por
enfatizando a portabilidade.
PERGUNTAS
1. Quais são as funções de uma placa-mãe de PC?
14. Por que a memória de dois canais não é tão rápida quanto é anunciada?
EXERCÍCIO
3. Conheça a história da memória RDRAM, inclusive como ela perdeu relevância, apesar de ter sido uma tecnologia muito
promissora.
Machine Translated by Google
apêndice a
8086
microprocessador hmos de 16
bits 8086/8086-2/8086-1
A CPU Intel 8086 de 16 bits de alto desempenho está disponível em três taxas de clock: 5, 8 e 10 MHz. A CPU é implementada em N-Channel,
carga de depleção, tecnologia de porta de silício (HMOS-III) e empacotada em um pacote de plástico ou CERDIP de 40 pinos. O 8086 opera em
configurações de processador único e de vários processadores para atingir altos níveis de desempenho.
TROCA
ARQUIVO DE REGISTRO ARQUIVO DE REGISTRO
SEGMENTO
DADOS,
REGISTRO E
PONTEIRO, E
INSTRUÇÃO
REGRAS DE ÍNDICE
PONTEIRO
(8 PALAVRAS)
(5 PALAVRAS) MÁX. MIN
MODO MODO
GND 1 40 VCC
BHE/S7
AD14 2 39 AD15
16 BIT ALU A19/S6
4
AD13 3 38 A16/S3
A16/S3
ÔNIBUS AD12 4 37 A17/S4
BANDEIRAS 16 AD15 AD0
INTERFACE AD11 36 A18/S5
UNIDADE
3 INTA, RD, WR AD10 56 35 A19/S6
AD9 7 34 BHE/S7
3 DT/R, DEN, ALE
AD8 8 33 MN/MX
AD7 9 8086 32 RD
AD6 10 CPU 31 RQ/GT0 (AGUARDE)
6 BYTES
AD5 11 30 RQ/GT1 (HLDA)
INSTRUÇÃO
AD4 12 29 TRANCAR (WR)
FILA
AD3 13 28 S2 (M/I0)
AD2 14 27 S1 (DT/R)
TESTE
INT TRANCAR
AD1 15 26 S0 (A)
NMI
2 AD0 16 25 QS0 (MAS)
CONTROLE E CRONOGRAMA QS0, QS1
RQ/GT0.1 2
NMI 17 24 QS1 (quantos)
HOLD 3 S2,S1,S0 18 23 TESTE
DENTRO
HLDA
CLK 19 22 PRONTO
3 21
GND 20 REDEFINIR
588 APÊNDICE
FORMAS DE ONDA
MODA MÍNIMA
T1 T2 T3 TW T4
VCH TCLCL TCH1CH2 TCL2CL1
MINHA
TCLDV
TCLAV TCLAX
TCHDX
BHE/S7, A19/S6–A16/S3
BHE, A19-A16 S7–S3
TCLLH TLHLL
TLLAX
MAS
TAVAL
TCHLL TR1VCL
HIV
RDY (entrada 8284A)
VEJA A NOTA 4 VAI
TCLR1X
TRYLCL
TAVAL TRYHCH
TLLAX
TCLAV TCLAZ TDVCL TCLDX
TCLAX
AD15–AD0 A15–AD0
FLUTUADOR
ENTRADA DE DADOS
FLUTUADOR
CICLO DE LEITURA
RD
(WR, INTA=VOH)
DT/R
TVVCTV TCVCTX
(Contínuo )
Machine Translated by Google
APÊNDICE A 589
T1 T2 T3 TW T4
VCH TCLCL TCH1CH2 TCL2CL1
MINHA
TCLDV TCHDX
TCLAV TCLAX
BHE/S7, A19/S6–A16/S3 BHE, A19-A16 S7–S3
TCLLH TLHLL
TLLAX
MAS
TAVAL
TCHLL
TCLDV TCHDX
TCLAV
TCLAX
SAÍDA DE DADOS
AD15–AD0 AD15–AD0
TAVAL TWHDX
CICLO DE GRAVAÇÃO TVVCTV TCVCTX
TLLAX
(NOTA 1)
A
(RD, INTA,
TVVCTV
DT/R = VOH) TWLWH
WR
TCVCTX
TCLAZ TCLDX
TDVCL
AD15–AD0 PONTEIRO
FLUTUADOR
FLUTUADOR
TCHTV TCHTV
DURANTE O CICLO
(NOTAS 1 e 3)
DT/R
(BHE=VOL)
ENQUANTO
TVVCTV TCVCTX
TCLAV
PARADA DE SOFTWARE—
NOTAS:
1. Todos os sinais alternam entre VOH e VOL , a menos que especificado de outra forma.
2. RDY é amostrado próximo ao final de T2, T3, TW para determinar se os estados das máquinas TW devem ser inseridos.
3. Dois ciclos INTA são executados consecutivamente. O LOCAL ADDR/DATA BUS 8086 está flutuando durante ambos os ciclos INTA. Sinais de controle mostrados para
segundo ciclo INTA.
4. Os sinais em 8284A são mostrados apenas para referência.
5. Todas as medições de tempo são feitas a 1,5 V, salvo indicação em contrário.
Machine Translated by Google
590 APÊNDICE
MODO MÁXIMO
T1 T2 T3 T4
TCH1CH2 TCL2CL1
TCLCL TW
VCH
CLK
VCL
TCLAV TCHCL TCLCH
QS0, QS1
TCHSV TCLSH
TCLDV TCHDX
TCLAVTCLAX
TCLR1X
TRYLCL
TRYHCH
CICLO DE LEITURA TCLAZ
TCLAV TDVCL TCLDX
RD
TRLRH
TCHDTL TCLRL TCHDTH
DT/R
TCLML
TCLMH
8288 SAÍDAS
MRDC OU IORC
VER NOTAS, 5, 6
TCVNV
A
TCVNX
(Contínuo )
Machine Translated by Google
APÊNDICE A 591
T1 T2 T3 T4
TW
VCH
CLK
VCL
TCHSV TCLSH
AD15–AD0 DADOS
AD15–AD0
TCVNV TCVNX
A
TCLML TCLMH
8288 SAÍDAS
AMWC OU AIOWC
VER NOTAS 5,6
TCLML TCLMH
MWTC OU IOWC
DURANTE O CICLO
AD15–AD0 PONTEIRO
FLUTUADOR FLUTUADOR
TCLMCL
TSVMCH
MCE/
PDEN TCLMCH TCHDTL TCHDTH
DT/R
TCLMH
TCVNV
PARADA DE SOFTWARE– A
TCVNX
(DEN=VOL; RD, MRDC, IORC, MWTC,
S2, S1, S0
NOTAS:
1. Todos os sinais alternam entre VOH e VOL, a menos que especificado de outra forma.
2. RDY é amostrado próximo ao final de T2, T3, TW para determinar se os estados das máquinas TW devem ser inseridos.
3. O endereço em cascata é válido entre o primeiro e o segundo ciclo INTA.
4. Dois ciclos INTA são executados consecutivamente. O LOCAL ADDR/DATA BUS 8086 está flutuando durante ambos os ciclos INTA. O controle para o endereço do ponteiro é
mostrado para o segundo ciclo INTA.
5. Os sinais em 8284A ou 8288 são mostrados apenas para referência.
6. A emissão dos sinais de comando e controle 8288 (MRDC, MWTC, AMWC, IORC, IOWC, AIOWC, INTA e DEN) atrasa o ativo
alta 8288 CEN.
7. Todas as medições de tempo são feitas a 1,5 V, salvo indicação em contrário.
8. Status inativo em estado imediatamente anterior a T4.
Machine Translated by Google
592 APÊNDICE
CLK
DENTRO sinal
TESTE
Nota: Requisitos de configuração para sinais assíncronos apenas para garantir o reconhecimento no próximo CLK.
Vcc
CLK
TDVCLTCLDX
TRANCAR
REDEFINIR
ÿ4 CICLOS CLK
CLK
TGVCH TCLCL
TCLGH TCLGL
TCLCL TCHGX TCLGH
PULSO 1 PULSO 3
PULSO 2 COPROCESSADOR
COPROCESSADOR
RQ/GT 8086 GT LIBERAR
RQ
BHE/S7
Nota: O coprocessador não pode conduzir os barramentos fora da região mostrada sem risco de contenção.
CLK
THVCH THVCH
AGUARDE
TCLHAV TCLHAV
HLDA
AD15–AD0,
TCLAZ
A19/S6–A16/S3,
RD, 8086 COPROCESSADOR 8086
BHE/S7, M/IO,
DT/R, WR, DEN
Machine Translated by Google
APÊNDICE A 593
POP = POP:
Registro/Memória 10001111 mod 000 r/m
XCHG = Câmbio:
Registo/Memória com Registo 1000011 w mod reg/m
IN = Entrada de:
Porta Fixa 1110010 em porta
594 APÊNDICE
Tabela 1 (Continuação)
Reg./Memória com Registro para Imediato para 000000 dw mod reg r/m
Reg./Memória com Registro para Imediato para 000100 dw mod reg r/m
INC = Incremento:
SUB = Subtrair:
DEC = Diminuir:
CMP = Comparar:
APÊNDICE A 595
Tabela 1 (Continuação)
LÓGICA
RCL = Girar através da bandeira de transporte para a esquerda 110100 vw mod 010 r/m
E = E:
OU = Ou:
(Contínuo )
Machine Translated by Google
596 APÊNDICE
Tabela 1 (Continuação)
MANIPULAÇÃO DE STRING
TRANSFERÊNCIA DE CONTROLE
CHAMAR = Ligar:
Intersegmento 11001011
(Contínuo )
Machine Translated by Google
APÊNDICE A 597
Tabela 1 (Continuação)
INT = Interromper
Tipo 3 11001100
598 APÊNDICE
Tabela 1 (Continuação)
ESC = Escape (para Dispositivo Externo) 11011 xxx mod xxx r/m
Apêndice B
uso de comandos dos e debug
MASM 6.14, é um montador (basicamente para arquitetura x86) que roda em DOS, que não é um sistema
operacional GUI (interface gráfica do usuário). É uma interface de linha de comando – temos que dar
comandos para executar várias tarefas. Hoje em dia, todos os computadores têm alguma versão do Windows
em execução (a menos que sejamos usuários 'somente linux'). No Windows, existe um shell de 'linha de
comando': i) Vá para o menu Iniciar e clique em 'Executar'
ii) Uma pequena janela se abre. Digite cmd no espaço e clique em ' OK'
iii) Uma pequena janela preta se abre. (Isso pode ser ampliado pressionando as teclas 'Alt' e 'Enter' simultaneamente
tanea).
Nesta janela, vários comandos podem ser digitados. Apenas alguns deles serão mencionados aqui:
i) cd – altera o diretório.
Para ir para o diretório raiz, o comando é cd\ C:\
A unidade atual é D.
Suponha que o montador MASM6.14 esteja nesta unidade. Para ir para este diretório, digite cd
MASM6.14 O resultado é D:\ >MASM6.14
Para ir para o diretório BIN, use o comando 'cd' novamente. Digite cd BIN. Agora, vemos D:\
>MASM6.14\BIN
Todos os comandos para executar o montador e o depurador devem ser usados no diretório BIN.
comandos que podem ser úteis em algum momento ou outro: editar – abre
um editor no qual o programa pode ser escrito.
dir – lista os subdiretórios e arquivos no diretório atual dir/p – o mesmo
que 'dir', porém, lista uma página de cada vez
dir directory name – lista os arquivos e subdiretórios do diretório nomeado.
cls – limpa a tela
del fi lename - exclui o arquivo especificado
exit – fecha a janela de comando
Machine Translated by Google
600 APÊNDICE
Comandos de depuração
Os comandos para usar o montador MASM foram discutidos no Capítulo 2. Mas alguns comandos do depurador foram deixados
de fora. Vamos discuti-los aqui.
montar A [endereço]
comparar o endereço do intervalo C
despejar D [intervalo]
digite Endereço E [lista]
preencher
Lista de intervalos F
ir G [= endereço] [endereços]
carga Valor H1 valor2
de entrada eu porto
hexadecimal L [endereço] [unidade] [primeiro setor] [número]
jogada
Endereço do intervalo M
nome N [nome do caminho] [arglist]
saída O byte da porta
prosseguir P [= endereço] [número]
sair Q
registrar R [registrar]
pesquisa Lista de intervalo S
vestígio T [= endereço] [valor]
desmontar U [intervalo]
escreva W [endereço] [unidade] [primeiro setor] [número]
Alguns desses comandos serão necessários para depurar os programas assembly que escrevemos.
Vamos discuti-los para um pequeno programa de montagem chamado tinym.asm.
Depois que o programa é montado e vinculado, um arquivo com chamado tinym.com é obtido como o arquivo executável (o
arquivo com é obtido apenas porque o modelo tiny foi usado no programa.
Se o modelo pequeno tivesse sido usado, um arquivo exe seria o resultado).
Para depurar este programa, digite debug tinym.com. O prompt de depuração (hífen) é obtido. Agora, os vários comandos do
depurador podem ser usados.
Observação Todos os números usados no depurador são, por padrão, no formato hexadecimal.
Formato: u
C:\masm6.14\BIN>debug tinym.com
-dentro
APÊNDICE B 601
O comando unassemble converte o código de máquina no arquivo executável em código assembly, conforme
mostrado acima. O número 13C6 é o conteúdo do registrador CS e 0100 é o offset. O número B067 corresponde
ao código máquina em formato hexadecimal para a instrução MOV AL,67.
Observe que qualquer programa COM inicia em um set off de 0100.
-g0100
AX = 0000 BX = 0000 CX = 000C DX = 0000 SP = FFFE BP = 0000 SI = 0000 DI = 0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0100 NV UP EI PL NZ NA PO NC
13C6:0100 B067 MOV AL,67
-g0100 0106
O resultado é o seguinte. Todas as instruções até o endereço de interrupção 0106 foram executadas.
AX=00AC BX=0045 CX=000C DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0106 OV UP EI NG NZ NA PE NC
13C6:0106 8AD0 MOV DL,AL
Este comando faz com que a próxima instrução seja executada. O conteúdo dos registradores e o status da bandeira
são exibidos.
-t
A parte
NV UP EI PL NZ NA PO NC é o status de bandeira atualmente. A interpretação do status da bandeira é explicada
na última parte deste apêndice.
Para executar mais de uma instrução use o comando 't' seguido do número de instruções a serem executadas.
Por exemplo, usando t2 mostra a execução de duas instruções com conteúdo de registro correspondente e status
de bandeira.
-t2
602 APÊNDICE
É opcional especificar o comprimento. Se não for especificado, o conteúdo de locais de 128 bytes será exibido.
Exemplos
a)
-d0000
Nesse caso, são exibidos os dados em 128 locais de DS:0000, 16 bytes em uma linha.
b) –d
Neste caso, os 128 bytes serão o conteúdo da memória, começando no final do último endereço exibido.
c) –d 0000 0002
Neste caso, o conteúdo de apenas 3 bytes (dos endereços 0000 a 0002) será exibido.
d) –d 0000 3
Neste caso, o conteúdo de 4 locais será exibido, pois qualquer contagem começa em 0.
e) Para exibir o conteúdo de outros segmentos, encontre o conteúdo de seus registradores de segmento e use-o
junto com o comando d no endereço base: formato off set .
Este comando é usado para escrever linhas de programa no próprio depurador, executá-lo e visualizar o resultado.
Uma vez que o programa é digitado, ele pode ser montado e executado.
Machine Translated by Google
APÊNDICE B 603
O formato deste comando é
-a[endereço inicial]
Se o endereço inicial não for especificado, o endereço padrão é 0100.
Vamos digitar algumas instruções depois de especificar o comando 'a' com um endereço .
Então o valor CS (aqui é 1374) é fornecido pelo depurador. Veja o código abaixo. - a0220
1374:0220 MOV AL,09 1374:0222 MOV AH,76 1374:0224 ADD AL,AH 1374:0226 MOV [0124],AL
1374:0229 <Enter> Após inserir todo o programa, ele pode ser desmontado usando o comando
'u' junto com o endereço inicial. -u0220 1374:0220 B009 MOV AL,09 1374:0222 B476 MOV
AH,76 1374:0224 00E0 ADICIONAR AL,AH 1374:0226 A22401 MOV [0124],AL
Este comando compara duas áreas na memória. O registro padrão é o registro DS.
Este comando compara os 24(H) bytes dos endereços 0200 e 0400. -c0200 L24
0400 1374:0220 B0 00 1374:0420 1374:0221 09 00 1374:0421 1374:02322 B4 00
1374:0422 1374:022 :0423 O conteúdo de locais diferentes é exibido.
b) C início do endereço 'de' fim do endereço 'de' início do endereço 'para' Neste
formato, o intervalo de endereços da categoria 'de' é especificado. -c0200 0224
0400.
comando é útil para digitar dados em locais. Por padrão, é o segmento de dados que é referido. Mas outros
segmentos podem ser usados no endereço base: formato off set.
Machine Translated by Google
604 APÊNDICE
a) No caso a seguir, os três bytes 56, 45 e 56 (todos em hexadecimal) são inseridos em locais a partir de 0200.
-e 0200 56 45 56
Para verificar se esses dados foram inseridos, verifique usando o comando 'd' .
-d 0200 0202
1374:0200 56 45 56
b) Aqui, uma string é inserida nos endereços de 0200 em diante. Então uma verificação é feita usando o
comando 'd' . -e 0203 “notme”
-d 0203 0210
1374:0200 6E 6F 74 6D 65-00 00 00 00 00 00 00 00 eu não........
1374:0210 00 .
Os valores ASCII dos caracteres são vistos nas localizações especificadas.
Este comando preenche uma área da memória com um dado específico. Assim como o comando enter, esta
área pode ser especificada pelo endereço inicial, o comprimento da área na memória e os dados a serem
replicados nesses locais. Também pode ser especificado pelo endereço inicial, o endereço final e os dados.
MOV CX,10
ESTE SI, NÚMERO
REPETIR: MOV AH,01
INT 21H
SUB AL, 30H
PRAÇA DE CHAMADA
Machine Translated by Google
APÊNDICE B 605
MOV [SI], AL
INC SIM
LOOP REPEA
.SAÍDA
MOV BL,AL
MUL BL
CERTO
PONTO QUADRADO
FIM
Se isso for executado em uma única etapa, usando o comando trace, ao alcançar a instrução INT, o controle
irá para locais bizarros dentro da rotina de interrupção. Isso pode ser evitado usando o comando continue. Use-
o com uma contagem – e que muitas instruções sejam executadas. Ou o endereço além da instrução INT pode
ser usado com o comando 'p'.
(A mesma coisa pode ser feita usando o comando 'g' com um endereço além do endereço da instrução INT.)
Este comando procura na memória por caracteres em uma lista. O registrador padrão é o registrador DS.
Se os caracteres forem encontrados, os endereços são mostrados, caso contrário, não há resposta.
Existem dois formatos para isso.
Aqui, o endereço inicial da primeira área, o endereço inicial da segunda área e o número de bytes a serem
comparados devem ser especificados. O comando a seguir procura por 'C' em locais 24H a partir de 0100.
O comando hexaritmético é para adicionar e subtrair números hexadecimais. Ele tem apenas dois parâmetros –
os dois números a serem adicionados e subtraídos. A resposta é a soma e a diferença dos números. Os números
podem ter de um a quatro dígitos hexadecimais. A adição e a subtração não são assinadas, e nenhum transporte
ou empréstimo é mostrado além do quarto dígito (de ordem superior).
-
-h 6 2
0008 0100
-h 5678 1234
68AC 4444
-
No primeiro exemplo, estamos somando 0006 e 0002. A soma e a diferença são obtidas.
Machine Translated by Google
606 APÊNDICE
O comando Input pode ser usado para ler um byte de dados de qualquer uma das portas de E/S do PC.
O endereço da porta pode ter um ou dois bytes. O comando lê as portas e exibe o resultado.
-i 3fe
-23
No exemplo acima, foi lida uma porta com endereço 3FEH, para obter um dado de 23H.
O comando de saída é o inverso do comando de entrada. Isso pode ser usado para enviar um único byte de dados
para uma porta.
-de 3fc 5
-
Status do Sinalizador
O status dos flags do processador são vistos no depurador junto com o conteúdo dos registradores. O status de
configuração/reinicialização dos sinalizadores é mostrado abaixo.
apêndice C
conjunto de instruções e tempo de instrução de 8086
Nesta tabela, está listado o conjunto completo de instruções do 8086, com seus mnemônicos e funções. Para
conhecer os detalhes (formato e exemplos) de cada uma das instruções, a seção do livro texto onde elas são
discutidas é apresentada na terceira coluna da tabela.
XCHG — 3.1
Trocar byte ou palavra
XLAT Traduzir byte usando a tabela de consulta 3.2.3 3.1
Instruções lógicas
Mnemônico Função Seção Mesa
GRATUITAMENTE
exclusivo – OU de byte ou palavra — 3.7
TESTE Testar byte ou palavra (AND sem armazenar) — 3.7
Machine Translated by Google
608 APÊNDICE
SHL, SHR Deslocamento lógico para a esquerda, byte direito ou palavra por 1 ou CL 3.6.1 3.8
SAL, SAR Deslocamento aritmético para a esquerda, byte direito ou palavra por 1 ou CL 4.7.3 3.8
RCL, RCR direita, por meio de transporte, byte ou palavra por 1 ou CL 3.6.2 3.8
Instruções aritméticas
ADICIONAR
Adicionar byte ou 3.4.2 3.4
CMP Comparar byte ou palavra (subtrair sem armazenar) 3.4.4 Multiplicar 3.4
EU TENHO
byte ou palavra (sem sinal) 3.4.5 3.4
CBW, CWD Converter byte em palavra, palavra em palavra dupla 4.7 3.4
APÊNDICE C 609
Instruções de string
REP — 4.1
Repetir
— 4.1
REPE, REPZ Repetir enquanto igual, zero
REPNE, REPNZ Repita enquanto não for igual (não zero) — 4.1
3.4.1 —
STC, CLC, CMC Set, transparente, complemento de transporte fl ag
STI, CLI
——
(Contínuo )
Machine Translated by Google
610 APÊNDICE
PUHF, POPF Empurre as bandeiras para a pilha, retire as bandeiras da pilha — 3.1
ESC 13.2.1 —
Escape para a interface do processador externo
TRANCAR 6.4.4 —
Bloqueie o barramento durante a próxima instrução
NOP 6.5.1 —
Sem operação (não faça nada)
ESPERAR 13.2.1 —
Aguarde o sinal na entrada TEST
HLT Parar o processador 6.3.5 —
1 Direto 6
2 Registro indireto 5
3 Registrar parente 9
APÊNDICE C 611
intrasegmento direto 19
intrasegmento direto
através do cadastro 16
intrasegmento direto
através da memória 21+EA
intrasegmento direto 28
CBW Converter byte em palavra 2
CLC Limpar bandeira de transporte
2
CLD Limpar a bandeira de direção 2
CLI Limpar sinalizador de interrupção 2
CMC Complemento carry fl ag 2
CMP Comparar
reg para reg 3
mem para mem 9+EA
Não repetido 22
REPE/REPNE CMPS/CMPSB/CMPSW 9+22/repetição
CWD Converter palavra em palavra dupla 5
DAA Ajuste decimal para adição 4
A Ajuste decimal para subtração 4
DEZ Diminuir em 1
16 bits reg 3
memória 3
612 APÊNDICE
HLT Parar 2
IDIV Divisão inteira
registro de 8 101–112
registro de 8 bits 3
mem 15+EA
INT Interromper
tipo=3 52
tipo3 51
EM Interromper se transbordar
interrupção tomada 53
direto 15
Machine Translated by Google
APÊNDICE C 613
intrasegmento indireto
através da memória 18+EA
intrasegmento indireta
por meio de cadastro 11
não repetido 12
repetido 9+13/repetição
CICLO Ciclo 17, pegue 5
LOOPE/ Loop se igual /
LOOPZ Loop se zero 18, pegue 6
CORRE / Loop se não for igual /
LOOPNZ Loop se não for zero 19, pegue 5
MOV Jogada
ace para mem 10
mem para aceitar 10
614 APÊNDICE
Não repetido 18
REP MOVS/MOVSB/MOVSW 9+17/repetição
EU TENHO
Multiplicação sem sinal
registro de 8 70–77
de porta fixa 8
POP Pop palavra fora da pilha
8
memória de registro 8
SS/CS 16+EA
PUSH Empurre a bandeira dupla para a pilha 10
RCL Gire para a esquerda através do transporte /
intrasegmento 16
intrasegmento 26
Machine Translated by Google
APÊNDICE C 615
não repetido 15
Não repetido 11
TESTE Teste
616 APÊNDICE
não afirmado 4
XADD Troque e adicione
XCHG Intercâmbio
reg com acc 3
reg com mem 17+EA
reg com reg 4
XLAT/ Traduzir 11
GRATUITAMENTE
OU exclusivo lógico
reg com reg 3
mem com reg 9+EA
reg com mem 16+EA
immed com acc 4
immed com reg 4
immed com mem 17+EA
Machine Translated by Google
apêndice d
lista de funções dos e bios
Neste, algumas das funções DOS 21H e as funções BIOS 10H e 16H estão listadas.
As chamadas do sistema DOS usam o vetor 21H. Alguns dos serviços importantes da INT 21H estão listados aqui.
DL = Dia (1 a 31)
AL = Dia (0 = Domingo, 1 = Segunda-feira etc.)
DH = Mês (1 a 12),
CX = Ano (1980 a 2099)
AH = 2BH Definir data do sistema DOS Espera:
DL = Dia (1 a 31)
DH = Mês (1 a 12),
CX = Ano (1980 a 2099)
AH = 2CH Obter hora do sistema DOS Devoluções:
CH = Hora (0 a 23)
CL = Minutos (0 a 59)
DH = segundos (0 a 59)
DL = centésimo de segundos (0 a 99)
Machine Translated by Google
618 APÊNDICE
Espera: AH = 00
AL = modo de exibição
Devoluções: Nenhuma
Descrição: A função 00 é usada para definir o modo de vídeo. Esta função limpa a tela, define as variáveis do BIOS e inicializa
o modo de vídeo.
Espera: AH = 01
Bits CH 0–4 = linha inicial para cursor (20H = sem cursor)
Bits CL 0–4 = linha final para cursor
Devoluções: Nenhuma
Descrição: A função 01 é utilizada para definir a forma do cursor. Isso é feito selecionando as linhas inicial e final para o cursor
de hardware piscando (funciona apenas no modo de texto).
Espera: AH = 02
BH = página de vídeo (deve ser zero no modo gráfico)
Machine Translated by Google
APÊNDICE D 619
DH = linha (coordenada y)
DL = coluna (coordenada x)
Devoluções: Nenhuma
Descrição: A função 02 é utilizada para definir a posição de um cursor no dispositivo de exibição (monitor) usando
coordenadas de texto (linha e coluna).
Espera: AH = 03
BH = página de vídeo
Descrição: A função 03 é utilizada para ler a posição atual do cursor no display em coordenadas de texto.
Descrição: A função 04 é utilizada para ler o estado atual e a posição da caneta de luz.
Descrição: A função 05 é utilizada para selecionar a página de exibição ativa para a exibição do vídeo.
Número de linhas para rolar para cima (se AL = Zero, toda a janela é limpa ou em branco)
Devoluções: Nenhuma
Machine Translated by Google
620 APÊNDICE
Descrição: A função 06 é usada para inicializar uma janela retangular especificada do display para caracteres ASCII com um
determinado atributo, ou rolar o conteúdo de uma janela para cima por um número especificado de linhas.
8. INT 10H, Função 07 : Scroll (Initialize) Rectangle Window Down Espera: AH = 07 AL = Número
de linhas para rolar para baixo (se AL = Zero, a janela inteira é apagada ou em branco)
Devoluções: Nenhuma
Descrição: A função 07 é usada para inicializar uma janela retangular especificada do display para caractere ASCII com um
determinado atributo, ou rolar o conteúdo de uma janela para baixo por um número especificado de linhas.
Espera: AH = 08
BH = página de vídeo (em CGA, deve ser 0 no modo gráfico)
Descrição: A função 08 usada para ler o caractere ASCII e seu atributo na posição atual do cursor para a página de vídeo
especificada.
Espera: AH = 09
AL = código de caractere ASCII
BH = página de vídeo
BL = atributo (no modo texto) ou cor (no modo gráfico)
CX = contagem de caracteres para escrever (fator de replicação)
Devoluções: Nenhuma
Descrição: A função 09 é usada para escrever um caractere ASCII especifi cado e seu atributo para a exibição do vídeo na
posição atual do cursor.
11. INT 10H, Função 0AH : Escrever caractere apenas no cursor Espera: AH = 0AH
APÊNDICE D 621
Devoluções: Nenhuma
Descrição: A função 0AH é usada para escrever um caractere ASCII na tela de vídeo na posição atual do cursor. O caractere
usa o atributo do caractere anterior exibido na mesma posição.
Espera: AH = 0BH
No modo de texto
BH = 00 seleciona a cor da borda
Devoluções: Nenhuma
Descrição: A função 0BH é utilizada para definir o conteúdo de uma paleta de cores.
Espera: AH = 0CH
AL = valor da cor do pixel
BH = página de vídeo
CX = número da coluna (coordenada x no modo gráfico)
DX = número da linha (coordenada y no modo gráfico)
Devoluções: Nenhuma
Descrição: A função 0CH é usada para definir o ponto do pixel na tela de vídeo nas coordenadas gráficas especificadas. A
faixa de possíveis coordenadas válidas (x, y) depende do modo de vídeo atual.
Descrição: A função 0DH é utilizada para ler os atributos do ponto de pixel do vídeo nas coordenadas gráficas especificadas.
O intervalo de possíveis coordenadas válidas (x, y) depende da
modo de vídeo atual.
15. INT 10H, Função 0EH : Escrever Texto no Modo Teletipo Espera: AH = 0EH
622 APÊNDICE
Devoluções: Nenhuma
Descrição: A função 0EH é usada para escrever um caractere ASCII na tela de vídeo na posição atual do cursor, usando
a cor especificada tanto no modo texto quanto no modo gráfico.
Espera: AH = 0FH
AL = modo de exibição
BH = página de vídeo ativa
Descrição: A função 0FH é usada para ler o modo de vídeo atual do controlador de vídeo ativo.
Esperados: AH = 10H
Devoluções: Nenhuma
Descrição: A função 10H é utilizada para configurar o registro da paleta para a nova combinação de cores.
CX = comprimento da
string DH, DL = linha, coluna para iniciar a exibição da string
ES:BP = segmento:off conjunto da string de origem
Machine Translated by Google
APÊNDICE D 623
Devoluções: Nenhuma
Descrição: A função 13H é usada para transferir uma string para o buffer de vídeo para exibição ativa atual.
Espera: AH = 0FEH
ES:DI = segmento:off set do buffer de vídeo assumido
B000:000H para adaptador monocromático
B800:0000 para adaptador gráfico padrão ou colorido
Descrição: A função 0FEH é utilizada para obter o ponteiro de memória do buffer de vídeo para a tarefa em execução sob
vista superior.
Espera: AH = 0FFH
CX = número de caracteres sequenciais que foram modificados
DI = off set do primeiro caractere que foi modificado no buffer de vídeo de sombra
ES = segmento de buff de vídeo de sombra é
Devoluções: Nenhuma
Descrição: A função 0FFH é usada para copiar o conteúdo do buffer de vídeo de sombra do aplicativo para o buffer de
atualização de vídeo real em Vista superior.
mais antigo. O segundo é o equivalente para o teclado aprimorado. Esta função verifica um caractere no buffer do teclado.
Se disponível, o código de varredura é retornado em AH e o valor ASCII em AL. Para teclas de função (F0 a F12) que
não possuem valores ASCII, AL = 0.
Se nenhum caractere estiver disponível no buffer do teclado, a função aguarda o pressionamento de uma tecla.
ii) AH = 01 ou AH = 11H. O primeiro número de função é para o teclado mais antigo. O segundo é o equivalente para o
teclado aprimorado. Esta função é semelhante à anterior, exceto que se nenhum caractere estiver disponível no buffer
do teclado, ele não espera o pressionamento de uma tecla.
Ele simplesmente define ZF (ZF = 1) e retorna.
iii) AH = 02 ou AH = 12H. O primeiro número de função é para o teclado mais antigo. O segundo é o equivalente para o teclado
aprimorado. Esta função retorna o primeiro byte de status do teclado no registrador AL. Este byte de status também está
disponível na área de dados do BIOS 0040 : 0017.
Machine Translated by Google
Machine Translated by Google
apêndice e
Conjunto de instruções 80x87 (x87 – pentium)
Lenda
Generais
Todas as instruções FPU que não acessam a memória têm dois bytes de comprimento (exceto FWAIT
que é um byte).
As instruções FPU que acessam a memória são quatro bytes para endereçamento de 16 bits e seis bytes para
endereçamento de 32 bits. (fim da legenda)
F2XM1 Calcular 2x –1
8087 287 387 486 Pentium
310–630 310–630 211–476 140–279 13-57 NP
626 APÊNDICE
variações/
operando 8087 287 387 486 Pentium
modismo 70–100 70–100 23–34 8–20 1/3 FX
fadd mem32 90–120+EA 90–120 24–32 8–20 1/3 FX
modinha mem64 95–125+EA 95–125 29–37 8–20 1/3 FX
modismo 75–105 75–105 23–31 8–20 1 3/1 FX
variações/
operando 8087 287 387 486 4 Pentium
fcom reg 40–50 40–50 24 44 4/1 FX
fcom mem32 (60–70)+EA 60–70 26 45 4/1 FX
fcom mem64 (65–75)+EA 42– 65–75 31 4/1 FX
fcomp fcompp 52 45–55 42–52 26 4/1 FX
45–55 26 4/1 FX
APÊNDICE E 627
variações/
operando 8087 287 387 46 Pentium
fdiv reg fdiv 193–203 193–203 88–91 73 39 FX
mem32 (215–225)+EA 215–225 89 73 39 FX
fdiv mem64 (220–230)+EA 220–230 94 73 39 FX
fdivp 197–207 197–207 91 73 39 FX
variações/
operando 8087 287 387 194–204 486 Pentium
fdiv reg fdiv 194–204 88–91 73 39 FX
mem32 fdiv (216–226)+EA 216–226 89 73 39 FX
mem64 fdivp (221–231)+EA 221–231 198–208 94 73 39 FX
198–208 91 73 39 FX
628 APÊNDICE
variações/
operando 8087 287 387 486 Pentium
ficom mem16 (72–86)+EA 72–86 ficom mem32 (78– 71–75 16–20 8/4 POR EXEMPLO
91)+EA 78–91 ficomp mem16 (74–88)+EA 74–88 56–63 15–17 8/4 POR EXEMPLO
variações/
operando 8087 287 387 486 Pentium
fidiv mem16 (224–238)+EA 224–238 136–140 85–89 42 NP
fidiv mem32 (230–243)+EA 230–243 120–127 84–86 42 NP
fidivr mem16 (225–239)+EA 225–239 135–141 85–89 42 NP
fidivr mem32 (231–245)+EA 231–245 121–128 84–86 42 NP
variações/
operando 8087 287 387 486 Pentium
punho mem16 (80–90)+EA 80–90 82–95 29–34 6 NP
Machine Translated by Google
APÊNDICE E 629
variações/
operando 8087 287 387 486 Pentium
fisub mem16 (102–137)+EA 102–137 71–85 20–35 7/4 fisubr mem32 (108–143)+EA 108– POR EXEMPLO
630 APÊNDICE
variações/
operando 8087 287 387 486 Pentium
APÊNDICE E 631
variações/
operando fst 8087 287 387 486 Pentium
632 APÊNDICE
variações/
operando 8087 287 387 486 Pentium
fstcw mem 12-18 12-18 15 3 2 por exemplo
variações/
operando 8087 287 387 486 Pentium
fstenv mem (40-50)+EA 40-50 103-104 67/56 48-50 NP
fstenvw mem 103-104 67/56 48-50 NP
fstenvd mem 103-104 67/56 48-50 NP
fnstenv mem (40-50)+EA 40-50 103-104 67/56 48-50 NP
fnstenvw mem 103-104 67/56 48-50 NP
fnstenvd mem 103-104 67/56 48-50 NP
variações/
operando 8087 287 387 486 Pentium
fstsw mem 12–18 12-18 15 3 2 por exemplo
APÊNDICE E 633
variações/
operando 8087 287 387 486 Pentium
variações/
operando 8087 287 387 486 Pentium
634 APÊNDICE
bibliografia
Abel, Peter, IBM PC Assembly Language Programming, Pearson Education, 2002, pp. 156–163.
Antonakos, James L., Uma introdução à família de microprocessadores Intel, 3ª ed., Pearson Education, 2006.
Ayala, Kenneth J., The 8086 Microprocessor, Programming and Interfaceing the PC, T omson Education, 2004,
págs. 240–243.
Brey, Barry B., Os Microprocessadores Intel – Arquitetura, Programação e Interface, 8ª ed., Pearson
Educação, 2009.
Cypress Manual for 6264 Static RAM, outubro de 1994, revisado em junho de 1996.
Dandamudi, Sivarama P., Introdução à programação em linguagem de montagem, Springer International Edition,
2004.
Hall, Douglas V., Microprocessadores e Interface – Programação e Hardware, Tata McGraw Hill Publishers,
2009, pág. 315.
Manual Intel para Processador Pentium em icomP“ Índice 610\75 MHz, junho de 1997.
Notas de aula sobre o status do padrão IEEE 754 para aritmética de ponto flutuante binário, Prof. W. Kahan, Departamento de
Engenharia Elétrica e Ciência da Computação, Universidade da Califórnia, outubro de 1997.
Liu, Yu Cheng e Gibson, Glenn A., Microcomputer Systems: The 8086/8088 Family, Prentice Hall of India,
1991, pp. 463-465.
Mazidi, Muhammed Ali e Mazidi, Janice Gillispie, The 80x86 IBM PC and Compatible Computers – Assembly Language, Design and
Interfacing, 4ª ed., Prentice Hall, 2002, pp. 124–127, 484–489, 542–550, 731 –737.
Mazidi, Muhammed Ali, Mazidi, Janice Gillispie e McKinlay, Rolin D., Th e 8051 Microcontroller and
Sistemas Embarcados, 2ª ed. (IE), Pearson Education, 2008, pp. 101-1 435-438.
Mueller, Scott, Upgrading and Repairing PCs, 16ª ed., Pearson Education, 2004, pp. 239–242, 398–399, 990–992, 1161–1162.
Manual Nacional de Semicondutores para conversor digital-analógico de 8 bits DAC0800/ DAC0802, setembro de 2006.
Machine Translated by Google
Rafi quzzaman, Mohammed, Fundamentals of Digital Logic and Microcomputer Design, 5ª ed., Wiley Publishers,
2005, pp. 419-420.
Ray, AK e Bhurchandi, KM, Advanced Microprocessors and Peripherals, Tata McGraw Hill Publishers,
2002.
Manual da Texas Instruments para MAX232, MAX232I Dual EIA-232 Drivers/ Receivers, outubro de 2002.
Triebel, Walter A. e Singh, Avatar, Microprocessadores 8088 e 8086, Programação, Interface, Software,
Hardware e Aplicativos, 4ª ed., Pearson Education, 2002.
Guia do usuário para a placa-mãe ASUS A7V266–MX, outubro de 2003.
índice
638 ÍNDICE
ÍNDICE 639
não assinado, 95, 111, 114, 121, 124, 126, condicional, 55–7 enganchamento, 249, 277, 280
131 controle, 51, 55, 57 interrupções de hardware, 249–50, 256,
DMA, 6, 45–6 interrupção, 57 paridade, 258, 280 interrupções, 249–50, 255–
recursos, 419 33–4 sinal, 19, 21–2, 59, 261, 272, 274–75, 277–78, 283 tecla de
busca e depósito, 417–18 27, 29, 30, 33–4 trap, 57 atalho, 280–83, 285
FLYBY, 416
inicialização e programação, 425 modos de Flash ROM, 444
transferência, 416–18 número de ponto flutuante, 473
controlador DMA, 212, 395, 416-20, unidade de ponto flutuante, 551
423–24, 426–27 fatores de forma, 582 EU
E
G ICW4, 381–86
montagem em linha, 189
arseneto de gálio, 336 Entrada/Saída (E/S), 179, 183
eco, 97, 123
Registro da Tabela Global do Descritor decodificação de endereço, 225, 227-35,
modo acionado por borda, 378
(GDTR), 519, 522 237, 239, 244, 293–94, 354, 384, 422,
EDORAM, 439
Interface gráfica do usuário (GUI), 504 462 decodificação de endereços de 16
EFLAG, 505
bits, 244 memória mapeada, 179–80
microprocessador embutido, 488
periféricos ou isolados, 180 entradas/saídas,
história e desenvolvimento, 488
5 instruções de design, 71, 86 codificação
aprimoramentos, 487, 490 conjuntos de
instruções, 487–88, 490
H manual, 86
640 ÍNDICE
TRIBUNAL, 38 DOS, 249, 255–56, 259–60, 269, 272, 274, computador, 1–2, 4–12, 17, 19, 22, 29, 38,
retorno, 19, 38 277–78, 280–81, 283–85 272–73
girar, 40 alto nível, 1, 10-1
SHIFT, 364, 367-68 hardware, 249-50, 254-56, nível inferior, 11
fonte, 11, 35–6, 40, 71–3, 78, 88–9 258–61, 272–74, 280, 285 máquina, 3–5, 10–1, 32
de 8086, 249–50, 252, 256 códigos de operação, 10
STOS, 144–45, 596, 609, 615 prioridade de, 259 laptops, 576, 583-86
STRING, 157, 174–76, 596 software, 249-50, 255-56, 259-61, travas, 195-96, 200-01, 209, 216
alvo, 71 274 LCD, 292, 322–26, 341
INT 10H, 259, 265-71, 279-84 chamada intrasegmento, 148 pinos de, 289, 297, 300, 304,
Intel, 1–5, 11–2, 31, 545, 548–49, 551, 558 direto, 10–2, 35, 46, 148–49, 160, 166, 173, 306, 308, 310, 313, 315-16, 322-23, 332
443, 447–50
tecnologia centrino, 584 indireto, 35-7, 39, 148-49 LED, 289, 291, 297-98, 322-23, 336, 341-45
arquitetura do hub intel, 566 chamada intersegmento, 149
interface, 289-92, 298-99, 313, 316-17, 322, direto, 10–2, 35, 46, 148–49, 160, 166, 173, sete segmentos, 341-44
327, 336-37 443, 447–50 entrada esquerda, 369-70, 373
teclado hexadecimal, 289, 337–39 indireto, 35-7, 39, 148-49 suporte legado, 559
periférico, 289–91, 302–04, 310 chip de Linha IRQ, 368, 390-91 modo acionado por nível, 378
interface, 10 aninhamento lexical, 489
tela do teclado, 10 verificação de limite, 528–29
interface com o 8086, 289 terminal de impressão de linha, 312
conversor analógico para digital, 313 J ligando, 72, 74-5
conversor digital para analógico, 317–18 arquivo de lista, 76
Displays de LED, 341 instrução de salto, 107–12 Endereço Efetivo de Carregamento (LEA), 101
monitores de cristal líquido, 322 longe, 99, 107, 111–12, 121 Registro da Tabela Descritora Local
motor de passo, 289, 327-37 intersegmento, 107 (LDTR), 520
arquitetura de memória intercalada, 440 próximo, 107-10 localidade de referência, 446
reset interno, 407, 411, 414-15 CURTO, 108-09 contador de localização, 73, 79
comunicação entre processadores, 214, 455, incondicional, 95, 107–10, 112 saltadores, bloqueio, 196, 215, 217-18
456 563, 570 espaço de endereço lógico, 523
interromper, 6–7, 44–5, 46 calculando o tamanho de, 523
reconhecer, 6, 46 configurações fracamente acopladas, 457-58, 464
ponto de interrupção, 254, 256
execução, 7-8, 12, 32, 34-5, 38, 43, 45 K LPC, 565-66
ÍNDICE 641
642 ÍNDICE
RAM, 1, 4, 8, 34, 52 no
chip, 52, 58 gerador
de taxa, 360
Machine Translated by Google
ÍNDICE 643
Z-80, 2
CONSTRUÇÃO DE USOS, 150-51, 160 Bandeira ZF, 509
Machine Translated by Google