Você está na página 1de 667

Machine Translated by Google

Machine Translated by Google

x86
MICROPROCESSADORES MICROPROCESSADORES
Machine Translated by Google

Duas estradas divergiram em uma floresta, e eu –


Eu peguei o menos percorrido,
E isso fez toda a diferença.

—Robert Frost
Machine Translated by Google

x86
MICROPROCESSADORES MICROPROCESSADORES

Arquitetura, programação e interface


(8086 para Pentium)

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

Gerente de Publicação: K. Srinivas Gerente Geral de Marketing: J. Saravanan


Editor-chefe sênior: Thomas Mathew Rajesh Gerente de Marketing: Vikram Singh
Editor de Aquisições: Sojan Jose Gerente Sênior de Direitos: Sumita Roy
Editor Assistente de Aquisições: S. Shankari VP, Produção: Subhasis Ganguly
Editor-chefe, Editorial de Produção: Shadan Perween Gerente Geral Adjunto, Design e Fabricação:
Editor de Produção Sênior: ME Sethurajan Madhur Bhatia
Editor de Produção: MR Ramesh Gerente Assistente, Manufatura: Priti Singh

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.

Copyright © 2010 Dorling Kindersley (Índia) Unip. Ltda.

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

Este livro é dedicado a


todos os meus
alunos do passado, presente e
futuro, e aos meus filhos, Sagar e Th ushar.
Machine Translated by Google
Machine Translated by Google

conteúdo

Prefácio xv
Sobre o autor xix

0 Noções básicas de sistemas de computador 1


0.1 Uma Breve História dos Microprocessadores 1

0.2 Noções Básicas de Arquitetura de 5

Computadores 0.3 Linguagens de Computadores 10


0.4 Arquiteturas RISC e CISC 12

0,5 Sistemas de Número 12


0,6 Conversões de Formato de Número 15

0,7 Aritmética de Computador 22

0,8 Unidades de Capacidade de 30

Memória 0,9 O Microprocessador 31

8085 Pontos-Chave deste 47

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

1.4 Modos de Endereçamento 63

Pontos-Chave deste Capítulo 68

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

2.3 Modelos de Memória 75

vii
Machine Translated by Google

viii CONTEÚDO

2.4 Pontos-chave do Projeto 86

de Instrução das Questões 93

deste Capítulo 93

Exercício 94

3 Conceitos de Programação – II 95
3.1 Abordagens de Programação 3.2 95

Instruções de Transferência de Dados 98

3.3 Instruções da Filial 107

3.4 Instruções Aritméticas 113

3.5 Instruções Lógicas 3.6 129

Instruções de Deslocamento e Rotação 131

Pontos-chave deste Capítulo 136

Perguntas 137

Exercício 137

4 Conceitos de Programação – III 139


4.1 Instruções de String 4.2 139

Procedimentos 145

4.3 Macros 155

4.4 Conversões de Formato de Número 158

4.5 Operações ASCII 4.6 162

Conversões para Cálculos e Exibição/Entrada 4.7 Aritmética de 165

Números com Sinal 4.8 Programando Usando Construções de 166

Linguagem de Alto Nível Pontos-Chave deste Capítulo Questões 172

176
177

Exercício 177

5 Conceitos de Programação - IV 179


5.1 Programação de Entrada/Saída 5.2 179

Instruções de E/S 180

5.3 Programação Modular 5.4 183

Programação em C com Módulos de Montagem 189


Machine Translated by Google

CONTEÚDO ix

Pontos-chave deste Capítulo 193

Perguntas 193

Exercício 193

6 A Estrutura de Hardware de 8086


195
6.1 Configuração de pinos 195

6.2 Relógio 208

6.3 Outras Atividades do Processador 211

6.4 Modo Máximo 214

6.5 Pontos-Chave do Ciclo 218

de Instrução das Perguntas 223

deste Capítulo 223

Exercício 224

7 Decodificação de Memória e E/S 225


7.1 Pinos de Dispositivo de 225

Memória 7.2 Decodificação de Endereço 227

de Memória 7.3 Bancos de Memória 7.4 235

Decodificação de Endereço de E/S Pontos 239

Chave deste Capítulo Questões 246

246

Exercício 246

8 A Estrutura de Interrupção de 8086 249


8.1 Interrupções do 8086 8.2 250

Tipos de interrupção dedicados 8.3 253

Interrupções de software 8.4 Interrupções 255

de hardware 8.5 Prioridade de interrupções 256

8.6 Alocação de tipo de interrupção para 259

PCs atuais 8.7 Funções do BIOS 10H 259

264

8.8 Endereçamento direto da memória de vídeo 8.9 270

Interface do teclado 8.10 Conectando uma interrupção 272

277
Machine Translated by Google

x CONTEÚDO

Pontos-chave deste Capítulo 286

Perguntas 287

Exercício 287

9 Interface Periférica – I 289


9.1 Kit do treinador 290

9.2 Interface Periférica Programável (PPI)-8255A 9.3 Modos de 291

Operação 9.4 Modo 0 296

296

9.5 Modo 1 302

9.6 Modo 2 (E/S de barramento bidirecional estroboscópico) 310

9.7 Interface de impressora Centronics 310

9,8 Interface de um Conversor Analógico para Digital com o 8086 313

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

Pontos-Chave deste Capítulo Questões 337

341

347

348

Exercício 348

10 Interface Periférica – II 349


10.1 O temporizador de intervalo programável 8253/8254 10.2 A 349

interface de exibição do teclado programável – 8279 10.3 O controlador de 363

interrupção programável (PIC) 8259 10.4 Modo em cascata 377

390

Pontos-chave deste Capítulo 393

Perguntas 393

Exercício 394

11 Interface Periférica - III 395


11.1 Princípios de Comunicação Serial 11.2 395

Comunicação Simplex, Half Duplex e Full Duplex 11.3 A Interface de 395

Comunicação Serial Programável 403


Machine Translated by Google

CONTEÚDO XI

11.4 Reinicialização interna ao ligar 11.5 414

Acesso direto à memória 415


11.6 O Controlador DMA - 8237 419
11.7 DMA e IBM-PC 426

11.8 Pontos Chave de Computadores 428

Baseados em PCI deste Capítulo 428

Perguntas 429
Exercício 429

12 Dispositivos de Memória Semicondutores 431


12.1 Memória Semicondutora 12.2 432

RAM Dinâmica 12.3 DRAM Síncrona 435

(SDRAM) 440

12.4 ROM (Memória Somente Leitura) 443

12.5 Memória Cache 12.6 444

Técnicas de Mapeamento 12.7 447

Cache e a Família x86 Pontos Chave 451

deste Capítulo Questões 453


453
Exercício 454

13 Configurações do Multiprocessador 455


13.1 Sistemas multiprocessados 456

13.2 Multiprocessamento usando 8086 457

13.3 O 8086 e 8089 em uma configuração fortemente acoplada 13.4 462

Configurações fracamente acopladas e arbitragem de barramento 13.5 464

Arbitragem de barramento usando o IC de árbitro de barramento 8289 466


13.6 O coprocessador aritmético 8087 471

Pontos-chave deste Capítulo 483

Perguntas 484
Exercício 484

14 80186 – O Microprocessador Embutido 487


14.1 Adições no Conjunto de Instruções 488
14.2 Aprimoramentos do Conjunto de Instruções 490
Machine Translated by Google

xii CONTEÚDO

14.3 Diagrama de Blocos do 80186 14.4 492

Programando a Unidade do Temporizador 495

14.5 Programando 497

Pontos-chave deste Capítulo 502

Perguntas 502
Exercício 502

15 Os processadores 80286 e 80386 503


15.1 O Processador 80286 503
15.2 O 80386 504
15.3 Arquitetura Interna 505

15.4 Aprimoramentos de Programação 15.5 506


Recursos de Hardware do 80386 510

15.6 Memória Virtual 15.7 514

Unidade de Gerenciamento de Memória 515

15.8 Convertendo um Endereço Lógico em um Endereço Físico 15.9 522

Calculando o Tamanho do Espaço de Endereço Lógico 15.10 523


Proteção 528

15.11 Multi Tasking 534

15.12 Interrupções de 80386 538

15.13 Instruções Privilegiadas 539


15.14 Conclusão 541

Pontos-chave deste Capítulo 541


Perguntas 542
Exercício 543

16 O Processador Pentium 545


16.1 Os recursos aprimorados do 80486 545

16.2 Alinhamento de Dados 548


16.3 O Processador Pentium 549
16.4 Pentium Pro 553
16.5 Pentium-II e Pentium-III 554
16.6 Pentium-IV 555

16.7 Últimas tendências em design de microprocessador 555

16.8 tecnologia multinúcleo e processadores móveis 558


Intel 16.9 559
Machine Translated by Google

CONTEÚDO xiii

16.10 Pontos-chave do 559

Suporte Legado das Perguntas 559

deste Capítulo 560


Exercício 560

17 O computador pessoal baseado em x86 561


17.1 O PC Moderno 562

17.2 A Placa Mãe 562

17.3 Chipset 17.4 564

Velocidade de Transferência 566

17.5 Barramentos de Expansão 568

17.6 ATA 573

17.7 Memória – SIMM e DIMM 17.8 BIOS 576

do sistema 17.9 Novas placas-mãe 578

580

17.10 Outros dispositivos de E/S 582

17.11 PS/2 582

17.12 Fatores de forma 582

17.13 Laptops 583

Pontos-chave deste Capítulo 585

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

Os microprocessadores formam um assunto-chave de estudo no programa de bacharelado em engenharia, onde é ensinado


como um assunto central para todos os ramos relacionados a circuitos, ou seja, eletrônica, elétrica, ciência da computação
e tecnologia da informação. Um pré-requisito para dominar este assunto é um curso sobre design lógico, o que implica que
os alunos precisam conhecer os blocos básicos de construção de um sistema digital. Um curso de organização e arquitetura
de computadores seria útil para o aluno, mas não é obrigatório para a compreensão do assunto. No entanto, nem todas as
instituições lidam com arquitetura de computadores em seus módulos de estudo antes de ensinar microprocessadores.
Portanto, este livro pretende ser a primeira introdução aos microprocessadores.

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 2 a 5 são dedicados, em sua maior parte, à programação em assembly. O Capítulo 2


apresenta o montador MASM. Discutimos a versão 6.14, que é útil para uma programação eficaz em
linguagem assembly. As etapas para usar o montador para executar programas são discutidas neste capítulo.
Os comandos do DOS e de depuração do Apêndice B também podem ser úteis para obter uma boa
compreensão das habilidades de programação. O Capítulo 5 inclui uma introdução à programação C
com módulos assembly embutidos. Esses quatro capítulos cobrem a maioria das instruções do
processador 8086 cujo uso foi destacado em exemplos resolvidos. Foram fornecidas perguntas
adequadas ao final do capítulo, para garantir a proficiência na programação. Conceitos avançados como
programação modular e construções de linguagem de alto nível do MASM também foram descritos.

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.

O Capítulo 8 é um capítulo interessante porque introduz o conceito de 'interrupções', que é um tema


importante no estudo de computadores. Como o hardware pode ser manipulado usando interrupções de
software é explicado aqui. O vídeo em modo texto e a programação TSR são apresentados com
exemplos práticos elaborados. Estes ajudam a usar o conhecimento da linguagem assembly para
entender o PC.

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.

O Capítulo 12 discute a memória do ponto de vista do usuário. Tendências de memória de última


geração, como memória de acesso aleatório dinâmica síncrona (SDRAM) e termos como taxa de dados
dupla (DDR), foram explicadas. O Capítulo 13 é dedicado aos princípios básicos de técnicas de
multiprocessamento e arbitragem de barramento. Além disso, discute a aritmética de ponto flutuante e o
uso do coprocessador aritmético, incluindo os aspectos de programação.

Os Capítulos 14 e 15 tratam das versões superiores da família de processadores x86 – o processador


80186 é descrito como um 'processador embutido' – enquanto o restante deles é descrito como
processadores usados para PCs. O processador 80386, que é o atual precursor do processador Pentium,
foi tratado em grande detalhe. Tópicos difíceis como tradução de endereços, proteção e multitarefa são
elucidados para benefício do aluno. A leitura repetida deste tópico resolverá muitas das dificuldades
iniciais enfrentadas pelo leitor.
Machine Translated by Google

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 Capítulo 17 é sobre o PC moderno, com todas as suas complexidades e mistérios desvendados. Os


recursos, peças, placas, barramentos, conectores e BIOS foram discutidos em termos simples para
ajudar um estudante médio a entender as aplicações do processador x86. Já ouvi muitas pessoas
usando termos como chipset, barramento e adaptador sem saber exatamente o que essas expressões significam.
Este capítulo visa esclarecer o significado de tal terminologia em palavras inequívocas. Fotografias de
placas-mãe típicas e outras partes do PC foram incluídas neste capítulo. Também explica como o PC
se desenvolveu ao longo dos anos, como o hardware e os padrões mudaram e evoluíram e também as
tendências atuais no campo. Sem dúvida, a tecnologia contemporânea está fadada a mudar novamente,
nos próximos tempos.

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

Neste capítulo, você aprenderá


| A breve história dos microprocessadores da Intel e seu | Conversões de formato de número.
uso em computadores pessoais. | Aritmética computacional usando diferentes sistemas
| Os princípios gerais da arquitetura de computadores. numéricos.
| A operação dos barramentos de dados, endereços e | O processamento de números negativos feito por um
controle de um computador. computador.
| A distinção entre RISC e CISC
| O modelo de programação e programação do
Informática. microprocessador 8085.
| A comparação entre a programação em linguagem | A pinagem e os recursos de hardware do 8085.
assembly e de alto nível.
| Os sistemas numéricos binários, hexadecimais e BCD.

0,1 | Uma Breve História dos Microprocessadores


O que é um microprocessador? Costumamos responder que é um processador em um único microchip, onde a palavra
'micro' significa pequeno. Um processador é um dispositivo que tem capacidade de computação, ou seja, capacidade de
processamento de dados. Ao longo dos anos, o poder de computação dos chips de microprocessador aumentou
acentuadamente, juntamente com a velocidade de processamento, e essa tendência continua à medida que novos aplicativos são previstos.
A idéia de um computador de chip único já existia desde a década de 1950, mas naquela época, a eletrônica e a
tecnologia de circuitos integrados ainda estavam em sua infância. No final da década de 1960, as coisas mudaram e os
circuitos integrados já haviam feito incursões no mercado de tecnologia. Naquela época, havia muitas empresas no campo
tentando desenvolver um computador de chip único e uma delas era a Intel. A Intel lançou seu chip multifuncional de 4 bits,
o Intel 4004, em novembro de 1971. Ele tinha uma velocidade de clock de 108 KHz e 2.300 transistores com portas para
ROM, RAM e E/S. Este foi apenas o começo de inovações mais recentes. Em abril de 1972, a Intel apresentou o 8008, que
era apenas uma versão de 8 bits do 4004. Como não tinha nada de espetacular a oferecer, esse microprocessador não fez
muito pela Intel ou pelo campo do microprocessador. Enquanto isso, outras empresas começaram a fazer sentir sua
presença, por meio de suas próprias versões de microchips com recursos de computação.

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

Imagem de abertura do capítulo: Um sistema baseado em microprocessador.


Machine Translated by Google

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.

Outros players do mercado

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.

0.1.1 | A família x86


O verdadeiro avanço da Intel veio quando, em 1981, a IBM escolheu o Intel 8088 para seu computador pessoal. Com isso, o
segmento de mercado da Intel cresceu aos trancos e barrancos. A Intel continuou atualizando e aprimorando a arquitetura x86
com inovações cada vez mais recentes e como o x86 já havia estabelecido seu lugar no mundo dos PCs, os PCs também se
tornaram cada vez mais sofisticados. A Tabela 0.1 fornece a linha do tempo do lançamento dos vários processadores x86. O
ponto a ser lembrado é que o 8088 foi o primeiro processador x86 usado em um PC e era uma arquitetura de 16 bits com um
barramento de dados externo de 8 bits. Observe que o 8086 foi fabricado anteriormente com a mesma arquitetura interna do
8088, mas tinha um barramento de dados externo de 16 bits o que dificultava a conexão com periféricos de 8 bits e era mais caro

também. Por isso não foi escolhido para o PC.

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 3

Tabela 0.1 | Ano de lançamento de vários processadores x86

processador x86 Ano de lançamento

8086 1978

8088 1979

80186 1982

80286 1982

89386 1985

80486 1989

Pentium 1993

Pentium Pro 1995

Pentium-2 1997

Pentium-3 1999

Pentium-M 2002

Pentium-4 2004

Pentium-D 2005

Núcleo-2 2006

Núcleo-2 Quad 2007

Figura 0.1 | O primeiro processador x86 – o 8086

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.

0.1.2 | A filosofia x86


O que significa o termo x86? Refere-se a um conjunto de instruções em linguagem de máquina, cuja filosofia e uso
foram introduzidos no processador 8086. Ele foi projetado pela Intel, mas outras empresas como a AMD também
usaram o mesmo vocabulário, embora seu design interno pudesse ser diferente. O mesmo foi seguido pela Intel para
os processadores 80186, '286, '386, '486 e as diferentes versões do Pentium. Ao longo dos anos, o conjunto de
instruções x86 cresceu e se expandiu, mas a compatibilidade com versões anteriores com membros anteriores foi
mantida. O que isso significa é que um programa escrito para 8086 será executado em uma máquina Pentium (mas
não o contrário). O status atual dos processadores x86 é que é o padrão de fato para PCs de desktops
Machine Translated by Google

4 OS MICROPROCESSADORES x86

a servidores e laptops a supercomputadores. Existem outros concorrentes no mercado (alguns oferecendo


processadores superiores), mas sua participação de mercado é relativamente pequena.
Agora que demos uma olhada na história da família de processadores x86, vamos também dar uma olhada
na história dos PCs, porque é onde os processadores x86 têm o número máximo de aplicativos.

0.1.3 | Computadores pessoais


Vimos que a IBM fabricou seu primeiro computador pessoal em agosto de 1981, usando o 8088 (veja a Figura
0.2). O IBM Personal Computer foi apresentado como IBM 5150. Durante seu desenvolvimento, o IBM 5150 foi
chamado internamente de 'Project Chess' e foi criado por uma equipe de 12 pessoas lideradas por Don Estridge
e Larry Potter. O primeiro IBM PC tinha um processador Intel 8088, 64 KB de RAM (expansível até 256 KB),
uma unidade de disquete (que poderia ser usada para inicializar o computador com uma versão renomeada do
MS-DOS (PC-DOS) e uma placa de vídeo CGA ou monocromática.A máquina também tinha uma versão do
Microsoft BASIC em ROM.
Em março de 1983, o IBM PC-XT foi comercializado, com a mudança sendo que também tinha um disco
rígido. XT significa 'Tecnologia Estendida'. A mudança seguinte ocorreu em agosto de 1984, quando o 80286,
um processador de 16 bits, que também tinha capacidade de memória virtual, foi usado pela IBM em seu PC.
Eles o chamaram de PC-AT com AT significando 'Tecnologia Avançada'. Então, um após o outro, 80386, 80486
e Pentium passaram a ser usados em PCs. O processador desenvolvido após o '486 deveria ser nomeado
80586, e a Intel queria registrar esse número, mas uma decisão judicial impediu isso. Assim, a palavra Pentium
foi cunhada e a Intel não teve que olhar para trás depois disso. Diferentes versões do Pentium dominam o
mercado de PCs como todos sabemos.
Aliás, não foi a IBM que primeiro usou o termo PC. A palavra 'Computador Pessoal' era de uso comum
bem antes da IBM desenvolver seu primeiro PC, e muitos outros

Figura 0.2 | O primeiro IBM PC 5150


Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 5

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.

Sobre o que é este livro

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.

0,2 | Noções básicas de arquitetura de computadores

0.2.1 | O diagrama de blocos de um computador


Um computador, como o próprio nome indica, é uma máquina usada para computação. A computação, que muitos
anos atrás significava cálculos aritméticos, agora deu lugar a grandes quantidades de 'processamento de dados'.
Como tal, é mais razoável designar o computador agora como uma 'máquina de processamento de dados'. Para
executar suas tarefas designadas, esta máquina requer muitos componentes, que podem ser divididos em
hardware e software. Hardware é, obviamente, os componentes físicos de um computador.
Software é a coleção de programas que direciona o hardware para realizar suas tarefas.
Vamos primeiro olhar para um computador em termos de seu hardware. A Figura 0.3 mostra a descrição
arquitetônica de um sistema computacional. Ele mostra as principais partes do computador e também indica como
essas partes estão conectadas, para formar a máquina de computação. As partes principais são a CPU, memória
e dispositivos de entrada/saída.
O coração de um computador é a 'unidade central de processamento'. É esta unidade que dá 'vida' a um
computador. A CPU geralmente é um 'microprocessador', o que significa que geralmente é um chip separado e
independente. A CPU processa os dados que lhe são fornecidos, de acordo com os programas destinados a
operar sobre esses dados. O programa consiste em 'instruções'. Estas instruções são decodificadas
Machine Translated by Google

6 OS MICROPROCESSADORES x86

CPU

Memória E/S

Figura 0.3 | O diagrama de blocos de um computador

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.

0.2.2 | O barramento do sistema

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 7

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

Figura 0.4 | O barramento do sistema e seus componentes

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

Ciclo de execução Ciclo de execução

F - Buscar
D-Decodificar
E-Executar

Figura 0.5 | O ciclo de execução

RELÓGIO
CICLO

TEMPO

Figura 0.6 | Relógio do sistema

0.2.4 | Relógio do sistema


Todas as atividades do processador e dos barramentos são sincronizadas por um relógio, que é como mostrado na
Figura 0.6 uma onda quadrada com uma frequência específica. O recíproco da frequência de clock é o tempo de ciclo
T, também chamado de período de clock. T = 1/ f onde f é a frequência de clock. Um ciclo de execução pode exigir
muitos períodos de clock. Isso depende das características arquiteturais do processador, bem como da complexidade
da instrução a ser executada. Como um ciclo de execução também envolve buscar instruções e dados da memória,
também depende de quantos ciclos de clock são necessários para acessar a memória. Obviamente, o tempo de
execução também depende da velocidade do clock. ou seja, uma velocidade de clock de 3 GHz implica um
processamento mais rápido do que um clock de 1 GHz. No entanto, a tecnologia utilizada para o processador deve
ser capaz de suportar a frequência de clock utilizada.

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 9

Endereço

Ler MEMÓRIA Dados

Escreva

Figura 0.7 | Memória e sinais de controle associados

Ciclo de leitura de memória As etapas envolvidas em um ciclo de leitura típico são:

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.

iv) Transfira os dados do barramento de dados para o processador.

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.

ii) No barramento de dados, coloque os dados a serem escritos.

iii) Ativar o sinal de escrita de memória que faz parte do barramento de controle.

iv) Aguarde até que os dados sejam armazenados no local endereçado.

v) Desative o sinal de escrita na memória. Isso encerra a operação de gravação na memória.

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.

0.2.6 | O sistema de E/S


Para que um computador se comunique com o mundo exterior há a necessidade dos chamados periféricos. Alguns desses
periféricos são dispositivos puramente de entrada, como teclado e mouse; alguns são dispositivos puramente de saída,
como a impressora e o monitor de vídeo, e outros, como o modem, transferem dados em ambas as direções. Tudo isso
significa apenas que esses dispositivos de E/S são necessários para usarmos um computador. No entanto, é difícil para um
processador lidar diretamente com dispositivos de E/S, devido à sua incompatibilidade com o processador – cada periférico
é diferente e as condições de operação, voltagens, velocidades e padrões não são compreensíveis para o processador. O
processador não possui os sinais de controle necessários para lidar com diferentes periféricos. Portanto, a prática normal é
que cada periférico tenha um controlador que atue como uma interface entre o periférico e o processador. Este controlador,
que pode ser um chip de finalidade especial, compreende as características do dispositivo em particular e fornece os sinais
de controle necessários ao processador para se comunicar com o periférico. Assim, temos controladores especializados
para a maioria
Machine Translated by Google

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

Figura 0.8 | O sistema 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.

0,3 | Idiomas do computador


0.3.1 | Linguagem de máquina, linguagem assembly e linguagem de alto nível
O computador é apenas um equipamento idiota, a menos que sejamos capazes de fazê-lo funcionar para
nós. Para isso, devemos ser capazes de 'programá-lo', para que ele execute as tarefas que lhe atribuímos.
Programar um computador envolve o uso de uma linguagem que o computador entende. A linguagem
nativa dos computadores é a 'linguagem de máquina' que consiste em uns e zeros binários. O computador
conhece essa linguagem, e as séries de uns e zeros alimentadas a ele são 'códigos de operação' para ele,
que informam qual ação deve ser executada. Assim, há um código binário para adição e outro para
subtração. Esses códigos de operação são chamados de 'opcodes' e essa linguagem é chamada de
'linguagem de máquina'. Programar em linguagem de máquina significa escrever os opcodes das tarefas
que queremos que sejam feitas pelo computador.
No entanto, o problema com a linguagem de máquina, como é óbvio, é que ela é complicada e
propensa a erros. Os seres humanos não são bons em lembrar ou usar códigos binários. Programar
usando linguagem de máquina não é algo que qualquer um de nós provavelmente gostará. Para facilitar a
comunicação com os computadores, existe uma linguagem em um nível um pouco mais alto e isso é
chamado de 'linguagem de montagem'. Isso é mais inteligível para os usuários do que o código de
máquina. Esta linguagem usa 'mnemônicos' para especificar a operação que o computador deve realizar.
Esses mnemônicos são uma tradução direta do código de máquina para um símbolo. Por exemplo, o
código binário para adição é substituído pelo símbolo 'ADD' – o código binário para multiplicação recebe o
nome simbólico 'MUL'. O mnemônico exato utilizado depende do tipo de processador, mas estará relacionado à opera
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 11

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

i) fácil de entender e escrever,

ii) não são específicos do processador.

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

0,4 | Arquiteturas RISC e CISC


Dois termos que provavelmente serão encontrados com frequência ao ler sobre arquitetura de computador são
RISC e CISC. RISC significa Computador de Conjunto de Instruções Reduzido e CISC significa Computador de
Conjunto de Instruções Complexo. Como há muita controvérsia em torno desses dois termos, vamos tentar
descobrir do que se trata.
Nos primeiros dias de desenvolvimento de microprocessadores, a tendência era ter instruções complexas
implementadas totalmente usando hardware. Por exemplo, a instrução de multiplicação é uma instrução complexa
que precisa de um multiplicador de hardware dedicado. Como o hardware é rápido, a execução é rápida, mas
com muitas instruções tão complexas, o orçamento de hardware é naturalmente alto. Essa é a filosofia e a
principal característica do CISC.
O RISC, por outro lado, encara este assunto de forma diferente. Em média, o número de instruções
complexas que um computador usa é relativamente menor. Então, por que não realizar uma instrução complexa
usando um conjunto de instruções simples? Isso é possível, e a vantagem é que o orçamento de hardware é
muito menor. O conjunto de instruções também é pequeno. No entanto, o software deve ser escrito para realizar
instruções complexas com instruções simples. Isso equivale a trocar software por hardware.
Existe uma longa história de controvérsia sobre qual é o melhor. A arquitetura x86 foi baseada na filosofia
CISC, desde o início. Quando os princípios RISC se tornaram populares e o desenvolvimento de software para
RISC se estabeleceu, os processadores x86 CISC já haviam conquistado um nicho no mercado de processadores.
Assim, mesmo que os apoiadores do RISC pudessem estabelecer seu ponto de vista, a maioria dos
desenvolvedores não queria correr o risco de mudar para um domínio não testado. No entanto, a maioria dos
processadores mais novos usa a filosofia RISC para suas arquiteturas – exemplos são ARM, Power PC,
processadores Sparc da Sun e similares. Muitos deles encontraram suas aplicações no campo de processamento
embarcado.
As principais características do RISC são que eles possuem apenas instruções simples implementadas em
um único relógio. No entanto, há uma ironia nisso, muitos processadores RISC têm tantas instruções complexas
quanto os processadores CISC. Provavelmente isso pode ser justificado explicando que tais instruções complexas
foram implementadas usando microprogramação em vez de uma realização direta de hardware. A
microprogramação é um método de implementação da unidade de controle de um computador, dividindo as
instruções em uma sequência de pequenos passos de programação.
Enquanto a controvérsia RISC versus CISC ainda está furiosa, a distinção entre o que exatamente é RISC
e o que é CISC está reduzindo a ponto de ser quase indistinguível, exceto no nível filosófico básico. A Intel, que
manteve o CISC por muitos anos, curvou-se à arquitetura RISC projetando seu Pentium Pro com instruções
complexas que internamente eram divididas em instruções simples do tipo RISC. Portanto, o comentário é que o
Pentium Pro é um processador RISC que executa instruções CISC.

0,5 | Sistemas numéricos


Motivação No estudo de microprocessadores, teremos que usar muitos sistemas numéricos diferentes e
conversões de um sistema para outro. A clareza dessas ideias é muito importante para o cálculo correto e a
interpretação correta dos resultados. Esta é a motivação para uma revisão sobre ele, embora a maioria de vocês
já tenha tido uma introdução a ele.
Estamos bastante acostumados com o sistema de numeração que chamamos de sistema de numeração
decimal, que é um sistema com base (raiz) 10. Estamos tão acostumados com esse sistema de números que
nossa visualização de quantidade é sempre baseada nele. Nossas faculdades mentais estão sintonizadas para
realizar todos os cálculos neste sistema numérico. Em contraste, os computadores não se sentem confortáveis com isso.
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 13

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.

0.5.1 | O sistema decimal


A base deste sistema é 10 (dez) – e segue-se naturalmente que existem dez símbolos definidos neste sistema – as
combinações destes dez símbolos dão-nos vários valores. Os dez símbolos aqui são 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9, e são
chamados de 'dígitos'. A posição de um dígito em um número é o que dá seu valor.

Por exemplo, como o número 346 obtém seu valor?


346 = 3 × 102 + 4 × 101 + 6 × 100
= 300 + 40 + 6

Isso significa que, associado a cada posição, existe um peso. Aqui o peso é uma potência de 10. Assim

56785 = 5 × 104 + 6 × 103 + 7 × 102 + 8 × 101 + 5 × 100


= 50.000 + 6.000 + 700 + 80 + 5

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.

0.5.2 | O sistema numérico binário


A base desse sistema é 2 e, portanto, tem dois símbolos, 0 e 1, cada um deles sendo chamado de bit.
Portanto, cada posição tem um peso que é uma potência de 2. Pegue o número 110110. Vamos encontrar seu valor.
Como existem 6 bits, existem seis posições com pesos conforme mostrado para os bits:
Potência de +24 +23 +22 +21 +20

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.

Nota Mantenha a calculadora do PC (Acessórios do Windows) aberta no modo científico.


Isso ajudará a verificar todos os cálculos que vamos fazer a partir de agora.
A seguir, vamos tentar entender o conceito de números binários fracionários.
Machine Translated by Google

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

Peso 40 20 2ÿ1 0. 25 0. 125


Número 0,5 . 0. 11
Valor 0 + 0,25 + 0,125

O exemplo 0.1 mostra 1001.011 em binário (geralmente escrito como 1001.0112 ).


Também mostra a potência e o peso ou valor de cada posição do dígito. Assim, 1001,001 é equivalente em
decimal a 9,375 (8 + 1 + 0,25 + 0,125).
Observe que esta é a soma de 23 + 20 + 2ÿ2 + 2ÿ3 , mas 22 e 21 não são adicionados, pois o bit sob
essas posições é 0. A parte fracionária é composta por 2ÿ2 e 2ÿ3 , mas não há dígito abaixo de 2ÿ1
, então 0,5 não é adicionado.

0.5.3 | O sistema numérico hexadecimal


Em seguida é o sistema hexadecimal de numeração que tem 16 símbolos ou seja, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A,
B, C, D, E, F. A base do sistema é 16 e cada símbolo é chamado de 'dígito hexadecimal'. Cada posição no
sistema de numeração hexadecimal tem um peso que é uma potência de 16. Vamos encontrar o valor de
240FCH. A letra 'H' é sufixada ao número se for necessário deixar claro que é um número hexadecimal. A a F
têm os valores decimais de 10 a 15.
Potência de 164 +163 +162 +161 +160
16: Peso: 63536 +4096 +256 +16 +1
Número: Valor: 22× 4 +4 0 F C
ou seja, 65536 × 4096 +0 × 256 +15 × 16 +12 × 1
131072 = +16384 +0 +240 +12
147708

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

Potência de 161 +160 +16ÿ1


16: Peso: 16 +1 +0,0625
Número: Valor, 22 . 1
ou seja, × 16 5 +5 × . +1 × 0,0625
32 = 1 +5 . +0,0625
37,0625

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 15

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.

0,6 | Conversões de formato de número


0.6.1 | Conversão de Decimal para Binário
O método consiste em dividir o número decimal por 2, até que o quociente seja 0. Veja a técnica
ilustrada abaixo.

Exemplo 0,3
Encontre o valor binário de 13.

Solução

Divida 13 por 2 repetidamente e salve os restos


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, como uma linha da esquerda para a direita. Obtemos 1101
como o número binário convertido.
Assim, conseguimos converter de decimal para binário por divisão repetida por 2, a base do
sistema de numeração binário. Para verificar, tente converter esse número binário de volta para decimal.
Deve ser 13. Ou simplesmente use a calculadora científica para verificar a conversão. (Certifique-se de que ele seja
mantido aberto na área de trabalho do seu PC.)

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

0.6.2 | Conversão de Decimal para Hexadecimal


A conversão de decimal para hexadecimal é feita dividindo-se por 16 e encontrando os restos. Restantes de 10 a 15
serão escritos usando os símbolos hexadecimais A a F. Veja como 225 é convertido para uma forma hexadecimal.

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.

0.6.3 | Convertendo de binário para hexadecimal


Se pegarmos qualquer dígito hexadecimal, observe que seu valor decimal varia de 0 a 15. Por exemplo, F é 15, A é 10
e assim por diante. Se um dígito hexadecimal tiver que ser convertido em um número binário, o número máximo de bits
necessários é 4.
Consulte a Tabela 0.2. Qualquer dígito hexadecimal pode ser escrito como um grupo de quatro bits. Tomando um exemplo,
4C57FH pode ser escrito em binário, escrevendo o binário equivalente de cada um dos dígitos
Hex 4. C F

Binário 1111 0100 1100 5 0101 7 0111

Tabela 0.2 | Representações Hex, Binárias e Decimais


Decimal Hex Binárias Decimal Hex Binário
0 0 0000 8 8 1000

1 1 0001 9 9 1001

2 2 0010 10 UMA 1010

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 17

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.

1110 0101 0101 0001 1101 B ou seja, binário


E 5 5 1 D Oi, hexadecimal

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

O número hexadecimal equivalente é AE1F1H.

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.

0.6.4 | Números BCD


BCD significa 'Decimal Codificado Binário', mas há mais do que ser apenas uma representação binária de um número
decimal. Vejamos os detalhes.

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.

Assim, o código binário de cada dígito decimal está em um byte.

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:

i) escreva o equivalente binário de cada número decimal, como um nibble,

ii) escreva o equivalente hexadecimal de cada nibble.

675 é 0110 0111 0101


6 7 5 H

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

Número Binário Hex BCD BCD em formato hexadecimal

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 19

É muito importante ter isso em mente quando fazemos programas usando aritmética BCD.
Sempre que tiver dúvidas, volte a este capítulo.

0.6.5 | Código ASCII


Esta palavra pronunciada como 'ask-ee' é a abreviatura das palavras 'American Standard Code for
Information Interchange'. Este é o código usado ao inserir dados através do teclado e exibir o texto na
tela de vídeo. É muito importante saber o que é e como esse código é usado.

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.

0.6.6 | Representação de Números Negativos


Existem várias maneiras de representar números negativos – como magnitude com sinal, complemento
de um, complemento de dois e assim por diante, mas vamos discutir imediatamente a representação
usada pelos computadores para isso. Os computadores usam a representação 'complemento de dois'
para números negativos. O método é complementar cada bit do número e adicionar um '1' a ele. Vamos
ver como é feito.
Começaremos com números de 4 bits. Digamos que queremos representar -6.

i) Escreva o valor binário de 4 bits de 6:0110.


ii) Complemente cada bit: 1001.
iii) Adicione '1' a isto: 1010.

Então –6 é '1010', para computadores.


Vamos tentar isso para todos os números de 0 a 7. Veja a Tabela 0.4 que mostra a representação
numérica positiva e negativa de números possíveis de serem representados em quatro bits. Várias
observações podem ser feitas a partir da Tabela 0.4.

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

Tabela 0.3 | O Código ASCII - Símbolos versus Símbolo de Valor


ASCII
Hexagonal Símbolo ASCII Símbolo ASCII Símbolo ASCII

(Hex) (Hex) (Hex) (Hex)

MAU 0 DE ACORDO COM 10 (Espaço) 20 0 30

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

ACK 6 SYN 16 & 26 6 36

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 21

Tabela 0.4 | Representação de números negativos e positivos em binário de 4 bits

Números Negativos Binário Hex Números Positivos Binário Hex


ÿ8 1000 8

ÿ7 1001 9 +7 0111 7

ÿ6 1010 UMA +6 0110 6

ÿ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

Os passos: 0000 0110


1111 1001 ;complementa cada bit
1111 1010 ;adicione '1' a ele
MAS ;em hexadecimal

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

Tomando o complemento de dois dá 000E


que é 1110, ou seja, 14 – o que significa que ÿ14 é o número representado por FFF2H.
ii) F9H

Tomando o complemento de dois dá


0111 ou seja, 7, o que significa que ÿ7 é o número representado por F9H.

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.

0,7 | Aritmética computacional


0.7.1 | Adição de números não assinados
Quando dizemos que um número é sem sinal, isso implica que o sinal do número é irrelevante, o que na
verdade significa que consideramos os números como sem bit de sinal – todos os bits atribuídos aos dados
são usados apenas para a magnitude, em eff ect, verifica-se que estes se referem a números positivos. Com
8 bits, podem ser usados números de 0 a 255.
A adição binária é algo que você já aprendeu. Aqui estamos revisando para trazer em foco alguns
pontos importantes que talvez precisemos ser cuidados, no estudo da programação de microprocessadores.

A adição binária é feita adicionando bits na coluna. Vamos considerar dados de tamanho de byte.
Caso 1

Binário Decimal Hexadecimal


0101 1001 + 89 + 59H +
0110 1001 1100 105 194 69H
0010 C2H

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 23

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.

0.7.2 | Adição de números BCD compactados


Agora vamos adicionar números BCD compactados
Caso 1

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 dá a soma correta de 72.


Caso 3

Isso é quando o nibble superior da soma é maior que 9. A correção é adicionar 6 apenas ao nibble superior.

Adicione BCD 76 e 62. Na forma binária, as adições são


0111 0110 + 76H +
0110 0010 1101 62H
1000 + 0110 D8H + Agora adicionando 6 ao nibble superior,
0000 1 0011 1000 60H
138H

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

Decimal Binário Hexadecimal


i) 39 + 99 138 0010 0111 + 27H +
0110 0011 1000 63H
1010 8AH

ii) 117 + 156 0111 0101 + 75H +


273 1001 1100 1 9CH
0001 0001 1 1 1H

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.

0.7.3 | Adição de números negativos


Sabemos agora que os números negativos são representados na notação de complemento de dois. Vamos
considerar a adição de dois números negativos.

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 25

É 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

Um número é positivo e o outro é negativo.


+90 0101 1010 +
ÿ26 1110 0110
64 1 0100 0000

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

ÿ120 1000 1000 +


+45 0010 1101
ÿ75 1011 0101

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

230 – 56 1110 0110 – 0011 E6H -


174 1000 1010 1110 38H
morto

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.

0,7,5 | Subtração de BCD compactado

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 27

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.

0001 1100 1010 –


0101 0110
0111 0100

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

Decimal BCD embalado


53 - 18 0101 0011 –
0001 1000

Primeiro passo

O empréstimo do nibble do lado esquerdo para o nibble do lado direito dá


0100 1101 –
0001 1000
0101

Segundo passo
0100 1101 –
0001 1000
0011 0101

O resultado é 35, como deveria ser.

0.7.6 | Subtração de Números Assinados


A subtração é o processo de mudar o sinal do segundo número e adicionar ao primeiro.
65ÿ34 é 65 + (ÿ34).
Então, quando fazemos a subtração, na verdade adicionamos a forma do complemento de dois (ou seja, o
negativo) do segundo número ao primeiro número. Isso é o que os computadores realmente fazem quando
realizam a subtração. Na discussão da subtração na Seção 0.7.4, isso não foi mencionado explicitamente, porque
a ideia então era apresentar alguns outros meandros relacionados à subtração. Agora vamos
Machine Translated by Google

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.

ii) +26 de ÿ68 ou seja, ÿ68 – (26) ÿ68 + (ÿ26)


ÿ68 é (na forma de complemento de dois) 1011 1100 +
ÿ26 1110 0110
ÿ94 1 1010 0010

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

ii) -56 de -23


O cálculo a ser feito é ÿ23 ÿ (ÿ56) ou seja, ÿ23 + 56.
ÿ23 + 56 1110 1001 +
33 0011 1000
1 0010 0001
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 29

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.

Estouro no bit assinado


Sempre que usamos números com sinal de 8 bits em adição ou subtração, o resultado é considerado
correto em sinal e magnitude se estiver dentro do intervalo de -128 a +127. No entanto, suponha que isso
seja violado? O que acontece depois? Um caso típico é quando dois números negativos são adicionados.
Tente adicionar -100 e -55. Ambos os operandos estão dentro do intervalo permitido. Veja a adição.

ÿ100 + 1001 1100 +


ÿ55 ÿ155 1100 1001
1 0110 0101

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.

0.7.7 | Adição de Números de Comprimentos Diferentes


Discutimos detalhadamente a aritmética computacional, porque é muito importante ser claro sobre isso,
para poder entender como o microprocessador responde a diferentes tipos de dados e operações
aritméticas. Agora vamos tentar entender como os dados de diferentes larguras de dados são tratados.

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

Neste, 35H é anexado com zeros para torná-lo 0035H.


0035H +
7890H
78C5H
Machine Translated by Google

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

Somando os dois, temos 4077 cuja representação hexadecimal é 0FEDH.


iii) Adicionar F5H e B45CH
Neste, F5H é sinal estendido para ser FFF5H
Adicionando
FFF5H +
B45CH … note que este é um número negativo
1 B451H

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.

0,8 | Unidades de capacidade de memória


Um dispositivo de memória é aquele em que os dados são armazenados. A quantidade de dados que um dispositivo de
memória pode armazenar depende de sua capacidade. A capacidade de memória é especificada como múltiplos de bytes,
pois a memória é organizada por bytes, o que significa que um byte é armazenado em um local da memória. Então, se houver
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 31

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:

Peta Byte (PB) = 250 bytes


Byte Exa (EB) = 260 bytes
Zetta Byte (ZB) = 270 bytes

0,9 | O microprocessador 8085


Nesta seção, faremos uma breve revisão do microprocessador 8085. Mesmo não sendo um membro da família x86, tem
um lugar importante na história dos microprocessadores da Intel.
Era um microprocessador muito popular nos dias anteriores ao advento da família x86. Nunca foi usado em um PC, mas
tornou-se popular para vários usos onde a computação estava envolvida.
Também se manteve popular no campo acadêmico, onde era considerado um modelo fácil de ensinar e entender.
Portanto, uma espiada nos atributos do 8085 estaria em ordem. Esta seção também pode servir como um primeiro passo
no estudo de microprocessadores em geral.
O 8085 foi lançado pela Intel em 1976. É um DIP de 40 pinos (pacote duplo em linha, no qual os pinos são montados
como duas fileiras paralelas de uma caixa retangular). Este chip tem oito pinos de dados e 16 pinos de endereço. Assim,
os dados podem ser lidos dentro e fora do chip como oito bits de cada vez. O fato de ter 16 linhas de endereço implica
que a quantidade de memória que ele pode acessar é de 216 bytes – ou seja, pode ter acesso à memória de no máximo
64 KB. Além dos pinos de dados e endereços, ele também possui vários pinos de controle. Discutiremos os aspectos de
hardware posteriormente e nos concentraremos primeiro no modelo de programação, pois é mais fácil entender um
processador a partir de tal modelo.

0.9.1 | O Modelo de Programação do 8085


A Figura 0.9 mostra o modelo de programação do processador. O diagrama de blocos funcional mostra uma unidade
lógica aritmética (ALU) e seus blocos associados. Todo o sistema é controlado pela unidade de temporização e controle
que sincroniza as atividades do processador com um relógio central. Todos os cálculos aritméticos e lógicos ocorrem na
ULA. As instruções da memória são trazidas para um registrador de instruções (não mostrado) e decodificadas pelo
decodificador de instruções.
Assim, a operação especificada ocorre na ULA. O acumulador é um registrador de 8 bits, chamado A, e sua importância
no 8085 é que ele serve para armazenar um dos operandos na maioria das operações aritméticas e lógicas de dois
operandos.
Machine Translated by Google

32 OS MICROPROCESSADORES x86

BUS DE ENDEREÇO

ACUMULADOR PROPÓSITO GERAL


REGISTRO
EU

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

Figura 0.9 | Modelo de programação do 8085

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.

0.9.1.1 | Registros de Uso Geral


Eles também são designados como registradores de rascunho e têm 8 bits de comprimento. O 8085 é uma máquina baseada em
'acumulador', o que significa que para muitas operações (principalmente aritméticas, lógicas e I/O), é obrigatório ter o operando/
um dos operandos no acumulador. Nesses casos, este registro está implícito e seu nome não está escrito na instrução. É anotado
como 'A' quando usado
em outras instruções.

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 33

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.

CONTADOR DE PROGRAMAS (16)

PONTEIRO DE PILHA (16)

H (8) eu (8)

D (8) E (8)

B (8) C (8)

UMA (8) BANDEIRAS (8)

Figura 0.10 | Estrutura de registro do 8085

PSW
(PALAVRA DE STATUS DO PROCESSADOR)

UMA (8) BANDEIRAS (8)

Figura 0.11 | O registrador A e flag combinados para formar o PSW

D7 D6 D5 D4 D3 D2 D1 D0

S A PARTIR DE XEX P X CY

Carregar

Paridade

Para. Carregar

Zero

Sinal

Figura 0.12 | Os bits do registrador Flag


Machine Translated by Google

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.

0.9.1.2 | Registros de Endereço


A Figura 0.10 mostra dois registradores de 16 bits – o contador de programa e o ponteiro de pilha. São registradores de
endereços.

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.

0.9.2 | Programação em linguagem assembly


Vamos agora tentar escrever alguns programas usando as instruções da linguagem assembly do 8085.
Os programas que são escritos são salvos na RAM de onde os bytes de instrução são buscados um byte por vez para
execução. Uma instrução pode precisar de um ou mais espaço de byte para armazenamento.
A execução de uma instrução pode precisar de dados de endereços de memória conforme especificado na instrução.
A execução do programa prossegue sequencialmente, uma após a outra, na ordem em que são buscadas.
Nesta sequência, pode acontecer que uma instrução 'branch' seja encontrada. Ramificar significa 'saltar' para um local
que não está na sequência seguida agora. Uma instrução de desvio assume o controle de um conjunto diferente de
instruções escritas em uma área diferente da memória. A maioria dos casos de ramificação depende das condições,
embora a ramificação incondicional também seja possível.

O formato geral de escrita de código assembly é mostrado abaixo:


etiqueta: instrução ; Comente
Os rótulos não são necessários para todas as linhas e os comentários são opcionais – eles são usados apenas para
melhorar a compreensão da linha de instrução. Com essas idéias básicas, vamos para os aspectos mais finos da
programação 8085. Para a maioria dos montadores, um ponto e vírgula precede o comentário e dois pontos são
necessários junto com um rótulo.

0.9.2.1 | Modos de endereçamento


Agora que temos a lista de registradores disponíveis no 8085, podemos começar a programar o chip – mas também
temos que conhecer os modos de endereçamento, antes de podermos mergulhar de fato na programação.
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 35

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.

Os modos de endereçamento disponíveis são:

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.

MOV A, B ;copia o conteúdo de B para A


MOV C, A ;copia o conteúdo de A para C
ADICIONE A, H ; adicione o conteúdo de H e A - soma para estar no destino, ou seja, A

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.

;O conteúdo deste local é copiado para o acumulador (registro A)

STA 2345H ;armazenar acumulador direto – o conteúdo do acumulador é


armazenado no endereço 2345H
EM 56H ;copia os dados na porta de entrada com endereço 56H para o
registrador A

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.

MOV C, M ;copia o conteúdo da 'memória especificada indiretamente' para o


registro C. Para esta instrução, o 'endereço' deve ser carregado no
par de registradores HL anterior a esta
instrução
Machine Translated by Google

36 OS MICROPROCESSADORES x86

ESTÁGIO B ;'armazenar acumulador indireto' neste, o conteúdo do acumulador é


armazenado no endereço especificado pelo par de registradores BC.

Endereçamento imediato
Aqui, os dados de origem são escritos na própria instrução

MOV A, 78H ;copie o número 78H para A


ADICIONAR A, 67 ;adicione o conteúdo de A e o número 67. A soma deve estar em A.

LXI H, 3453H ;o número imediato 3453H é carregado no par de registradores HL

0.9.3 | Conjunto de instruções de 8085


O conjunto de instruções pode ser dividido em grupos funcionais como:

i) Instruções de transferência de dados.

ii) Instruções aritméticas.

iii) Instruções lógicas.

iv) Instruções da filial.

Discutiremos cada grupo com mais detalhes agora, usando um conjunto de amostra de cada grupo.

0.9.3.1 | Instruções de transferência de dados


Essas instruções são responsáveis pela transferência de dados entre registradores, registrador e memória, E/S e acumulador.
Eles também incluem instruções para carregar um número de 8 ou 16 bits em um registrador do mesmo tamanho. Para certas
instruções, o acumulador (registrador A) está implícito. As instruções são listadas como:

i) MOV Rd, Rs ii) MVI ;copia dados de Rs(origem) para o registrador de destino(Rd)

Rd.data8 iii) Endereço ;move dados de 8 bits para registrador de 8 bits

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

MOV R, M vii) MOV M, R viii) ;carrega dados de 16 bits no par de registradores

Endereço LDA ix) Endereço ;copia dados para registro, da memória especificada indiretamente

STA x) LDAX Rp ;copia dados do registrador, para a memória especificada indiretamente

;carrega dados no acumulador do endereço especificado

;armazena dados do acumulador no endereço especificado

;carrega no acumulador, os dados do endereço de memória especificado


pelo par de registradores (Rp)

xi) STAX Rp ;armazena no endereço de memória especificado pelo par de


registradores Rp, os dados no acumulador

0.9.3.2 | Instruções aritméticas


Para todas as instruções aritméticas, o registrador A contém um operando (se houver dois operandos para a instrução). O
grupo aritmético inclui instruções para somar, subtrair, incrementar, decrementar e ajustar decimal após a adição de BCD.
Observe que não há
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 37

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

xii) INX Rp ;incrementa em 1 o conteúdo do par de registradores Rp


xiii) DCX Rp ;decrementa em 1 o conteúdo do par de registradores Rp
xiv) DAA ;acumulador de ajuste decimal - a ser feito após a adição de BCD

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

LDA 4567H ;copia no A,dados do endereço 4567H


ADI A,56H ; adicione 56H a isso - a soma está em A
STA 0567H ;armazena o conteúdo de A no endereço 0567H.

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

MOV A, M ;copia os dados no endereço apontado pelo HL


ADICIONE A,B ;adicione o conteúdo de B a A – soma em A
INX H ;incrementa o conteúdo do HL
MOV M,A ;armazena A no endereço apontado por HL

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

LXI B,6756H ;carrega o endereço de dados no par BC


LDAX B ;carrega em A o conteúdo apontado por BC
SUI 05 ;subtrai 05 de A - o resultado está em A
STAX 6756H ;armazena A no endereço apontado por BC

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.

0.9.3.3 | Instruções de Filial


i) JMP address16; salta incondicionalmente para o endereço fornecido
ii) JZ address16 ;salto em salto zero para o endereço fornecido se Z = 1

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

v) JNC address16 ;salto sem carry-jump para o endereço fornecido se C = 0


vi) CALL endereço16 ;chama um subprograma escrito no endereço dado

vii) RET ;retorna ao programa original após executar o subprograma

Para 8085, todos os endereços têm 16 bits de comprimento.

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

MOV A,0 ;torna o conteúdo de A = 0


MOV B,10 ;carrega o multiplicador (10) em B
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 39

NOVAMENTE: ADI A,24 ;adiciona o multiplicando(24) a A


DCR B ;decrementa B
JNZ NOVAMENTE ;verifica se Z (zero flag) é diferente de – zero – se
então, pule para NOVAMENTE
LDA 3400H ;se Z = 0, armazena a soma no endereço 3400H

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

0.9.3.4 | Instruções de manipulação lógica e de bits


8085 também possui um conjunto de instruções lógicas e de manipulação de bits. A lista é dada abaixo. Os bits de
sinalização são afetados por estas instruções:
i) ANA R; logicamente E os conteúdos de A e R – resultam em A

ii) dados ANI8; logicamente E o conteúdo de A e os dados fornecidos - resultam em A

iii) ANA M; logicamente E os conteúdos de A e memória – resultam em A

iv) ORA R; logicamente OU os conteúdos de A e R – resultam em A

v) dados ORI8; logicamente OU o conteúdo de A e os dados fornecidos - resultam em A

vi) ORA M; logicamente OR o conteúdo de A e a memória – resultam em A

vii) XRA R; logicamente XOR o conteúdo de A com o de R – resulta em A

viii) dados XRI8; logicamente XOR o conteúdo de A e os dados fornecidos - resultam em A

ix) XRA M; logicamente XOR o conteúdo de A e a memória – resulta em A

x) CMP R; compare o conteúdo de A e R - apenas as bandeiras afetadas,

xi) CMP M ;comparar o conteúdo de A e memória – apenas sinalizadores afetados

xii) dados CPI8 ;comparar o conteúdo de A e dados fornecidos - apenas as bandeiras afetadas

xiii) RLC ;girar os bits em A uma vez, para a esquerda

xiv) RAL ;girar os bits em A e o carry, para a esquerda, uma vez

xv) RRC ;girar os bits em A uma vez, para a direita

xvi) RAR ;girar os bits em A e o carry, para a direita, uma vez

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.

Tabela 0.5 | Configurações de sinalização após uma instrução de comparação

Se C bandeira Z bandeira

destino > origem 0 0

destino < origem 1 0

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 41

Solução

LDA 4566H ;carrega em A, o número na memória ;compara com o


CMP A, B número em B
JNC SIM ;Se C = 0, significa que A>B, salta para YES
MOV A,B ;C = 1, significa B>A, então copie não maior para A ;envie o número
SIM: FORA 67H maior para a porta de saída

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.

0.9.4 | Aspectos de Hardware do 8085 A Fig


0.13 mostra o diagrama de pinos do processador. Vamos discutir os pinos em detalhes. Ao fazermos
isso, os vários recursos do processador ficarão claros para nós.

X1 1 40 VCC

X2 2 39 AGUARDE

REINICIAR 3 38 HLDA

SOD 4 37 CLK (SAÍDA)

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

Figura 0.13 | Diagrama de pinos do 8085


Machine Translated by Google

42 OS MICROPROCESSADORES x86

0.9.4.1 | Barramento de dados/endereço multiplexado O

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

Figura 0.14 | Demultiplexação de endereços e dados


Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 43

0.9.4.2 | Leia e escreva


Consulte o diagrama de pinos na Fig 0.13 novamente. Pinos nos. 31 e 32 são WR e RD. Eles são sinais
baixos ativos. Eles são os sinais de controle para leitura de/para memória/IO. Lembre-se de como esses
sinais são usados (Seção 0.2.5). No entanto, esses sinais de controle são usados independentemente de a
leitura/escrita pertencer à memória ou I/O. O processador tem outro pino para diferenciar entre esses dois
gabinetes. Consulte Pino nº. 34. Tem a designação IO/ M. Este é um sinal de controle enviado pelo
processador, e é alto para acesso de E/S e baixo para memória. A lógica externa é usada como mostrado na
Fig 0.15 para obter os quatro sinais de controle separados – MEMRD, MEMWR, IOWR e IORD. A Fig 0.16
mostra o processador com o barramento de endereço separado, barramento de dados e sinais de controle de
leitura/gravação.

0.9.4.3 | Fonte de alimentação e relógio


Agora consulte a Fig 0.17 que mostra o diagrama de blocos funcional dos pinos do processador, alimentação
e clock. Os pinos 1 e 2 são os pinos entre os quais um cristal deve ser conectado. Existe um oscilador de
cristal interno para o chip, e a única coisa que fazemos é conectar um cristal externamente.
Esta define a frequência de clock para o processador. Internamente a freqüência do clock é dividida por 2.
Então, se precisarmos de um clock interno de 4 MHz, um cristal de 8 MHz deve ser conectado. A frequência
máxima de operação permitida para o 8085 é de 5MHz. Para isso, um cristal de 10 MHz deve ser conectado
entre X1 e X2 . O pino nº 37 está CLK OUT. A partir deste pino, o clock do
processador pode ser extraído e usado para cronometrar qualquer unidade do sistema que precise ser
sincronizada com o processador. O clock também pode ser dividido para obter frequências mais baixas que
podem ser usadas para dispositivos como um ADC (conversor analógico para digital), que pode fazer parte
do sistema baseado em 8085.

0.9.4.4 | Redefinir e pinos prontos


Existem dois pinos referentes ao reset. RESTIN é um sinal de entrada para o processador. Quando isso é
reduzido, o processador é reinicializado e o contador de programa é apagado. A execução do programa começa

8085

EU ESTOU

MEMRD

RD

WR
MEMBRO

IORD

IOWR

Figura 0.15 | Gerando sinais de controle separados para memória e E/S


Machine Translated by Google

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

no endereço 0000, que é o endereço correspondente ao valor do PC quando o sistema é reinicializado.


Enquanto isso acontece, RESET OUT pode ser usado para reinicializar outros dispositivos no sistema
simultaneamente.

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

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 45

+5 V GND

1 2 40 20

Serial
E/S SID 5 X1 X2 VCC VSS

Portas SOD 28
4
A15

Barramento de endereços de alta ordem

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

Figura 0.17 | Diagrama de bloco funcional de 8085

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

Tabela 0.6 | Interrompe os pinos e seus vetores


pinos de interrupção Vetor de interrupção

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.

0.9.4.6 | Segure e HLDA


Veja os pinos 38 e 39, eles correspondem aos pinos HOLD e HLDA (hold reconhece). Esses são os pinos que coordenam as
atividades de DMA do processador. Agora, o que é DMA? Normalmente, uma transferência de dados entre a memória e um
dispositivo de E/S sempre ocorre com o processador atuando como intermediário. Se os dados da memória devem ser enviados
para um dispositivo de saída, primeiro eles devem ser enviados para o acumulador do processador e, de lá, são transferidos para
o periférico. Tudo bem se os dados envolvidos forem pequenos. No entanto, para transferência de dados em massa, isso se torna
complicado.
Assim, o processador permite que os dados sejam transferidos diretamente entre um periférico e a memória, enquanto o
processador fica de lado após iniciar o processo.
Se, digamos, um periférico quiser um serviço de DMA, ele envia uma solicitação ao processador. A solicitação DMA é
colocada no pino HOLD. Como o DMA é um problema de alta prioridade, o processador para o que está fazendo e envia o sinal
de reconhecimento HLDA para o periférico. Com isso, os barramentos do processador são tri-estabelecidos, de modo que o
processador efetivamente fica desconectado do sistema.
Assim, um caminho direto de transferência de dados é estabelecido entre o periférico e a memória. Terminada esta transferência
de dados, o pedido HOLD é removido pelo periférico e o processador volta ao seu status de mestre do sistema.

0.9.4.7 | SID e SOD


Esses são dois pinos que a maioria dos outros microprocessadores não possui. São os pinos Serial Input Data (SID) e Serial
Output Data (SOD). Usando SID, os dados podem ser enviados em série, convertidos
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 47

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.

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| O barramento do sistema compreende o barramento de dados, o barramento de endereços e o barramento de controle.

| As atividades de um processador são restritas a buscar, decodificar e executar instruções.

| 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 tem 16 linhas de endereço e 8 linhas de dados.

| O 8085 é um dos processadores da Intel que possui o gerador de clock dentro do chip.

PERGUNTAS

1. Qual é o primeiro microprocessador notável desenvolvido pela Intel?

2. Cite dois microprocessadores de 8 bits da Intel que não fazem parte da família x86.

3. Qual microprocessador foi usado no primeiro IBM PC?

4. Qual é a contribuição da IBM para a revolução do PC?

5. O que significa o termo 'família x86' de microprocessadores?

6. Cite os três componentes mais importantes de um sistema de computador.

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?

9. Se o barramento de endereço de um processador é de 64 bits, qual é o seu espaço de endereço?

10. O que poderia ser um sistema de 'multiprocessamento'?

11. Qual é o primeiro passo no ciclo de execução de um processador?

12. Como a frequência do clock do sistema influencia a velocidade de processamento?

13. Se um sistema usa um clock de 1,5 GHz, qual é o seu período de clock?

14. O que significa a palavra 'barramento do sistema'?

15. Por que um computador deve ter um controlador de E/S?

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.

18. Como os sistemas numéricos hexadecimais e binários estão relacionados?

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?

21. Por que o 8085 é chamado de processador 'baseado em acumulador'?

22. Distinguir entre a instrução LDA e LDAX.

23. Liste as linhas de interrupção de 8085.

24. O que se entende por DMA?

EXERCÍCIO

1. Escreva brevemente a história da família x86 de microprocessadores.

2. Explicar os processadores RISC e CISC distinguindo entre os dois, elaborando as vantagens


e desvantagens de cada tipo. Cite alguns processadores de cada tipo.

3. Conheça o 'Apple Mac' – sua história, seus recursos e por que e como ele é considerado um
'ótimo' computador.

4. Escreva o equivalente decimal dos seguintes números:


a) 31,3H b)
1100,101B c)
A32,3H d)
100101B

5. Converta os seguintes números para a forma binária:


a) 34
b) 200 c)
90

6. Converta para formato hexadecimal.


a) 3454
b) 4523
c) 789
Machine Translated by Google

FUNDAMENTOS DE SISTEMAS DE COMPUTADOR 49

7. Escreva os valores binários para:


a) 34ADH b) 78FH c) 407BH

8. Escreva os valores hexadecimais de: a)


11000101010110001B b)
10011111100001010B

9. Encontre a representação BCD compactada dos seguintes números decimais:


a) 45
b) 4678
c) 802345

10. Represente o BCD compactado dos seguintes números em hexadecimal:


a) 235
b) 9123

11. Qual é o ASCII de cada um dos seguintes? a) 7 b)


8 c) 0 d) A e) Z f) yg) dh) * i) &

12. Encontre a representação em complemento de dois dos seguintes números em 8 bits:


i) ÿ45
b) ÿ90 c)
ÿ12 d)
ÿ34

13. Represente os seguintes números negativos usando 16 bits: a) ÿ267


b) ÿ4 c) ÿ5676 d) ÿ675

14. Execute a adição binária para os seguintes números:


a) 34 e 56 b)
ÿ52 e ÿ70 c) ÿ47 e
+120

15. Converta para BCD compactado e


adicione, a) 46 e 23 b) 55 e 67 c) 34
e 49 d) 99 e 44

16. Subtraia após a conversão para a forma binária,


a) -20 de -75 b) +49 de +97 c) E5H de A4H
Machine Translated by Google

50 OS MICROPROCESSADORES x86

17. Adicione os seguintes números


assinados: a) F3H e 3245H b) AH e
F45H c) B2H e 123EH

18. Quantos bytes constituem a) 5


MB b) 4 KB c) 32 MB d) 32
KB e) 8 GB
Machine Translated by Google

a arquitetura
1 de 8086

Neste capítulo, você aprenderá


| A arquitetura interna do 8086. | Como realizar cálculos de endereço de memória.
| Os registradores do 8086 e suas funções específicas. | Os diferentes modos de endereçamento do 8086.
| O funcionamento das bandeiras do 8086.
| A técnica de segmentação de memória usada pela família
x86.

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).

1.1 | Diagrama de Blocos Internos do 8086


O processador 8086 é um processador de 16 bits tanto interna quanto externamente – o que significa que sua largura
de barramento de dados e o tamanho de bits de seus registradores de dados internos são 16. Assim, ele pode acessar
uma fonte externa 16 bits por vez através de seu barramento de dados. No entanto, também tem a capacidade de
acessar e trabalhar em dados de 8 bits (byte).
Como primeiro passo para entender a arquitetura do 8086, vamos examinar o diagrama de blocos interno do 8086.
A Fig 1.1a mostra o diagrama de blocos simplificado e a Fig 1.1b o mostra com mais detalhes. Examinemos primeiro o
diagrama simplificado. Embora não seja mostrado especificamente no diagrama de blocos, deve-se notar que todas as
ações no processador são sincronizadas por um relógio do sistema, que fornece o tempo básico. Existe uma unidade
de controle que fornece os sinais de controle para o funcionamento geral do processador.

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.

1.2 | A Unidade de Execução


Ele contém a unidade aritmética e lógica, a unidade de controle, um barramento interno, além de alguns registros.
Vamos ter uma visão geral da UE começando com o conjunto de registros.

Imagem de abertura do capítulo: O chip 8086.


Machine Translated by Google

52 OS MICROPROCESSADORES x86

UNIDADE DE EXECUÇÃO UNIDADE DE INTERFACE DE BUS

ARQUIVO DE REGISTRO ARQUIVO DE REGISTRO DE TROCA

DADOS, PONTEIRO E REGISTROS DE SEGMENTO E

REGISTRO DE ÍNDICE PONTEIRO DE INSTRUÇÕES

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

Figura 1.1a | Diagrama de blocos interno do 8086 (modelo simplificado)

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.

1.2.1 | Os registros do Scratchpad


Eles são chamados assim porque são usados para armazenamento temporário, assim como anotamos algumas coisas
temporariamente em um rascunho. Conforme mostrado na Figura 1.2, o 8086 possui quatro registradores de uso geral de 16
bits rotulados como AX, BX, CX e DX. Cada um desses registradores também pode ser usado como dois
Figura
1.1b
|Diagrama
de
bloco
interno
do
8086
(detalhado)
REGISTRO EM
GERAL-
PROPÓSITO
REGISTOS
TEMPORÁRIOS
BHCHDH AH
BANDEIRAS
VAI
A
PARTIR
DE
SPBPSI
DL ALBLCL
UNIDADE
DE
EXECUÇÃO
(UE)
SISTEMA
DE
CONTROLE
16
UE
BITS
8
bits
UNIDADE
DE
INTERFACE
DE
BUS
(BIU)
123456
FILA
DE
INSTRUÇÕES
ESCSSSDSIP
BUS
DE
ENDEREÇO
BITS (20)
AO
CONTROLE
LÓGICA
ÔNIBUS
8086BUS
53 A ARQUITETURA DE 8086
Machine Translated by Google
Machine Translated by Google

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

A PARTIR DE ÍNDICE DE DESTINO

IP PONTEIRO DE INSTRUÇÕES

BANDEIRA BANDEIRA BANDEIRAS DE STATUS

CS CÓDIGO DE REGISTRO DO SEGMENTO

DS REGISTRO DO SEGMENTO DE DADOS

SS REGISTRO DE SEGMENTO DE PILHA

ISSO É REGISTRO DE SEGMENTO EXTRA

Figura 1.2 | Modelo de registro do 8086

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.

1.2.2 | Registo de Sinalização

É 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

D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0

DENTRO DENTRO DENTRO U OF DF IF TF SF ZF U AF U PF U CF

U = não utilizado

BANDEIRAS CONDICIONAIS BANDEIRAS DE CONTROLE

OF = Sinalizador de estouro DF = Sinalizador de direção

SF = Sinalizar Bandeira IF = Sinalização de interrupção

ZF = Sinalizador Zero TF = Bandeira de Armadilha

AF = Sinalizador de Transporte Auxiliar

PF = Sinalizador de Paridade

CF = Carregar Bandeira

Figura 1.3 | 8086 Registro de bandeira


Machine Translated by Google

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.

Sinalizador de estouro (OF) Este sinalizador é definido em uma das seguintes


condições i) há um estouro no MSB (8º ou 16º bit) do bit de menor significância, mas não há execução do
MSB,
ii) há um transporte do MSB, mas nenhum transporte para o MSB.
Este sinalizador indica que o resultado de uma operação de número com sinal é muito grande, fazendo com que o
bit de ordem superior transborde para o bit de sinal, alterando assim o bit de sinal.

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

O formato de uma instrução MOV é MOV destino, origem.


Nas duas instruções acima, um número 35H é movido primeiro para AL. Na próxima linha, 0CEH é adicionado
a AL. A soma será em AL, o registrador de destino.
35H 0011 0101 +
+ CEH 1100 1110
103H 1 0000 0011

Após o cálculo, AL conterá 0000 0011 e


CF = 1 uma vez que existe uma execução de D7.
SF = 0, pois o bit de sinal (MSB) do destino de 8 bits é 0.
AF = 1, pois há um transbordamento de D3 para D4.
Machine Translated by Google

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

Este é o caso da adição de 16 bits


45ECH 0100 0101 1110 1100
+ 7723H 0111 0111 0010 0011
BD0FH 1011 1101 0000 1111

A soma será em BX, que é o registrador de destino.


CF = 0, pois não há execução de D15.
ZF = 0, pois o destino não é zero.
OF = 1, pois há um transbordamento no MSB D15.

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

Ambos os operandos aqui são números decimais.


Este programa faz com que AL seja carregado com +125 e então +75 seja adicionado ao AL. O resultado é estar
em AL.
Os números com sinal consideram o MSB como o bit de sinal. Com 8 bits, o intervalo máximo de números com
sinal é de –128 a +127.
Ao adicionar os números assinados fornecidos,
+ 125 + 0111 1101
75 + 200 0100 1011
1100 1000

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.

1.3 | Unidade de Interface de Barramento

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.

1.3.1 | A fila de instruções


As instruções são encontradas na memória, de onde são buscadas e decodificadas conforme e quando precisam ser
executadas. No entanto, em 8086, há uma fila que busca instruções antes do tempo de execução e as coloca em uma fila
de 6 bytes de primeiro a entrar em primeiro a sair (FIFO). Esta pré-busca é feita quando os barramentos estão livres, ou
seja, não sendo utilizados para a execução da instrução corrente.
A vantagem da pré-busca é que, quando uma instrução específica deve ser executada, há uma boa chance de
encontrá-la na fila (que está no chip), em vez de ter que ir à memória para buscá-la. No entanto, a fila terá que ser
esvaziada no caso de uma instrução de desvio, ou seja, quando a próxima instrução a ser executada não for a próxima da
sequência. Depois disso, a fila precisa ser recarregada a partir do novo endereço de 'filial'. Essa pré-busca pertence a uma
classe de ideias chamada pipelining, o que significa que tanto a execução quanto a busca ocorrem ao mesmo tempo, ou
seja, enquanto a execução de uma instrução está em andamento, a busca de outra pode ser feita. O pipeline acelera muito
o processamento.

1.3.2 | Segmentação de memória


O 8086 possui um barramento de endereços de 20 bits, mas lembremos que não vimos nenhum registrador de 20 bits
até agora. É compreensível que os registradores de uso geral sejam usados como registradores de 16 ou 8 bits, pois é
assim que os dados são organizados. No entanto, vemos que todos os registradores de endereço também são de 16 bits.
Uma ideia ingênua chamada segmentação tem sido usada para cuidar dessa situação.
Um segmento é apenas uma área na memória. Assim, o tamanho total da memória pode ser considerado dividido em
segmentos de vários tamanhos. A idéia de dividir a memória dessa maneira é chamada de segmentação.
Na memória, os dados são armazenados como bytes. Cada byte tem um endereço específico. Com 20 linhas de
endereço, a memória que pode ser endereçada é de 220 bytes. Isso será de 1.048.576 bytes (1 Megabyte).
Assim, o 8086 pode acessar uma memória física com endereços que variam de 00000 a FFFFFH.
Um endereço físico de 20 bits deve ser colocado no barramento de endereços para acessar qualquer local na memória.
A memória como um todo é considerada como tendo quatro tipos diferentes de segmentos rotulados como dados,
código, pilha e extra. Uma ideia de segmentação é manter os dados e o código separadamente. Assim, o segmento de
código contém apenas código. Os dados são armazenados no segmento de dados e o segmento extra é apenas outro tipo
de segmento de dados usado de maneira especial. O segmento da pilha é uma área da memória que funciona e é acessada
de forma diferente dos outros três segmentos.

1.3.2.1 | Registros de segmento


Cada um desses segmentos é endereçado por um endereço armazenado em registradores de segmento correspondentes.
Esses registradores são todos de 16 bits. Cada registrador armazena o endereço base do correspondente
Machine Translated by Google

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,

22236H Byte endereçado




Endereço físico –
= 22220H +

0016H
DESLOCAMENTO = 0016H
22236H BYTE-2

BYTE-1

Endereço básico 22220H BYTE-0 2222H


Registro DS

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

Figura 1.5 | Registros de segmento e segmentos correspondentes


Machine Translated by Google

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.

1.3.2.2 | O segmento de código e o ponteiro de instrução


O segmento de código é a área da memória onde somente o código é armazenado. Os off sets dentro do
segmento de código são referenciados usando o Instruction Pointer (IP), que é um registrador de 16 bits. O
IP sequencia as instruções e sempre aponta para a próxima instrução a ser executada. Sempre que um byte
de instrução precisa ser buscado na memória, a unidade de interface de barramento (BIU) realiza o cálculo
do endereço usando o conteúdo do registrador CS e o IP. Este endereço de 20 bits é então colocado no
barramento de endereços e o byte de instrução é buscado. Assim, o endereço lógico para um bye de
instrução é da forma CS : IP.

1.3.2.3 | O segmento de pilha e o ponteiro de pilha


A pilha é uma área de memória que é usada de maneira especial. Os dados geralmente são inseridos e
retirados da pilha. A pilha do 8086 é uma pilha LIFO (last-in-first-out), o que significa que os últimos dados
que foram inseridos são os primeiros que podem ser retirados. Isso também significa que os dados só
podem ser retirados ou inseridos apenas do topo da pilha. No entanto, o 'topo da pilha' muda à medida que
os dados são inseridos ou retirados.
Existe um registrador de 16 bits chamado Stack Pointer que aponta para o topo da pilha. O segmento
de pilha é como qualquer outro segmento, e os 16 bits superiores de seu endereço base estão disponíveis no

Endereço do
Byte
topo da pilha 44782H
0122H SP

Byte

Byte

Endereço Base 44660H – 4466H SS

Figura 1.6 | Pilha e endereço físico do topo da pilha


Machine Translated by Google

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.

1.3.2.4 | O Segmento de Dados e o Segmento Extra Ambos os

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

DS contém o número 345BH.

Este número corresponde aos 4 dígitos hexadecimais superiores do início (endereço base) do segmento de dados.

O endereço base do segmento é 345B0H.


O último endereço terá um deslocamento de 12K do endereço base.

1K = 1024 bytes.
12K = 12 × 1024 = 12288 = 3000H.

O último endereço do segmento = 345B0H + 3000H = 375B0H.


Portanto, o segmento de dados ocupa os endereços de memória de 345B0H a 375B0H.

Tabela 1.1 | Segmentos e Registros Correspondentes Usados para Especificar Offsets

Segmento Registros fora do set Função

CS IP Endereço da próxima instrução

DS BX, DI, SI Endereço de dados

SS SP, BP Endereços na pilha

ISSO É BX, DI, SI Endereço dos dados de destino

(para instruções de string)


Machine Translated by Google

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.

Segmentação: Preocupações Gerais


1. Os segmentos começam nos limites do parágrafo, onde um parágrafo tem 16 bytes. ou seja, os endereços de base
são divisíveis por 16 (porque o menor nibble de todos os endereços de base deve ser zero).

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.

4. Um segmento pode ter um tamanho máximo de 64 K.

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.

Vantagens da Segmentação 1. Permite

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

Figura 1.7 | Formato Little Endian

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.

1.4 | Modos de endereçamento


Para cálculos em linguagem assembly, precisamos de um opcode e operandos. Opcode significa código
de operação – ou seja, o código que especifica a operação a ser executada. Opcodes operam em dados,
que são então chamados de operandos. No 8086, uma instrução pode ter um ou dois operandos (não
mais). Por exemplo, uma operação de adição precisa de dois operandos, enquanto uma operação de
deslocamento opera em um único operando. A maneira pela qual os operandos são especificados em uma
instrução em linguagem assembly é chamada de modo de endereçamento. Vamos tentar entender
claramente os diferentes modos de endereçamento permitidos para este processador. Usaremos a instrução
MOV para entender esses modos. Isso tem o formato
Destino MOV, origem que
faz com que os dados de origem sejam copiados para o destino.

As premissas básicas neste contexto sã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

MOV SI, BX ;copia o conteúdo de BX para SI


MOVE ES, AX ;copia o conteúdo de AX para ES

Observe que as duas primeiras são operações de byte , enquanto as outras duas são operações de palavra.

MOV AX, BL ;dá erro pois AX é 16 bits e BL é 8 bits


MOV BL, AX ;dá um erro pelos mesmos motivos

2) Endereçamento Imediato
Neste modo, a fonte será uma constante de dados

MOV AL, 45H ;copia 45H para AL


MOV BX, 34E3H ;move o número hexadecimal 34E3H para BX
MOV CL, 'Q' ;move o valor ASCII de Q para CL
PREÇO DO MOVIMENTO, 40 ;move o número hexadecimal 40 para o local de
memória com a etiqueta PREÇO
NÚMEROS MOV, 0FC6H ;move o número hexadecimal 0FC6H para o local de
memória NUMS

Os registradores de segmento não podem usar este modo de endereçamento.


MOV DS, 2300H ;dá um erro porque DS é um registrador de segmento

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.

EIXO DE MOVIMENTO, PREÇO

CUSTO MOVIMENTO, AL

Devemos, então, garantir que os referidos endereços tenham sido definidos anteriormente com esses rótulos. Veremos

esse aspecto mais adiante.

4) Registrar Endereçamento Indireto


Neste modo, o endereço dos dados é mantido em um registrador. O registrador atua como um ponteiro para os dados.
Os registradores devem ser colocados entre colchetes para indicar que funcionam como ponteiros. Também usamos
o termo endereço efetivo para o endereço do operando. Para este modo de endereçamento, os registradores de
endereço permitidos são BX, SI e DI.
EA = {[BX] / [DI] / [SI]}
MOV AL, [BX] ;mover para AL o conteúdo da localidade cujo endereço
está em BX
MOV [SI], CL ;move o conteúdo do CL para o endereço indicado pelo
SI
Machine Translated by Google

A ARQUITETURA DE 8086 65

MOV [DI], AX ;move o conteúdo de AX para o endereço indicado


por DI
Na terceira instrução, AX contém dois bytes. Assim, o conteúdo da AL será movido para o endereço
indicado pela DI. O conteúdo de AH será movido para o endereço [DI + 1].

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

iii) MOV [BX], AX

Solução

i) Este é um caso de endereçamento direto. O destino é um local de memória, que é especificado


diretamente na instrução. AL contém 78H
DS = 1112H
O endereço base do segmento de dados é 11120H
O off set na instrução é 0422H
O endereço físico é 11120H +
0422H
11542H

Após a execução da instrução, o conteúdo da localização endereçada é como mostrado

CONTEÚDO DO ENDEREÇO FÍSICO

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')

CONTEÚDO DO ENDEREÇO FÍSICO

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

CONTEÚDO DO ENDEREÇO FÍSICO

14520H 78H

14521H EEH

5) Registrar Endereçamento Relativo


No modo de endereçamento relativo , um número ou deslocamento faz parte do endereço efetivo.
EA = {[BX]/[DI]/[SI]/[BP]} + deslocamento de 8 bits ou 16 bits MOV
CL, 10[BX] ;move o conteúdo do endereço especificado
o conteúdo adicionando
de BX e 10.

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]

MOV CL, [BX] + 10 ou


MOV CL, [BX][10] ou
MOV CL, PREÇO [BX]

No último caso, PREÇO deve ser definido anteriormente como um deslocamento de 10.

6) Modo Indexado Baseado

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

O endereço efetivo é obtido somando-se o conteúdo de BX e SI. Como o registrador de destino é um


registrador de 8 bits, esta é uma operação de byte. O seguinte é uma operação de palavra , pois o
registrador de origem CX é de 16 bits.
MOV [BX] [DI], CX ;move o conteúdo de CX para o endereço efetivo
apontado por [BX] e [SI]

7) Modo Indexado Baseado em Relativo


Este é o caso quando o 'endereço efetivo' é especificado com um registrador de base, um registrador de
índice e um deslocamento. O 'endereço efetivo' é a soma dos dois registros e o deslocamento. Por exemplo,
o seguinte usa o modo de endereçamento indexado baseado em relativo
MOV DL, 5 [BX] [DI] ;EA = 5 + BX + DI
MOV 5 [BP] [SI], AX ; EA = 5 + PA + SI
MOV CL, CUSTO [BX] [SI] ;EA = CUSTO + BX + SI
;COST deve ser definido como um deslocamento
anterior
Machine Translated by Google

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

i) MOV CL, 1234H[SI]


ii) MOV AL, 5 [SI] [BP]

Solução

i) MOV CL, 1234H[SI]

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

O endereço base do segmento é obtido do DS para ser 40220H


O endereço físico é a soma do endereço base do segmento e o endereço efetivo. ou seja,
40220H +
5676H
45896H

ii) MOV AL, 5 [SI] [BP]


Este é um caso de modo indexado com base relativa. O endereço efetivo é calculado como a soma do
deslocamento e o conteúdo dos registradores SI e BP.
Endereço efetivo = 0005H +
4442H
1402H
5849H

O endereço físico é a soma do endereço base do segmento e o endereço efetivo. Dentro


neste caso, como BP é um dos registradores de endereço, o segmento referido é o segmento da pilha.
O endereço físico é 23440H (endereço base do segmento de pilha)
+5849H
28C89H

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

Sim. Não. Modo de endereçamento Endereço efetivo Segmento

1 Direto Deslocamento DS

2 Registro indireto [BX] DS

[E] DS

[A PARTIR DE]
DS

3 Registrar parente Exibição + [BX] DS

Exibição + [SIM] DS

Exibição + [DI] DS

Exibição + [BP] SS

6 Indexado com base [BX] + [SI] DS

[BX] + [DI] DS

[PA] + [SIM] SS

[BP] + [DI] SS

7 Indexado com base relativa Exibição + [BX] [SIM] DS

Exibição + [BX] [DI] DS

Disp + [BP] [SIM] SS

Disp + [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.

PONTOS-CHAVE DESTE CAPÍTULO

| A arquitetura do 8086 é representativa da arquitetura de todos os membros da família x86.

| 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.

| A unidade de execução cuida dos cálculos e, portanto, contém os registros necessários


e bandeiras.

| 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.

| A memória é segmentada em quatro tipos de segmentos.

| Código e dados são mantidos em segmentos separados.

| 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 BIU converte os endereços lógicos em endereços físicos.

| A segmentação faz com que os dados e o código sejam realocáveis.


Machine Translated by Google

A ARQUITETURA DE 8086 69

| O modo de endereçamento determina onde os operandos estão disponíveis.

| 8086 segue o esquema 'little endian' de armazenamento de dados na memória.

PERGUNTAS

1. Nomeie os registradores de 8 bits de 8086.

2. O que significa dizer que o 8086 é um processador de 16 bits?

3. Quais são os primeiros e últimos endereços de memória que um 8086 pode endereçar?

4. Qual unidade (EU ou BIU) é responsável por realizar cálculos aritméticos?

5. Como será útil para um processador se ele tiver um grande número de registradores internos?

6. Quais são os pontos negativos da presença de muitos registros de rascunho?

7. Quais são os registradores que atendem às instruções de string?

8. O que significa uma pilha LIFO?

9. Qual é a diferença de operação entre a bandeira de transporte e a bandeira de transbordamento?

10. Qual registrador é frequentemente usado como contador?

11. Onde na memória está localizado o código do programa?

12. BP é um registro que se refere ao segmento extra. Verdadeiro ou falso?

13. O BP não pode ser usado sem deslocamento. Verdadeiro ou falso?

14. O que significa o termo 'relocação de programa'?

15. O que acontece com a fila de pré-busca quando uma instrução de desvio é encontrada?

16. Qual é o formato de um endereço lógico?

17. Se o endereço físico de um byte for 12345H, sugira três endereços lógicos que ele possa ter.

18. Qual é o segmento padrão quando o IP é usado?

19. Podemos ter segmentos de tamanho inferior a 64K?

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.

a) MOV AL, 09H


ADICIONAR AL, CFH

b) MOV BX, 0876H


MOV AX, 0034H
ADICIONAR BX, AX

c) MOV AL, 0FFH


ADICIONAR AL, 01

2. Adicione os números 100 e 89 usando as instruções a seguir.


MOV AL, 100
ADD AL, 89
Quais das bandeiras condicionais estão definidas e por quê?
Machine Translated by Google

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

4. Encontre o endereço físico do topo da pilha se SS = 0777H e SP = 1234H.

5. Se o IP contém o número 0034H e CS = 5555H, onde a próxima instrução será buscada


a partir de?

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?

7. Escreva o modo de endereçamento das instruções a seguir. a) MOV


[4560H], AX
b) ADICIONAR BL, 89H
c) ADICIONAR BX, [DI]
d) MOV 6 [BP] [DI], AL
e) MOV CX, [BP + 9]
f) ADICIONAR CL, BL

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

9. Quais segmentos serão acessados nos seguintes casos?


a) MOV [6][BX], CX
b) MOV [BP] + 4, CL
c) EMPURRAR EIXO

d) MOV CS: [BX], DL


e) MOV AL, ES: [45H]

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

Neste capítulo, você aprenderá


| O princípio de funcionamento de um montador. | Para escrever programas usando o segmento completo
| Os vários montadores disponíveis para x86. definição.

| Os recursos e uso de um montador popular. | Compreender as técnicas de design de instruções para


8086.
| Para escrever programas usando modelos de memória
simplificados.

Programação em linguagem assembly


No Capítulo 0, vimos por que a linguagem assembly é muito importante. Para codificar com eficiência em linguagem
assembly para um processador específico, os pré-requisitos são um bom conhecimento da arquitetura interna do
processador e dos modos de endereçamento, o que significa que é absolutamente necessário entender o conteúdo
do Capítulo 1.
Quando queremos escrever e executar um ALP, primeiro o digitamos usando um editor. Em seguida,
montamos, vinculamos e executamos. Existem muitas ferramentas de desenvolvimento de programas em linguagem
assembly disponíveis para cada uma dessas ações. Vamos examiná-los um por um.

2.1 | O processo de montagem


A maneira como um montador é projetado depende muito da organização interna do processador para o qual ele é
usado. Recursos arquitetônicos como tamanho da palavra de memória, formatos de número, códigos de caracteres
internos, registradores de índice e registradores de uso geral afetam a maneira como os montadores são escritos
e o modo como um montador lida com instruções e diretivas.
Na programação em linguagem assembly, a codificação é feita em linguagem simbólica (chamada mne
monics). A palavra mnemônico vem de uma palavra grega que significa pertencente à memória; é um auxiliar de
memória. O mnemônico especifica a operação a ser feita. Precisamos de um montador que traduza essa linguagem
simbólica em código de máquina que o processador entenda. Como tal, supomos que esta 'tradução' é de fato a
principal tarefa do montador.
Vamos primeiro ter uma ideia do processo de montagem. Uma definição interessante para um montador é
que ele é um tradutor que traduz instruções de origem (em linguagem simbólica) em instruções de destino (em
linguagem de máquina), na base de um para um . O ponto é que cada instrução de origem é traduzida para
exatamente uma instrução de destino. Esta é, de fato, a principal tarefa do

Imagem de abertura do capítulo: Um chip ADC.


Machine Translated by Google

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.

2.1.1 | Características dos Montadores


Quando o código é escrito em linguagem assembly, é fácil usar rótulos (nomes) para locais de memória. Todas
as constantes e variáveis recebem nomes para que possam ser referenciadas pelo nome.
Gerenciar e utilizar esses rótulos (chamados de símbolos) reflete de forma eficiente na qualidade de um montador.

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.

2.1.2 | Instruções e Diretrizes


Um programa em linguagem assembly contém pseudo-instruções (diretivas) junto com instruções. As instruções
são traduzidas para códigos de máquina, mas as diretivas não. isto é, as instruções produzem código executável,
mas as diretivas não. Eles direcionam o montador para executar de certas maneiras que nós gostaríamos. As
diretivas funcionam como 'ajuda' para o montador decidir alguns outros aspectos do processo de montagem.
Assim, o montador pega nosso código-fonte (que é nosso programa contendo instruções e diretivas) e o
converte em código objeto que contém o código de máquina. O arquivo objeto é aquele que será carregado na
memória e executado após vinculá-lo com outros arquivos necessários.

2.1.3 | O problema de referência direta


Uma linha típica em um programa pode ser

COMEÇAR: MOVIMENTAR EIXO, CUSTO ;move o conteúdo do local COST para AX

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

Veja o código abaixo

COMEÇAR: MOV AX, BX


JMP NOVAMENTE
---------------
---------------
-
-
-

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.

2.1.4 | Montadores de duas passagens

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.

2.2 | Montadores para x86


A linguagem assembly é específica para um processador em particular. Como tal, devemos nos preocupar
com os montadores para a família de processadores x86, que inclui todo o conjunto de 8086 a Pentium. Um
grande conjunto de montadores está disponível, mas o código executado em um montador não será executado
em outro. Outra questão a ser cuidada é o sistema operacional sob o qual ele pode ser executado. A A86 foi
a primeira montadora a entrar em cena. Ele poderia ser executado apenas em DOS. Agora existem montadores
que rodam em DOS, Windows e Linux. Os nomes de alguns montadores populares são NASM, FASM, MASM,
TASM e HLA. O FASM e o NASM podem ser executados em todos os três sistemas operacionais mencionados.
Machine Translated by Google

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.

2.2.1 _ Por que MASM?


Para os programas deste livro, escolheremos o MASM por ser um dos melhores montadores e também por sua
popularidade. Um montador popular nos dá a chance de ter acesso fácil a referências e materiais. Além disso, o
MASM possui muitas construções e recursos que tornam o ALP fácil e divertido para iniciantes. Outra razão é que a
documentação disponível para isso é muito boa.
O MASM foi um produto comercial por muito tempo e é uma espécie de padrão da indústria.
A Microsoft escreveu uma documentação considerável para este montador e muitos terceiros escreveram manuais de
referência de linguagem assembly para o MASM. As versões do MASM 6.0 e superiores têm muito mais recursos
(visando a simplificação na escrita de código) do que as versões anteriores.
versões.

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.

2.2.2 | Programação em linguagem assembly


Agora que entendemos o processo de montagem e decidimos o montador a ser usado, vamos entrar no âmago da
programação. As etapas envolvidas são:

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.

2.3 | Modelos de memória


Para escrever programas, sabemos que temos que definir segmentos, o que significa que os registradores de
segmento devem ser inicializados. Isso nos levará ao modelo convencional de segmento completo. No entanto,
as versões do MASM 6.0 e superiores incorporaram certos atalhos que ajudam a simplificar a programação. Estes
são chamados de modelos de pontos. Eles têm o formato:
.NOME DO MODELO DO MODELO

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 .

2.3.1 | O Modelo Minúsculo


Vamos agora escrever um programa usando o modelo minúsculo.

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

MOV AL, 67H MOV ;mover 67H para AL


BL, 45H ADD AL, ;mover 45H para BL
BL MOV DL, ;adiciona BL a AL
AL .EXIT ;copia AL para DL
;sair para DOS
FIM ;fim 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

Linker executável segmentado da Microsoft (R) Versão 5.60.339 5 de dezembro de 1994


Direitos autorais (C) Microsoft Corp 1984–1993. Todos os direitos reservados.

Módulos de objetos [.obj]: tinym.obj /t


Executar arquivo [tinym.com]: “tinym.com”
Listar arquivo [nul.map]: NUL
Bibliotecas [.lib]:
Arquivo de definições [nul.def ]:

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

0100 B0 67 MOV AL, 67H ;mover 67H para AL


0102 B3 45 MOV BL, 45H ;mover 45H para BL
0104 02 C3 ADICIONAR AL, BL ;adiciona BL a AL
0106 8A D0 MOV DL, AL ;copia AL para DL

.SAÍDA ;sair para DOS


FIM ;assembler para parar de ler

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:

0100 B0 67 MOV AL, 67H ;mover 67H para AL

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

0100 B0 67 MOV AL, 67H ;mover 67H para AL


0102 B3 45 MOV BL, 45H ;mover 45H para BL
0104 02 C3 ADICIONAR AL, BL ;adiciona BL a AL
0106 8A D0 MOV DL, AL ;copia AL para DL

.SAÍDA ;voltar ao DOS


0108 B4 4C * mov ah, 04Ch
010A CD 21 * int 021h
FIM

.Listall listou as instruções correspondentes a .EXIT


.EXIT é um atalho que na verdade é transformado em duas instruções:

MOV AH, 4CH


INT 21H

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

13BD: 0100 B067 MOV AL, 67


13BD:0102B345 MOV BL, 45
13BD:0104 02C3 ADICIONAR AL, BL
13BD:0106 8AD0 MOV DL, AL
Machine Translated by Google

78 OS MICROPROCESSADORES x86

13BD:0108 B44C MOV AH, 4C


13BD:010A CD21 INT 21

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.

2.3.2 | Arquivos COM e EXE


Para este programa, existe apenas um segmento, que é o segmento de código. O arquivo de execução
gerado para o modelo tiny é um arquivo de comando (.com), em vez de um arquivo executável (.exe). Isso
pode ser visto no Exemplo 2.2. na linha:
Executar arquivo [tinym.com]: “tinym.com”
Mais tarde, veremos que os arquivos de execução serão obtidos como 'executáveis' com .exe como extensão.
No entanto, o modelo minúsculo sempre se monta para ser um arquivo com. Este é um caso especial, quando precisamos
de uma forma compactada de dados e código, todos cabendo em apenas 64 K de tamanho para eficiência de memória.
Outros modelos que veremos mais adiante são todos montados em arquivos .exe. Quantificando os recursos dos arquivos COM:

i) O tamanho é limitado a 64 K.

ii) Apenas um segmento, que é o segmento de código.


iii) Os dados são definidos neste segmento de código.

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

0100 8B C8 MOV CX, AX ;copia o conteúdo de AX para CX


0102 8B C2 MOV AX, DX ;copia o conteúdo do DX para o AX
0104 8A C3 MOV AL, BL ;copia o conteúdo de BL para AL
0106 8A E1 MOV AH, CL ;copia o conteúdo de CL para AH
0108 8A F2 MOV DH, DL ;copia o conteúdo de DL para DH
010A 8E DA MOV DS, DX ;copia o conteúdo do DX para o DS
010C 8E D3 MOV SS, BX ;copia o conteúdo de BX para SS

.SAÍDA ;sair para DOS


FIM ;fim 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.

2.3.3 | Definição de Tipos de Dados


Antes de usarmos um modelo de memória de dois segmentos, precisamos entender algumas diretrizes do
montador que definem e descrevem diferentes tipos de dados. Os dados que são usados em um programa
podem ser bytes ou palavras ou de maior comprimento. Temos que definir os dados e atribuir rótulos aos
endereços correspondentes. A atribuição de rótulos facilita o trabalho do programador, pois ele não precisa se
preocupar com valores numéricos. O contador de localização no montador continua aumentando à medida que
os rótulos são encontrados.
Definir dados implica alocar espaço para dados. Os dados são definidos de acordo com as diretivas.
Assim, DB define byte de dados, enquanto DW define palavra de dados. Esta é a maneira tradicional de definir
dados. As versões mais recentes do MASM (6.0 e superiores) permitem o uso da diretiva BYTE para DB e
WORD para DW. A Tabela 2.1 mostra as definições de dados de diferentes comprimentos.

Tabela 2.1 | Definições de dados usadas pelo MASM

Definição Diretiva tradicional Nova diretiva

Byte BD BYTE
Palavra DW PALAVRA

Palavra dupla DD DWORD

Palavra quádrupla DQ QWORD

Dez bytes TD TBYTE


Machine Translated by Google

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

0100 A0 0000 R MOV AL, NUM1 ;mover NUM1 para AL


0103 8B 1E 0001 R MOV BX, NUM2 ;mover NUM2 para BX
0107 8B C8 MOV CX, AX ;copia AX para CX
0109 8B 1E 0003 R MOV BX, NUM3 ;mover NUM3 para BX
.SAÍDA

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.

2.3.4 | O Modelo Pequeno


Agora estamos em condições de escrever um programa usando o modelo pequeno, que tem um segmento de
dados e um segmento de código. O Exemplo 2.9 mostra o mesmo programa do Exemplo 2.8, exceto que um
segmento de dados separado é usado para armazenar os dados.

Exemplo 2.9a
.MODELO PEQUENO ;escolha o modelo pequeno
0000 .DADOS ;inicia o segmento de dados

0000 50 NUM1 DB 50H


0001 210A 0003 NUM2 DW 210AH
0789 NUM3 DW 0789H

0000 .CÓDIGO ;iniciar segmento de código


.COMECE ;início do programa

0017 A0 0000 R MOV AL, NUM1


001A 8B 1E 0001R MOV BX, NUM2
001E 8B C8 MOV CX, AX
0020 8B 1E 0003 R MOV BX, NUM3
.SAÍDA

FIM
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO – I 81

Os pontos salientes desta listagem de programas são:

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 50 NUM1 DB 50H


0001 210A NUM2 DW 210AH
0003 0789 NUM3 DW 0789H
.LISTAR
0000 .CÓDIGO ;iniciar segmento de código
.COMECE ;início do programa

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

0017 A0 0000 R MOV AL, NUM1


001A 8B 1E 0001R MOV BX, NUM2
001E 8B C8 MOV CX, AX
0020 8B 1E 0003 R MOV BX, NUM3

.SAÍDA
0024 B4 4C * arroz ah, 04Ch
0026 CD 21 * int 021h
FIM
Machine Translated by Google

82 OS MICROPROCESSADORES x86

ETIQUETAS DESLOCAMENTO DADOS(H)


NUM3+1 0004 07
NUM3 0003 89
NUM2+1 0002 21
NUM2 0001 0A
NÚMERO 1 0000 50

Figura 2.1 | Segmento de dados com rótulos e off-sets correspondentes ao Exemplo 2.9

2.3.5 | A Diretiva DUP


Esta diretiva é usada para replicar um determinado número de caracteres. Por exemplo, podemos querer
preencher vários locais no segmento de dados com a mesma palavra ou byte.
NUMS DB 10 DUP(0) preenche com 0s os locais de 10 bytes começando com o rótulo
NÚMEROS.

STARS DB 5 DUP('#') preenche locais de 5 bytes começando no local STARS, com o


Valor ASCII do caractere #.
BLANK DB 10 DUP(?) reserva espaços de 10 bytes a partir da localização com o rótulo BLANK, mas
estes não são inicializados, o que implica que quaisquer dados que existam permanecerão. Podemos
substituir esses locais por novos dados quando quisermos. WRDS DW 4 DUP(FF0FH) preenche 4
localizações de palavras com a palavra FF0FH.

2.3.6 | A Diretiva EQU


Esta diretiva nos permite igualar nomes a constantes. O montador apenas substitui os nomes pelos valores
mencionados. Exemplos são:

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

= 0025 FACTR EQU 25H

0017 A0 0000 R MOV AL, UM ;copia ONE para AL


001A 04 25 ADD AL, FACTR ;adicionar FACTR a AL
001C A2 0001R MOV DOIS, AL .EXIT ;move a soma para DOIS

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

2.3.7 | A Diretiva ORG


ORG é uma diretiva que significa 'origem'. No contexto de programação em linguagem assembly, pode-
se alterar a localização de armazenamento de dados ou código na memória, ou seja, o programador tem
a liberdade de decidir o conjunto de dados/código quando armazenado. O formato é ORG d16, onde d16
significa um deslocamento de 16 bits. Vamos experimentar o uso desta diretiva.

Exemplo 2.11a
.MODELO PEQUENO
.DADOS

ORG 0010H ;origem em 0010H


NUMS DB 20H, 40H
ORG 0030H ;origem será em 0030H
NUMS1 DW 8907H, 0FDH
.CÓDIGO
.COMECE
ORG 000AH ;org é uma diretiva
MOV AL, NÚMEROS ;esta é uma instrução
MOV BL, NUMS+1 ;esta é uma instrução
ORG 0020H ;org é uma diretiva
MOV DX,NUMS1 ;esta é uma instrução

.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

000A A0 0010R MOV AL,NUMS


000D 8A 1E 0011R MOV BL,NUMS+1
ORG 0020H
0020 8B 16 0030 R MOV DX,NUMS1

.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.

2.3.8 | Outros modelos

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.

2.3.9 | Definição completa do segmento

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

BACALHAU SEGMENTO ;inicia o segmento de código


PRESUMIR CS:CODE.DS:DATE
MOV AX, DAT ;mover DAT para AX
MOV DS, AX ;copia AX para DS
MOV AL, NUM1
MOV BX, NUM2
MOV CX, AX
MOV BX, NUM3
MOV AH, 4CH
INT 21H
BACALHAU FIM ;termina o segmento de código
FIM ;fim do programa

As principais características deste modelo são:

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

Tabela 2.2 | Os diferentes modelos de memória usados pelo MASM


Sim. Não Nome Quantos segmentos Quantos segmentos
de código? de dados?

1 Minúsculo
1 Nada

2 Pequena 1, tamanho máximo 64K 1, tamanho máximo 64K

3 Médio Qualquer número, qualquer tamanho 1, tamanho máximo 64K

4 Compactar 1, tamanho máximo 64K Qualquer número, qualquer tamanho

5 Grande Qualquer número, qualquer tamanho Qualquer número, qualquer tamanho

6 Enorme Qualquer número, qualquer tamanho Qualquer número, qualquer tamanho

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:

MOV AX, @DATA


MOV DS, AX

onde DATA é usado no início do segmento de dados.

2.3.10 | Regras gerais para escrever linguagem assembly


Agora, vamos resumir o formato geral de uma linha de linguagem assembly, com um exemplo.

Exemplo 2.13
ETIQUETA CÓDIGO DE OPERAÇÃO OPERANDO COMENTE

NÚMERO 1 BD 56H ;defina NUM1 como um byte de 56H


NUM2 DW 0557AH ;defina NUM2 como uma palavra de 0557H

COMEÇAR: MOV BL, NUM1 ;copia NUM1 em BL


MOV AL, BL ;copia BL para AL
Machine Translated by Google

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.

i) Todos os rótulos devem começar com uma letra ou os caracteres especiais @, $, _ e ?

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 (?) .

iii) Nenhuma palavra reservada do MASM pode ser usada.

iv) Cada rótulo deve ser único.

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.

2.4 | Projeto de Instrução


Até agora, estávamos discutindo montadores, os melhores montadores disponíveis e como executar nossos
programas usando montadores e outras ferramentas de desenvolvimento de programas. Agora, vamos nos
aprofundar um pouco mais no núcleo do processador e investigar o processo de como os códigos de máquina foram projetado
Ao fazer isso, vamos perceber porque o processo de montagem é um processo 'um para um'.

2.4.1 | Codificação Manual


Outra ideia a se pensar é a possibilidade de fazer codificação manual ou manual, como é chamada – pegar uma
instrução de montagem, procurar ou descobrir seu código de máquina e alimentá-lo diretamente ao processador.
Por que não? Parece bastante viável, não é? Na verdade é, mas logo fica óbvio que é muito complicado pensar em
programação como algo divertido.
Durante o tempo em que o 8085 era um processador popular, a codificação manual era a regra e não a
exceção. Isso ocorreu porque o 8085 tinha um conjunto de instruções limitado e uma tabela de consulta era
suficiente para a codificação manual. O cenário mudou com o 8086, que tem mais registradores e mais instruções
– mas o fato mais notável é que ele tem muito, muito mais modos de endereçamento – o que implica que cada
instrução pode ser expressa em muitos modos para facilitar o uso de uma tabela de consulta. Com o mais avançado
dos processadores x86 entrando em cena, a dificuldade multiplicou-se muitas vezes. Como tal, concluiremos que
usar um montador padrão e bom é a melhor solução.

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.

2.4.2 | Arquitetura do conjunto de instruções (ISA)


A declaração a seguir dá uma definição quase apropriada do que se entende por ISA. Um conjunto de instruções,
ou arquitetura de conjunto de instruções (ISA), é definido como a parte da arquitetura de computadores relacionada
à programação, incluindo os tipos de dados nativos, instruções, registradores, modos de endereçamento, arquitetura
de memória, tratamento de interrupções e exceções e recursos externos. E/S. Um ISA inclui uma especificação do
conjunto de opcodes (linguagem de máquina), ou seja, os comandos nativos implementados por um determinado
projeto de CPU.
Deve-se notar que processadores com os mesmos ISAs não precisam ter os mesmos designs internos
(microarquiteturas) – eles só precisam compartilhar um conjunto de instruções comum. É por isso que nós
Machine Translated by Google

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.

2.4.3 | Design do Conjunto de Instruções de 8086

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:

i) Opcode correspondente à operação a ser realizada.

ii) Tamanho dos operandos.

iii) Modo de endereçamento de cada operando mencionando um ou mais dos seguintes:

a) Registro de uso geral.


b) Valor de um operando imediato.
c) Endereço do operando.
d) Cadastro básico.
e) Registo de índice.
f ) Combinação de um registro base e índice.
g) Deslocamento em combinação com registradores base/índice/[base + índice].

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

(6 bits) (1 bits) (1 bits)

iii)

CONTRA REG R/M


(2 bits) (3 bits) (3 bits)

Figura 2.2 | Formato de três bytes de uma instrução


Machine Translated by Google

88 OS MICROPROCESSADORES x86

W (1 bit) – tamanho do operando. W = 1, significa operando palavra; W = 0, significa operando byte.


D (1 bit) – Bit de direção. D = 1, significa que o registrador é o destino; D = 0, significa que o registrador é a fonte.

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.

2.4.4 | Projetando um código


O projeto de um código requer mais informações do que as apresentadas até agora. Precisamos dos códigos de identificação
dos registros, obviamente. Cada registrador de 16 bits e 8 bits possui um código único.
Esses códigos são fornecidos nas Tabelas 2.3 e 2.4. Além disso, também é fornecida uma tabela mostrando os bits MOD e
R/M correspondentes a várias combinações de modos de endereçamento. Usando isso, o design de código será bastante
simples. Também precisamos do manual da Intel para os opcodes e formatos de instruções. Isso é dado no Apêndice A.

Tabela 2.3 | Códigos de Registros de Uso Geral


REG W=0 W=1

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

Tabela 2.4 | Códigos de Registros de Segmento

Regs de segmento Código

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

000 (BX) + (SI) (BX) + (SI) + d8 (BX) + (SI) + d16 AL MACHADO

001 (BX) + (DI) (BX) + (DI) + d8 (BX) + (DI) + d16 CL CX

010 (PA) + (SI) (BP) + (SI) + d8 (BP) + (SI) + d16 DL DX

011 (PA) + (DI) (BP) + (DI) + d8 (BP) + (DI) + d16 BL BX

100 (E) (SIM) + d8 (SI) + d16 AH SP

101 (DI) (DI) + d8 (AT) + d16 CH BP

110 d16 (endereço (BP) + d8 (BP) + d16 DH ELA


direto)

111 (BX) (BX) + d8 (BX) + d16 BH A PARTIR DE

MODO DE MEMÓRIA MODO DE REGISTRO


Observe que d8 e d16 são deslocamentos de 8 bits e 16 bits, respectivamente.

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 é

CONTRA REG R/M


11000011

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

ii) ADICIONAR BL, CL

CÓDIGO DE OPERAÇÃO DW
00000010

Byte1

CONTRA REG R/M


11011001

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.

iii) MOV CX, 0213H

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:

1011 W Reg dados dados se W=1

Figura 2.3 | Formato de uma instrução MOV no modo imediato

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.

iv) MOV DX, [23CDH]

CÓDIGO DE OPERAÇÃO DW
10001011

Byte 1

CONTRA REG R/M


00010110

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

dentro) BX], DH MOV [

CÓDIGO DE OPERAÇÃO DW
10001000

Byte 1

CONTRA REG R/M


00110111

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.

vi) MOV AL, [SI] [BX]

CÓDIGO DE OPERAÇÃO DW
10001010

Byte 1

CONTRA REG R/M


00000000

Byte 2

Seguindo o mesmo procedimento discutido nas instruções anteriores, o código para isso é 8A 00 H.

vii) ADICIONAR AX, 53H [SI][BX]

CÓDIGO DE OPERAÇÃO DW
00000011

Byte 1

CONTRA REG R/M


01000000

Byte 2

O terceiro byte da instrução é 53H, sendo o deslocamento de 8 bits dado na instrução.


Assim, o código é 03 40 53 H.
Machine Translated by Google

92 OS MICROPROCESSADORES x86

Prefi x de substituição de segmento

viii) MOV CS: [BX], DH


O prefixo de substituição de segmento é um byte com o formato 001XX110. No lugar de XX, deve ser
inserido o código do registro de segmento que substitui o segmento padrão. Para a instrução acima, o
byte de prefixo é 00101110, usando o código de CS que é 01 (Tabela 2.4). Já codificamos a instrução
MOV [BX], DH. Anexando o prefixo a ele, o código de três bytes agora é
2E 88 37 H
Agora, para confirmar se a 'codificação manual' que fizemos está correta, vamos colocar tudo em
um programa e examinar o arquivo de lista. O exemplo 2.14a é o programa e 2.14b é o arquivo
desmontado do depurador, que contém o código assembly e o código de máquina. Ao verificar,
descobrimos que nossa codificação manual de fato concorda com a codificação do montador.

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

0B56:001B B91302 MOV CX, 0213


0B56:001E 8B16CD23 MOV DX, [23CD]
0B56:0022 8837 MOV [BX], DH
0B56:0024 8A00 MOV AL, [BX + SI]
0B56:0026 034053 ADICIONAR AX, [BX + SI + 53]
0B56:0029 2E CS:
0B56:002A 8837 MOV [BX], DH

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.

Observe como o endereço da próxima instrução depende do tamanho (número de bytes) do


instrução atual.

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.

PONTOS-CHAVE DESTE CAPÍTULO

| Um montador é um software que traduz linguagem assembly em código de máquina em um


uma base.

| Os montadores convertem rótulos em endereços de memória.

| Um programa em linguagem assembly contém instruções e diretivas – o primeiro produz


código executável, mas o último apenas fornece instruções para o montador.

| 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.

| MASM 6.14 e MASM 32 são usados neste livro.

| 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ê.

2. Liste as etapas envolvidas na conversão do código-fonte em código executável, usando um montador e


outras ferramentas de desenvolvimento de programas.

3. Quais são as funções do vinculador e do carregador na geração do arquivo de execução?


Machine Translated by Google

94 OS MICROPROCESSADORES x86

4. Como um arquivo com é diferente de um arquivo exe?

5. 'O código montado é relocalizável'. Qual é a implicação desta afirmação?

6. Por que um programa .com tem origem às 0100H?

7. O MASM é um montador de alto nível (HLA)? Comente.

8. Como um depurador ajuda no processo de programação?

9. O que exatamente a instrução .EXIT faz?

10. Liste as regras sobre rótulos que podem ser usados no MASM.

EXERCÍCIO

1. Usando o modelo minúsculo, escreva um programa que faça o seguinte.


a) Move 1020H para AX, 056H para BL e C76H para CX.
b) Copia o conteúdo de AX para DS, o conteúdo de BH para AH e o conteúdo de CX para DX.

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.

9. Projete os códigos de máquina para as seguintes instruções.


e) XO R AL, AL
ii) E AX, BX
iii) OU AL, BL
iv) MOV DS, AX

10. Encontre os códigos de máquina para as instruções


i) SUB AL, [5676H]
ii) CMP AX, 0CDE2H
iii) CMP 34H [DI][BX], DL
iv) ADICIONAR CX, [SI]
Machine Translated by Google

programação
3 conceitos-ii

Neste capítulo, você aprenderá


| Boas práticas de programação. | Para usar ramificação incondicional e condicional
instruções.
| Como usar algumas funções importantes do DOS em
programas. | Para usar as instruções aritméticas que atendem a
| Uma parte do conjunto de instruções de 8086. números não assinados.
| Para usar as instruções de transferência de dados em diferentes | Para usar as instruções de multiplicação e divisão para
modos de endereçamento. aplicações interessantes.

| O conceito e a importância da filial inst | O uso da lógica, deslocamento e rotação


ruções. instruções do 8086.

3.1 | Abordagens de programação


Estamos agora em condições de sentir que entendemos um pouco, as ferramentas necessárias para a programação
(neste caso, programação em assembly). No entanto, antes de entrar no processo de codificação real, pode valer a pena
gastar algum tempo tentando entender as várias abordagens a serem usadas na programação. Essas idéias se aplicam
a todos os níveis de programação, ou seja, se usamos linguagens de alto nível ou linguagens de montagem.

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.

Imagem de abertura do capítulo: Um chip DAC.


Machine Translated by Google

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.

Agora, uma dica e conselho antes de começar

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.

Dicas de programação de montagem

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

3.1.1 | Chamadas de funções do BIOS e DOS

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:

MOV AH, 4CH INT


21H

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.

No Capítulo 8, veremos a lógica das interrupções e seu modo de funcionamento. No entanto, em


Neste capítulo, usaremos algumas interrupções do DOS para nos ajudar no processo de programação.
O uso dessas interrupções simples do DOS nos ajudará a entender a programação, pois podemos usar os
dispositivos de entrada e saída disponíveis de forma interativa. Veremos que a programação em linguagem
assembly pode ser divertida. Neste capítulo, algumas chamadas de função do DOS serão apresentadas. As
interrupções do BIOS serão usadas em capítulos posteriores.

3.1.2 | Usando chamadas de função 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.

ii) Leia o teclado sem eco

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.

iii) Escreva um caractere na unidade de exibição padrão.


Para isso, o valor ASCII do caractere a ser exibido deve estar em DL.
MOV DL, S'
MOV AH, 02
INT 21H

Com isso, o caractere S é exibido na tela do vídeo.


Machine Translated by Google

98 OS MICROPROCESSADORES x86

iv) Exibir uma cadeia de caracteres na unidade de exibição padrão

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

3.1.3 | O Conjunto de Instruções de 8086

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.

3.2 | Instruções de transferência de dados

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.

3.2.1 | MOV – Mover

Uso: destino MOV, origem


Esta instrução faz com que o conteúdo da fonte seja copiado para o destino (copiar não altera o conteúdo da
fonte). Lembre-se de que os tipos de dados de origem e destino devem corresponder – ambos devem ser bytes
ou palavras.

MOV AX, CX ;copia CX para AX – esta é uma operação de palavra


MOV AL, AH ;copia AH para AL – esta é uma operação de byte
MOV AX, [BX] ;copia no AX os dados do endereço apontado por BX
CUSTO MOVIMENTO, DX ;copia a palavra em DX para o local chamado COST

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

VENDER BD ? ;espaço para preço de venda


.CÓDIGO ;iniciar segmento de código
.COMECE ;inicia o programa

BENEFÍCIOS DO CAVALO 25H ;defina o lucro

MOV AL, COSTP ;mover COSTP para AL


ADICIONAR, LUCRO ;adiciona LUCRO ao AL
MOV SELLP, AL ;armazena a soma em SELLP

.SAÍDA ;sair para DOS


FIM ;fim do programa

Tabela 3.1 | Lista de Instruções de Transferência de Dados 8086 com Formato e Função

Sl No. Formato de instrução Função desempenhada Bandeiras afetadas


1 MOV dest, src (Move) Copia o conteúdo da fonte para o destino Nenhum

2 LEA reg16, memória Carregar o off set da localização de Nenhum

(Carregamento Efetivo memória especificada no registrador


Endereço) (16 bits)

3 XCHG dest, src Troque o conteúdo do destino e da Nenhum

(Intercâmbio) origem

4 Fonte PUSH (Push) Transfira uma palavra da fonte para o Nenhum

topo da pilha (SS : SP).

5 Destino POP (Pop) Transferir palavra no topo da pilha atual (SS : SP) Nenhum

para o destino

6 LDS reg16, memória Carregue o ponteiro far para Nenhum

(Carregue no DS e o DS e registre-se
registre-se)
7 LES reg16, memória Carregue o ponteiro far para Nenhum

(Carrega para ES e ES e registre


registra-se)

8 LAHF (Carregar AH Copie os bits 0–7 do registrador Nenhum

com sinalizadores) fl ag para AH

9 SAHF (Armazenar AH Transferir bits 0-7 de AH para o Nenhum

com bandeiras) registrador flag

10 PUSHF (Push flags) Empurre o registrador fl ag Nenhum

para a pilha

11 POPF (Bandeiras Pop) Coloque a palavra da pilha Nenhum

no registrador de bandeira
12 XLAT (Traduzir) Substitui o byte em AL pelo byte Nenhum

de uma tabela de usuário endereçada


por BX
Machine Translated by Google

100 OS MICROPROCESSADORES x86

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 101

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

0017 BB 0000 R MOV BX, OFFSET ARRAY ;endereço ARRAY


001A BF 0000 MOV DI, 0 ;carregar DI com
001D 8A 01 MOV AL, [BX + DI] ;pega os primeiros dados
001F 04 35 ADD AL, 35H ;adiciona 35H a ele
0021 BF 0005 MOV DI, 05 ;endereço novo local

0024 88 01 MOV [BX + DI], AL ;mover soma aqui

.SAÍDA ;sair para DOS


FIM ;fim do 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.

3.2.2 | LEA - Endereço Efetivo de Carregamento

Uso: LEA reg16, memória


Esta instrução faz com que o off set da posição de memória especificada seja carregado no registrador
indicado.

LEA SI, COSTP ;carrega o off set da localização de memória COSTP no SI


LEA BX, ARRAY ;carrega o off set de localização de memória ARRAY em BX

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

102 OS MICROPROCESSADORES x86

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

0017 8D 16 0000 R LEA DX, MESG1 ;deslocamento de carga de MESG1 em DX


001B B4 09 MOV AH, 09H ;Número da função DOS para
001D CD 21 INT 21H ;exibindo uma string

001F 8D 16 0006 R LEA DX, MESG2 ;deslocamento de carga de MESG2 em DX


0023 B4 09 MOV AH, 09H
0025 CD 21 INT 21H
.SAÍDA
FIM

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

3.2.3 | XLAT – Traduzir um Byte em AL


Uso: XLAT
Esta instrução traduz um byte em AL com um byte de uma tabela de consulta na memória. XLAT é uma
instrução que pode manipular tabelas de consulta e acessar dados dependendo do valor do número apontador.
Deve haver uma relação de um para um entre o número e os dados na tabela.
Antes de usar XLAT, a tabela de consulta deve estar na memória e o off set da tabela deve estar em BX.
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ II 103

Requisitos Carregue no BX, o conjunto off da tabela de consulta.


Então use XLAT

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

Tabela 3.2 | Tabela de consulta para conversão de decimal para ASCII

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

104 OS MICROPROCESSADORES x86

XLAT é equivalente às seguintes instruções:


MOV AX, 0
MOV SI, 0
MOV AL, [BX + SI]

SI ou DI servirão para mostrar a equivalência.

Tente usar XLAT para várias tabelas de pesquisa, por exemplo:

i) Um inteiro e seu quadrado.

ii) Um inteiro e seu cubo.

iii) Um número BCD e seu código de sete segmentos.

iv) Uma chave e seu código ASCII ou de sete segmentos.

3.2.4 | Uso PUSH e POP :


fonte PUSH
Destino POP
Para o 8086, apenas dados de 16 bits podem ser enviados e exibidos.
Observação CS não é um destino válido para POP.
PRESSIONE BX ;salva o conteúdo do BX para empilhar
EMPURRAR [BX] ;salva para empilhar o conteúdo da palavra apontada por BX
PRESSIONAR DS ;salva para empilhar o conteúdo do registrador de segmento DS
CUSTO PUSH ;salva para empilhar o conteúdo da palavra local COSTP
POP CX ;carrega o conteúdo do topo da pilha para CX
POP [SIM] ;carrega o conteúdo do topo da pilha para o local de memória
apontado pelo SI

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.

A pilha é uma região de armazenamento temporário. Quando um subprograma é chamado, o conteúdo do


registrador do programa principal naquele momento e o valor atual de IP e CS são colocados na pilha e
recuperados ao retornar do subprograma. Essas coisas são feitas automaticamente como parte de uma instrução
CALL. Além disso, um programador pode optar por armazenar temporariamente em pilha o conteúdo de alguns
registradores, para que possa utilizar esses registradores para outros cálculos. Ele pode recuperar o conteúdo
anterior desses registradores, após concluir sua computação atual. Essas operações são realizadas pelas
instruções PUSH e POP.

3.2.4.1 | Funcionamento da pilha


O 8086, conforme mencionado no Capítulo 1, usa uma pilha Last-In First-Out (LIFO). Uma pilha é uma área de
memória, na qual o endereço mais baixo é o endereço base do segmento. Os 16 bits superiores deste endereço
base estarão no registrador SS. O endereço mais alto estará no registrador SP – ou melhor, o SP conterá o
deslocamento do endereço mais alto em relação ao endereço base.
É por isso que é chamado de TOP of STACK. Por exemplo, se a pilha for definida a partir dos endereços 20000H
a 203E8H, SS = 2000H e SP = 03E8H, esta pilha terá então um tamanho de 3E8H bytes (1000 bytes). No 8086,
apenas uma palavra (16 bits) pode ser colocada na pilha. Um push, portanto, faz com que dois locais de memória
sejam acessados.
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ II 105

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

Figura 3.1 | Operação PUSH em uma pilha

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

Figura 3.2 | Operação POP em uma pilha

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.

3.2.4.2 | Definindo uma pilha


Agora, como vamos usar a pilha na programação? Obviamente temos que definir elementos incluindo o
tamanho da pilha, o endereço base do segmento e o topo da pilha. Se estivermos usando o segmento
minúsculo, isso é feito pelo DOS – mas em outros modelos de memória, teremos que fazer isso sozinhos.
Caso não o façamos, um aviso 'Sem segmento de pilha' aparecerá na montagem. Isso pode ser ignorado se o
Machine Translated by Google

106 OS MICROPROCESSADORES x86

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 107

3.3 | Instruções de Filial


As instruções de desvio são muito importantes, porque carregam consigo todo o poder de um computador.
A ramificação pode ser condicional ou incondicional. A ramificação incondicional torna-se necessária quando
o loop para trás ou para a frente é feito infinitamente, como quando usamos software para gerar uma onda
quadrada continuamente. No entanto, na maioria das vezes, a ramificação condicional é o que pode ser mais
importante. Tomar decisões com base no resultado de uma computação é o que dá aos computadores seu
poder e versatilidade. A maioria das instruções que usaremos posteriormente se tornam significativas apenas
quando a ramificação condicional é usada. Neste capítulo, discutiremos apenas as instruções de salto e loop.
Outras instruções de ramificação, como chamada e retorno, serão discutidas no Capítulo 4.
Vamos começar com a instrução de salto.

3.3.1 | JMP – Salto


Uso: Destino JMP O destino
é um local de memória, que pode ser expresso de diversas formas como será discutido a seguir. O destino
do salto também é freqüentemente chamado de 'alvo'. Uma instrução de salto quebra a sequência normal de
execução do programa e leva o controle para um local diferente no segmento de código. Existem muitas
maneiras e restrições para especificar o valor alvo e, com base nisso, podemos ter diferentes tipos de saltos.
A Fig 3.3 pode ser um cenário típico. Quando a instrução ADD está sendo executada, o IP (Instruction
Pointer) aponta para a próxima instrução que é uma instrução JMP incondicional . Ao decodificar a instrução
JMP, a EU (Execution Unit) percebe que a próxima instrução deve ser retirada do local com o rótulo AGAIN.
É óbvio, então, que o conteúdo do IP deve ser alterado de forma que uma nova sequência seja seguida. Os
pontos salientes em relação ao salto são:

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).

iii) A etiqueta do endereço de destino deve ser seguida de dois pontos.

iv) O salto pode ser para trás ou para frente na sequência do programa.

MOV.........
ADICIONAR,-------

JMP NOVAMENTE

................
--------------

--------------

NOVAMENTE: ................

Figura 3.3 | Controle o fluxo usando a instrução de salto


Machine Translated by Google

108 OS MICROPROCESSADORES x86

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.

3.3.1.1 | O Salto Próximo


No modo direto de endereçamento, o near jump tem o formato JMP label onde o label é o
endereço de um local de memória. O destino pode ser um número com sinal de 16 bits, o que
significa que o intervalo de salto está dentro de +/-32K bytes. No salto direto, a localização do
salto é um deslocamento sinalizado do valor atual do IP para o endereço de destino, ou seja, o
montador calcula esse deslocamento e o adiciona ao valor atual do IP. Assim, o endereço de salto
é relativo ou melhor, relocalizável. Para um salto para frente, esse deslocamento será positivo,
enquanto para um salto para trás, será negativo. Ele usa três bytes como tamanho de instrução –
um byte para o opcode e dois bytes para o destino de 16 bits fora do conjunto.

CÓDIGO DE OPERAÇÃO COMPENSAÇÃO BAIXA COMPENSAÇÃO ALTA

NOVO IP = IP ATUAL+OFFSET (16 bits)

Figura 3.4 | Formato da instrução de salto próximo

3.3.1.2 | O Salto Curto


O salto curto é um caso especial de um salto próximo com o formato de destino JMP. Para saltos
curtos, o deslocamento deve ser um número com sinal de 8 bits, o que significa que o destino do
salto só pode ser -128 ou +127 bytes deslocados do valor atual de IP.

CÓDIGO DE OPERAÇÃO DESLOCAMENTO

NOVO IP=IP ATUAL+OFFSET (8 bits)

Figura 3.5 | Formato da instrução de salto curto

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 109

O Exemplo 3.8 mostra como as instruções de salto 'curto' passam o controle de uma parte do programa
para outra.

0006 EB 07 JMP CURTA AÍ

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

110 OS MICROPROCESSADORES x86

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.

3.3.2 | Outras Formas de Instrução de Salto Incondicional


Existem outros modos de endereçamento para o salto próximo.
i) JMP reg16
Isso é chamado de salto indireto. O registrador de 16 bits contém o endereço de destino (off set). Este salto
não é um salto relativo. O IP é substituído pelo valor no registro.

JMP BX ;pula para o endereço de destino em BX. Faça IP = BX


JMP SI ;salta para o endereço de destino no SI. Faça IP = SI

ii) JMP [reg 16]


Isso é como um salto indireto duplo. O registrador aponta para um endereço que contém a localização do salto.

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.

3.3.2.1 | Saltos condicionais


Saltos condicionais são a melhor parte da ideia de transferência de controle. Eles alteram a sequência de execução do
programa com base no resultado de uma computação que faz com que os bits de sinalização sejam definidos ou redefinidos.
No entanto, há um caso ( JCXZ) em que o conteúdo do registro é verificado.
Observação Todos os saltos condicionais são saltos curtos.
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ II 111

Uso: destino J(condição).

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.

3.3.2.2 | Salto distante

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

Sim. Não. Mnemônico O que significa Condição testada


1 E Salte se Acima CF = 0 e ZF = 0

2 JAE Saltar se Acima ou Igual FC = 0

3 JB Saltar se Abaixo FC = 1

4 JBE Saltar se Abaixo ou Igual CF = 1 ou ZF = 1

5 JC Saltar se Carregar FC = 1

6 JCXZ Pule se CX Zero CX = 0

7 É Saltar se for igual ZF = 1

8 JNA Salte se não estiver acima CF = 1 ou ZF = 1

9 JNAE Saltar se não for superior ou igual FC = 1

10 JNB Pule se não estiver abaixo FC = 0

11 JNBE Saltar se não for inferior nem igual CF = 0 e ZF = 0

12 JNC Saltar se não transportar FC = 0

13 ETC Saltar se não for igual ZF = 0

14 JNP Saltar se não houver paridade PF = 0

15 JNZ Pular se não for zero ZF = 0

16 JP Saltar se Paridade PF = 1

17 JPE Saltar se a paridade for igual PF = 1

18 JPO Saltar se Paridade Ímpar PF = 0

19 JZ Pule se for zero ZF = 1


Machine Translated by Google

112 OS MICROPROCESSADORES x86

CÓDIGO DE OPERAÇÃO IP BAIXO IP ALTO CS BAIXO CS ALTO

Figura 3.6 | Formato da instrução de salto distante

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.

3.3.3 | A instrução LOOP


Uso: etiqueta LOOP.
Existe uma instrução muito útil e freqüentemente usada chamada LOOP. Isso combina salto com um contador.
O registrador CX é designado para decrementar toda vez que LOOP é executado. Quando CX = 0, o loop é
encerrado.
MOV CX, N
MAIS: .........................
.........................
.........................
.........................
LOOP MAIS
.........................
.........................

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 113

.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.

3.4 | Instruções aritméticas


A lista completa de instruções aritméticas é fornecida na Tabela 3.4. As instruções de 1 a 9 serão
discutidas em detalhes e usadas neste capítulo. O resto será tratado, no Capítulo 4 para assinaturas
aritmética numérica.
Machine Translated by Google

114 OS MICROPROCESSADORES x86

Tabela 3.4 | Conjunto Completo de Instruções Aritméticas

Sl No. Formato da Função de Instrução realizada Bandeiras afetadas

1 ADICIONAR destino, src Adicionar dest e src AF CF DE PF SF ZF

2 ADC dest, src Adicione dest, src e CF AF CF DE PF SF ZF

3 Destino INC Adicione 1 ao destino AF –– DE PF SF ZF

4 SUB dest, src Subtrair src de dest AF CF DE PF SF ZF

5 SBB destino, src Subtraia a fonte e o CF do AF CF DE PF SF ZF


destino

6 DEZ destino Subtrair 1 de dest AF –– DE PF SF ZF

7 CMP dest, src Subtrai a origem do destino AF CF DE PF SF ZF

e atualiza os sinalizadores, mas


não salva o resultado. Apenas as
bandeiras são afetadas
8 MUL src Multiplicação sem sinal –– CF DE –– –– ––

9 DIV src Divisão binária sem sinal


–– –– –– –– –– ––

10 CBW Converter byte em palavra Nenhum

11 CWD Converter palavra em palavra dupla Nenhum

12 DAA Ajuste decimal para adição AF CF –– PF SF ZF

13 A Ajuste Decimal para Subtração AF CF –– PF SF ZF

14 Destino NEG Negação do complemento de dois AF CF DE PF SF ZF

15 IMUL src Multiplicação Assinada –– CF DE –– –– ––

16 IDIV src Divisão de inteiros assinados


–– –– –– –– –– ––

17 AAA Ajuste ASCII para Adição AF CF –– –– –– ––

18 AAS Ajuste ASCII para Subtração AF CF –– –– –– ––

19 AAM Ajuste ASCII para Multiplicação –– –– –– PF SF ZF

20 AAD Ajuste ASCII para Divisão SF –– –– PF –– ZF

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'.

3.4.1 | Instruções de controle de bandeira

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 115

fl ag que pode ser definido/reiniciado usando instruções, e esse é o carry fl ag. As instruções relevantes para isso
são:

i) CLC – Clear carry.

ii) STC – Set carry.

iii) CMC – Complemento de transporte.

Agora, veremos o formato e o uso de algumas das funções aritméticas importantes e comumente usadas.
instruções.

3.4.2 | Instruções de adição


ADICIONAR – Adicionar.

Uso: ADICIONE destino, origem.


Esta instrução adiciona o destino e a origem e coloca a soma no destino. Todas as bandeiras condicionais são
afetadas.

ADICIONAR AH, AL ;adiciona AL a AH, soma em AH


ADICIONAR AL, COSTP ;adiciona o byte em COSTP a AL, soma em AL
ADICIONAR BX, 0987H ;adiciona o número 987H a BX, soma em BX
ADICIONAR CX, [BX] ;adiciona a palavra no local apontado por BX para CX soma
em CX

ADC – Adicionar com transporte.


Uso: destino ADC, origem.
Esta instrução adiciona CF e fonte ao destino e coloca a soma no destino.
Existem três operandos, dos quais o terceiro é o carry. Todas as bandeiras condicionais são afetadas.

ADC AH, 0 ;AH = AH + 0 + CF


ADC [BX], AL ;adiciona o byte apontado por BX com AL e CF, coloca soma
no local apontado por BX
ADC AX, [BX] [SIM] ;adiciona a AX, CF e a palavra com EA = BX + SI soma em
AX

INC – Incremento.
Uso: destino INC.
Esta instrução adiciona 1 ao destino. Todas as bandeiras condicionais, exceto a bandeira de transporte, são
afetadas.

INC BX ;adicione 1 ao conteúdo de BX


INC [BX] ;adiciona 1 ao conteúdo do local de memória apontado por BX

INC AH ;adicione 1 ao conteúdo de AH

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

116 OS MICROPROCESSADORES x86

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:

INC BYTE PTR [BX] ;ponteiro de bytes


ou PTR DE PALAVRA INC [BX] ;apontador de palavras
ou INC DWORD PTR [BX] ;apontador de palavra dupla

conforme o caso. Encontraremos várias instâncias em que esse ponteiro é usado.

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 117

LEA BX, NÚMEROS ;BX para apontar para os números


MOV CX, 10 ;mover a contagem para CX
MOV AX, 0 ;faz AX = 0
REPETIR: ADICIONAR AL, [BX] ;adiciona os números, soma em AX
ADC AH, 0 ;adiciona os carrys no AH
INC BX ;incrementa o ponteiro
LOOP REPEA ;repete se CX não for igual a 0
MOV SUM, ;armazena AX em SUM
AX .EXIT
FIM

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

118 OS MICROPROCESSADORES x86

INC BX ;segunda palavra da soma


LOOP REPEA ;volta se CX não for 0
MOV DL, 0 ADC ;faz DL = 00
DL, 0 MOV ;adiciona o carry ao DL
SUMC, DL .EXIT ;move o carry para o SUMC

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).

Tabela 3.5 | Parte Relevante do Segmento de Dados Após a Execução do Exemplo


3.12

Offsets na memória Dados

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 119

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.

SBB CH, 7 ;subtrai de CH, 7 e CF - resulta em CH


SBB AX, [BP + 2] ;subtrai de AX, a palavra apontada por [PB + 2].
Como o BP é usado, os dados são retirados do
segmento da pilha. O resultado é colocado em AX
DEC – Decremento.
Uso: destino DEC.
Esta instrução subtrai 1 do destino. Todas as bandeiras condicionais, exceto a bandeira de transporte,
são afetadas.

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

B5H 181 1011 0101 ÿ


ÿ FCH ÿ 252 1111 1100
B9H ÿ71 1011 1001
Machine Translated by Google

120 OS MICROPROCESSADORES x86

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

Os passos do programa são os seguintes:


i) Subtraia 9 de 100 repetidamente até obter um número negativo. No programa, comece com AL =
100. Quando AL se tornar negativo, será definido o carry fl ag (devido ao empréstimo). Esta é a
condição de parada para a subtração.
ii) Neste problema, após subtrair 9 de 100 onze vezes, AL conterá 01. Mais uma subtração fará com
que o conteúdo de AL se torne -8 (F8H na forma de complemento de 2). A bandeira de transporte
está definida e a subtração adicional é interrompida.
iii) Para obter o resto, adicione 9 (o divisor) a AL. Obtemos 1. Este é o resto.
iv) Sempre que uma subtração for realizada sem impedimentos, incremente uma contagem em CL. Isso vai dar
o quociente.
v) O quociente e o restante são armazenados em seu espaço alocado no segmento de dados.
A instrução SBB pode ser usada nos casos em que a subtração multibyte é feita. Por exemplo, para
subtrair duas palavras duplas ou palavras quádruplas, SBB terá que ser usado, assim como o ADC é
usado (Exemplo 3.13) para adição multibyte.
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ II 121

Tabela 3.6 | Configurações de sinalização após uma instrução de comparação

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.

3.4.4 | Comparar instrução


CMP – Comparar.
Uso: destino CMP, origem.
Essa instrução compara os dois operandos e faz com que os sinalizadores condicionais sejam afetados, mas
nem o destino nem a origem 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 3.6.
Portanto, é óbvio que seguir uma instrução de comparação com um JNC/JC ou JNZ/JZ fará o truque. Se a
instrução for, digamos CMP AL, BL, a maneira de imaginar é
se AL > BL, CF é resetado
se AL < BL, CF é setado se
AL = BL, ZF é setado

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

122 OS MICROPROCESSADORES x86

.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

LEA BX, NÚMEROS ;BX é o ponteiro para o array


MOV CL, 0AH ;CL atua como contador
MOV AL, 0 ;AL = 0
REPEA: CMP AL, [BX] ;compara cada número com AL
JAE NOVAMENTE ;se AL estiver acima ou igual, salta ;se abaixo,
MOV AL, [BX] maior não. estar em AL
NOVAMENTE: INC BX ;ponteiro de incremento
DEC CL ;decrementa contador ;repete
JNZ REPEA a sequência se contar! = 0
MOVE MAIOR, AL ;o maior número estará em AL
;armazená-lo no local MAIOR
.SAÍDA
FIM

A lógica deste programa é a seguinte:


i) Os números são armazenados como um array na memória chamado NUMS. BX é usado como um ponteiro para
esta matriz.
ii) CL contém a contagem dos números (aqui CL = 0AH).
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ II 123

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

MOV AH, 01 ;chamada de função DOS


INT 21H para ;entrada de caracteres com eco
;o caractere digitado está em AL
REPETIR: CMP [BX], AL ;compara AL com bytes de string
SEJA ENCONTRADO ;se a igualdade for encontrada, exibe
;mensagem apropriada
INC BX ;aponta para o próximo byte no array
LOOP REPEA ;se a contagem não for 0, repita
LEA DX, MESG2 ;caractere não encontrado, vai para MESG2
JMP DISP

ENCONTRADO: LEA DX, MESG1 ;exibe MESG1


DISP: MOV AH, 09 ;Chamada de função DOS para exibição
INT 21H ;de string
.SAÍDA
FIM

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

124 OS MICROPROCESSADORES x86

é 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.

3.4.5 | Multiplicação não assinada


MUL – Multiplicar.
Uso: fonte MUL.
Esta instrução multiplica um número em AL ou AX pela fonte (onde a fonte pode ser um registrador ou um local
de memória, mas não um número imediato). Todas as bandeiras condicionais são afetadas, mas apenas CF e
ZF são definidos como significativos para o resultado. O destino depende do tamanho do operando. Existem duas
maneiras de realizar a multiplicação.

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

ii) Palavra por palavra

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

iii) Palavra por byte

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 125

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

126 OS MICROPROCESSADORES x86

JZ FINAL ;se N = 0, salta para encontrar 0!


REPETIR: MUL BX ;para N não 0, multiplique com AX
DEC BX ;diminui BX
CMP BX, 0 ;comparar com 0
ETC ;repete se BX não for 0
FINAL: MOV FACT, AX .EXIT ;AX = 1, portanto 0! = 1

FIM

A computação é feita iterativamente. Primeiro, AX = 1. O valor de N é copiado para BX. Para N = 0, o


fatorial é 1. Para este caso, o conteúdo de AX é transferido para o local FACT e corresponde a 0! Se
N não é zero, então é multiplicado por AX. BX é decrementado e multiplicado cumulativamente com o
produto em AX. À medida que N aumenta, N! aumenta abruptamente, e apenas para números até 8,
com o fatorial se encaixando em uma localização de palavra. A multiplicação adicional torna-se
impossível porque um dos operandos tem um tamanho maior que uma palavra. O valor de N! é
finalmente armazenado no local de memória rotulado FACT.

3.4.6 | Divisão não assinada


DIV - Dividir
Uso: fonte DIV
Esta instrução divide AX ou DX – AX pela fonte, onde a fonte pode ser um registrador ou uma posição de
memória, mas não um número imediato. Todas as bandeiras condicionais são afetadas, mas indefinidas –
portanto, não dão nenhuma interpretação ou informação sobre o resultado. O destino depende do tamanho
do operando. Existem duas maneiras de realizar a divisão:

i) Divida uma palavra por um byte.

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

MOV AX, 0C678H


MOV CL, 0F9H

Este segmento de programa fará com que AH (restante) = 0CH e AL (quociente) = CCH.

Dividindo um byte por um byte.

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.

ii) Divida uma palavra dupla por uma palavra.

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 127

DIV BX ;divide a palavra dupla em DX-AX pela palavra em BX


PALAVRA DIV PTR [SI] ;divide a palavra dupla em DX-AX pela palavra apontada por SI ;divide
ÂNGULO DIV a palavra dupla em DX-AX pela palavra em ANGLE
Dividindo uma palavra por uma palavra.

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

128 OS MICROPROCESSADORES x86

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

MOV AX, NUM ;obter o número hexadecimal em AX


MOV DX, 0 ;DX = 0, portanto DX-AX é o dividendo
MOV CX, 10 ;o divisor 10 é carregado no CX
REPEA: DIV CX ;dividir por CX
PRESSIONE DX ;o restante em DX é empurrado para empilhar
MOV DX, 0 ;DX = 0 novamente para obter o dividendo em DX-AX
CONTAGEM INC ;incrementa a contagem ;verifica
CMP AX, 0 se o quociente (em AL) é zero
ETC ;se AL não for zero, repete a divisão
DISP: POP DX ;retire os restos para mostrar
ADICIONAR DL, 30H ;adicione 30H para converter para ASCII
MOV AH, 02 ;Chamada de função DOS para exibição
INT 21H ;um personagem
CONTAGEM DE DEZ ;diminui a contagem
JNZ DISP ;se count = 0, significa todos os restos
;foi lançado
.SAÍDA
FIM
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ II 129

Tabela 3.7 | Lista de instruções lógicas e funções executadas por eles


Sl No. Formato da Função de Instrução realizada Bandeiras afetadas

1 E dest, src AND lógico dos dois CF DE PF SF ZF


operandos retornando o (OF undefi para baixo)
resultado no destino
2 OU dest, src OR inclusivo lógico dos dois CF DE PF SF ZF
operandos retornando o (OF undefi para baixo)
resultado no destino
3 XOR dest, src Executa um exclusivo bit a bit CF DE PF SF ZF
OR dos operandos retornando o (OF undefi para baixo)
resultado no destino
4 NÃO destino Inverte os bits do operando Nenhum

“dest” formando o complemento


de um
5 TESTE destino, src Executa um AND lógico dos dois CF DE PF SF ZF
operandos atualizando o (OF undefi para baixo)

registrador de flags sem salvar o


resultado

3.5 | Instruções lógicas


A Tabela 3.7 fornece a lista completa de instruções lógicas e a função executada

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

Após esta operação, BL contém 4AH. CF = 0, OF = 0, ZF = 0.


ii) OU AH, BH
AH = 00 0000 0000
BH = 34H 0011 0100
34H 0011 0100

Após esta operação, AH = 34H. CF = 0, OF = 0, ZF = 0.


Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ II 129

Tabela 3.7 | Lista de instruções lógicas e funções executadas por eles


Sl No. Formato da Função de Instrução realizada Bandeiras afetadas

1 E dest, src AND lógico dos dois CF DE PF SF ZF


operandos retornando o (OF undefi para baixo)
resultado no destino
2 OU dest, src OR inclusivo lógico dos dois CF DE PF SF ZF
operandos retornando o (OF undefi para baixo)
resultado no destino
3 XOR dest, src Executa um exclusivo bit a bit CF DE PF SF ZF
OR dos operandos retornando o (OF undefi para baixo)
resultado no destino
4 NÃO destino Inverte os bits do operando Nenhum

“dest” formando o complemento


de um
5 TESTE destino, src Executa um AND lógico dos dois CF DE PF SF ZF
operandos atualizando o (OF undefi para baixo)

registrador de flags sem salvar o


resultado

3.5 | Instruções lógicas


A Tabela 3.7 fornece a lista completa de instruções lógicas e a função executada

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

Após esta operação, BL contém 4AH. CF = 0, OF = 0, ZF = 0.


ii) OU AH, BH
AH = 00 0000 0000
BH = 34H 0011 0100
34H 0011 0100

Após esta operação, AH = 34H. CF = 0, OF = 0, ZF = 0.


Machine Translated by Google

130 OS MICROPROCESSADORES x86

iii) XOR AL, CH


AL = 8CH 1000 1100
CH = 67H 0110 0111
EBH 1110 1011

Após esta operação, AL = EBH, CF = 0, OF = 0, ZF = 0.


iv) TESTE AH, BL
AH = 00 0000 0000
BL = 5EH 0101 1110

Após esta operação, ZF = 1, OF = 0, CF = 0.

Mascaramento Há uma palavra 'mascaramento' associada à operação AND. O mascaramento é usado


para selecionar a parte de uma palavra ou um byte necessário, enquanto faz com que os bits indesejados
sejam zero. Por exemplo, observe o valor em AL após a execução das instruções a seguir.

MOV AL, 78H


E AL, 0FH

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.

MOV AX, 9876H


E AX, 0FFFH
O AX agora tem um conteúdo de 0876H.

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

XOR Para limpar um registro, use XOR.


XOR BL, BL ;BL = 0
TEST Para testar se um bit está definido ou não, use a instrução TEST.

TESTE BL, 01H

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 131

3.6 | Instruções de deslocamento e rotação


A Tabela 3.8 fornece a lista completa das instruções de deslocamento e rotação.

3.6.1 | Mudança

i) As instruções de deslocamento fazem deslocamento aritmético ou lógico.

ii) Eles também se deslocam para a direita ou para a esquerda.

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.

SAL/SHL – Deslocamento Aritmético Esquerdo/Deslocamento Lógico Esquerdo.

Uso: SAL/SHL dest, contagem.

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.

Modif es Flags: CF OF PF SF ZF (AF indefinido).

C 7 0 0

Tabela 3.8 | Lista das instruções de deslocamento e rotação.


Sim. Não. Formato de instrução Função desempenhada Bandeiras afetadas

1 SHL destino, contagem Deslocamento lógico para a esquerda CF DE PF SF ZF

por bits de 'contagem' (OF undefi para baixo)

2 SAL destino, contagem Deslocar aritmética para a CF DE PF SF ZF

esquerda por bits de 'contagem' (OF undefi para baixo)

3 SHR destino, contagem Desloque a direita lógica por CF DE PF SF ZF

bits de 'contagem'. (OF undefi para baixo)

4 SAR destino, contagem Deslocar aritmética para a direita CF DE PF SF ZF

por bits de 'contagem' (OF undefi para baixo)

5 RCL destino, contagem Gire através do transporte à CF DE

esquerda por bits de 'contagem'.

6 RCR destino, contagem Gire através do transporte à CF DE

direita por bits de 'contagem'

7 ROL dest, contagem Girar para a esquerda CF DE

por bits de 'contagem'

8 ROR destino, contagem Girar para a direita por CF DE

bits de 'contagem'
Machine Translated by Google

132 OS MICROPROCESSADORES x86

SHL BX, 1 ;deslocamento lógico para a esquerda em uma posição, a


palavra em BX

SAL AL, CL ;desloca a aritmética para a esquerda, AL pela contagem


especificada em CL

SHL DATA2, CL ;deslocamento lógico para a esquerda, o conteúdo da memória


DATA2 pela contagem especificada em CL
SHL BYTE PTR [BX][DI], 1 ;deslocar para a esquerda (lógico) uma vez, o byte com EA =
BX + DI
PALAVRA SAL PTR [O], CL ;deslocar para a esquerda (aritmética)a palavra apontada por
DI, pela contagem especificada em CL

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

SHR – Shift Right Lógico.


Uso: SHR dest, contagem.
Esta instrução desloca o destino para a direita por bits de 'contagem' e preenche com zeros as posições vagas
à esquerda. A bandeira Carry contém o último bit deslocado.
Modif es Flags: CF OF PF SF ZF (AF indefinido)

O 7 0 C
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ II 133

SHR DX, 1 ;deslocar para a direita uma posição, a palavra em DX


SHR WORD PTR [SI] THERE, CL ;deslocar a palavra para a direita com EA = THERE +
SI, pela contagem especificada em CL
SHR CH, CL ;desloca para a direita o conteúdo de CH, pela contagem
em CL
SHR BYTE PTR [BP][SI], 1 ;deslocar para a direita um byte apontado por EA =
PA + SIM

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.

3.6.2 | Girar instruções


As instruções de rotação têm o mesmo formato das instruções de deslocamento. Existem dois tipos de rotação –
rotação por meio de transporte ou sem levar o bit de transporte como parte do ato de rotação.
ROL – Girar para a esquerda.

Uso: ROL dest, contagem.


Esta instrução gira os bits no destino para a esquerda 'contagem' vezes com todos os dados enviados à esquerda
reentrando à direita. A bandeira Carry conterá o valor do último bit girado para fora.
Machine Translated by Google

134 OS MICROPROCESSADORES x86

Modif es Flags: CF OF

C 7 0

FUNÇÃO SI, CL ;girar à esquerda a palavra no SI, pela contagem no CL


ROLL BYTE PTR [DI][BX], 1 ;girar para a esquerda o byte apontado por EA = [DI + BX] uma vez

ROR - Girar para a direita


Uso: ROR dest, contagem

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

Vamos examinar o que o Exemplo 3.26 fará.

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

CONCEITOS DE PROGRAMAÇÃO ÿ II 135

RCL – Girar ao longo do transporte para a esquerda.


Uso: RCL dest, contagem.
Esta instrução faz com que o bit mais à esquerda (LSB) entre na bandeira Carry, e o CF entra pela
extremidade esquerda (MSB). Assim, devido a uma operação de deslocamento, o MSB entra no CF, e o
CF entra na posição LSB.

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

RCR – Rotate Th rough Carry Right.


Uso: RCR dest, contagem.

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

Instruções Resultado após a execução


STC FC = 1
MOV AX, 5485H AX = 0101 0100 1000 0101
RCR AL, 1 AL = 1100 0010
Machine Translated by Google

136 OS MICROPROCESSADORES x86

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

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| MOV é a instrução mais utilizada e faz parte do grupo de transferência de dados.

| 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.

| PUSH e POP podem ser usados apenas com o segmento de pilha

| 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.

| As instruções de desvio fazem com que a sequência do programa seja alterada.

| JUMP é uma importante instrução de desvio que pode ser distante ou próxima, incondicional ou condicional.

| Os saltos usando o modo direto de endereçamento são realocáveis e 'relativos'.

| 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.

| As instruções INC e DEC não afetam a bandeira Carry.

| A instrução CMP (Compare) subtrai a fonte do destino e define/reinicia os sinalizadores,


mas nem a origem nem o destino são alterados.

| 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.

| As instruções lógicas de 8086 são AND, OR, XOR, NOT e TEST.

| 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

CONCEITOS DE PROGRAMAÇÃO ÿ II 137

PERGUNTAS

1. Distinguir entre a abordagem de cima para baixo e de baixo para cima na programação.

2. Qual é o uso de chamadas de função DOS na programação assembly?

3. Quantos operandos tem cada uma das instruções a seguir?


a) ADD b)
ADC c)
INC

4. Qual sinalizador condicional não é afetado pela instrução DEC?

5. Se AX = 5600H e BX = 0C07H, encontre o conteúdo de CX e DX após os três conjuntos de


instruções.
a) EMPURRAR EIXO

PRESSIONE BX

POP CX
POP DX

b) EMPURRAR EIXO

PRESSIONE BX

POP DX
POP CX

c) PRESSIONE BX
EMPURRAR MACHADO

POP CX
POP DX

6. Por que o ponteiro da pilha é chamado de TOP OF STACK?

7. Distinga entre um salto próximo e um salto distante.

8. Especifique duas maneiras de especificar um salto incondicional no modo indireto de endereçamento.

9. Por que o salto distante tem cinco bytes de comprimento de instrução?

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?

13. A instrução ADD pode usar CS como destino?

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?

16. Qual é o papel de OF e CF na multiplicação?

17. O que acontece se a instrução DIV for usada para um dividendo de 1938H e divisor de 05?

18. O que se entende por mascaramento? Dê um exemplo de como é usado.

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

138 OS MICROPROCESSADORES x86

3. Exiba cada caractere da palavra PRADO em uma linha separada.

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

9. Encontre o maior número em uma matriz de a) bytes


b) palavras Exiba o maior número em cada caso,
como um número decimal.

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.

12. Some a soma dos primeiros 20 números naturais. Exiba a soma.

13. Escreva um programa que conte o número de 1s em um número binário.

14. Escreva um programa para somar duas matrizes N × N.

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

Neste capítulo, você aprenderá


| Para usar instruções de string para vários aplicativos. | Para escrever programas para converter entre os formatos
numéricos comumente usados.
| O conceito e uso de procedimentos e chamadas | Aritmética numérica assinada usando instruções 8086.
instruções.

| 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.

4.1 | Instruções de string


O 8086 possui um conjunto de instruções para manipulação de blocos de dados na forma de bytes ou palavras.
Eles são chamados de instruções 'string'. Uma string é uma matriz de dados do mesmo tipo – por exemplo, uma
string de caracteres ou uma string de bytes. A Tabela 4.1 fornece a lista de instruções/prefixos de string que são
usados em manipulações de string. A utilidade das instruções string pode ser vista quando, na memória, os dados
precisam ser movidos, pesquisados ou comparados em blocos.
Considere o caso de 100 (digamos) palavras ou bytes em uma área de memória específica que deve ser
movida para outra área de memória. Isso pode muito bem ser feito usando registradores de ponteiro e loop usando
um contador. No entanto, todo esse processo pode ser automatizado com menor número de instruções se usarmos
instruções de string. Da mesma forma, podemos precisar comparar dois blocos de dados para igualdade ou
pesquisar um bloco de dados para obter um dado específico. Em todos esses casos, as instruções de string tornam
nossa tarefa mais fácil e nosso código mais curto. No entanto, antes de usar essas instruções, precisamos incluir
algumas etapas de inicialização em nosso código.

Pré-requisitos para usar instruções de string


i) Dois segmentos devem ser definidos, ou seja, o segmento de dados e o segmento extra. Isso significa que os
registradores de segmento correspondentes DS e ES devem ser inicializados e usados. O segmento de dados
é o segmento de origem e o segmento extra é o segmento de destino. ii) Os registradores DI e registradores

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.

Imagem de abertura do capítulo: um chip de trava.


Machine Translated by Google

140 OS MICROPROCESSADORES x86

Tabela 4.1 | Lista de Instruções/Prefi xos Usados em Operações de String


Sim. Não. Formato de instrução Função desempenhada Bandeiras afetadas

1 MOVSB/MOVSW Mover byte ou string de Nenhum

palavras

2 CMPSB/CMPSW Comparar byte ou AF CF DE PF SF ZF

string de palavras

3 SCASB/SCASW Digitalizar byte ou string de AF CF DE PF SF ZF

palavras

4 LDSB/LODSW Carregar byte ou string de Nenhum

palavras

5 STOSB/STOSW Armazenar byte ou string de Nenhum

palavras

6 CLD Limpar a bandeira de direção DF

7 DST Definir sinalizador de direção DF

8 REP (Prefi x para uma Repetir a execução de Nenhum

instrução de string) instruções de string enquanto


CX não for 0

9 REPE/REPZ Repetir a execução de Nenhum

(Prefi x para uma instruções de string enquanto


instrução de string) CX não for 0 e enquanto Zero

fl ag estiver definido

10 REPNE / REPNZ Repetir a execução de Nenhum

(Prefi x para uma instruções de string enquanto


instrução de string) CX não for 0 e enquanto Zero

fl ag não 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.

4.1.1 | A instrução MOVS


O Exemplo 4.1 mostra o uso da instrução de string MOVSB com os pré-requisitos necessários incorporados. Vamos examinar como isso foi

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

(EXTR). Veja como é feito. Quando ambos os registradores de segmentos são


Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ III 141

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

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
MOV AH, 4CH ;AH = 4CH para retornar ao DOS
INT 21H
BACALHAU FIM
FIM

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

142 OS MICROPROCESSADORES x86

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.

4.1.2 | A Instrução CMPS


Agora, vamos usar a próxima instrução de string – CMPSB/CMPSW. Esta instrução é para comparação de
strings, byte por byte ou palavra por palavra, conforme o caso. As bandeiras condicionais são modificadas de
acordo com o resultado da comparação. A comparação de strings deve ser acompanhada pelo uso do prefixo
REP condicional. Como a comparação de strings verifica apenas a igualdade, o sinalizador Zero é usado
automaticamente. O Exemplo 4.2 compara duas cadeias de caracteres (de comprimento seis) que são salvas
no segmento de dados. Uma das duas mensagens deve ser exibida, dependendo se WRD2 é o mesmo que
WRD1.

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 143

CLD ;limpar sinalizador de direção


REPE CMPSB ;repete comparação se igual(ZF = 1)
JNZ MSG ;se ZF for resetado, vai para MSG
LEA DX, DEUS ;aponta DX para a primeira mensagem
JMP DISP
MSG: LEA DX, RUIM ;aponta DX para a segunda mensagem
DISP: MOV AH, 09 ;usar a função para exibição de string
INT 21H ;usar interrupção DOS 21H
.SAÍDA
FIM

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.

ii) Saída normal quando CX = 0.


No exemplo, as duas cadeias de caracteres mostram-se diferentes, o que faz com que a mensagem 'NOT
SAME' seja impressa. Se WRD1 e WRD2 forem iguais, a mensagem 'SAME' será impressa.

4.1.3 | A Instrução SCAS


A instrução SCAS varre um byte ou string de palavras para verificar a presença de um byte ou palavra
específica. Esses dados específicos são carregados em AL ou AX. A string que deve ser escaneada
deve estar no segmento extra e deve ser apontada por DI. Isso é obrigatório e não pode ser
superado. O Exemplo 4.3 ilustra um cenário típico para o uso desta instrução. Suponha que uma string
ASCII rotulada LIST seja armazenada na memória. O programa procura na string a presença do caractere
ASCII 'S'. DI endereça a string a ser pesquisada. A string a ser pesquisada é colocada no segmento Extra,
fazendo com que o ES tenha o mesmo valor que o DS. Assim, o segmento extra é o mesmo que o
segmento de dados. Neste exemplo, a instrução SCASB tem um prefixo REPNE (repetir enquanto não for
igual). O prefixo REPNE faz com que a instrução SCASB se repita até que o registrador CX atinja 0, ou até
que uma condição igual seja indicada (ZF = 1) como resultado da operação de comparação da instrução
SCASB. A varredura da string continua enquanto 'S' não for encontrado na string. Se 'S' for encontrado, a
pesquisa será encerrada imediatamente.

Exemplo 4.3
.MODELO PEQUENO
.DADOS
LISTA DB “ANBHTSHFGTRIUUJEHNPBGDVBTH”
RP DB “CARACTER PRESENTE$”
NOTP DB “CARACTER NÃO PRESENTE$”
Machine Translated by Google

144 OS MICROPROCESSADORES x86

.CÓDIGO
.COMECE

MOV AX, DS ;copia DS para AX ;copia


MOVE ES, AX DS para ES
LEA DI, LISTA +26 ;aponta SI para o último caractere
DST ;auto-decremento ;carrega
MOV CX, 26 contagem em CX ;carrega o
MOV AL, 'S' caractere em AL ;repete se não for igual
REPNE SCASB
JZ MSG
LEA DX, NOTP
JMP DISP
MSG: LEA DX, PR
DISP: MOV AH, 09
INT 21H
.SAÍDA
FIM

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.

4.1.4 | As Instruções STOS e LODS


e) STOS
A instrução STOS é o mnemônico para 'armazenar' uma string na memória. Como tal, precisamos definir uma área de
memória na qual o 'armazenamento' deve ser feito. Esta área de memória é definida como o segmento extra, e é
endereçada pela DI por ser o segmento de destino. Os dados a serem armazenados são colocados no registrador AL
ou AX. Uma área na memória pode ser preenchida com os dados necessários, com esta instrução. O Exemplo 4.4 ilustra o
uso da instrução STOS. Aqui o AX é carregado com 0001, e este é movido para um local chamado AREA, que foi definido
como um array de 50 palavras. Este array é preenchido com a palavra 0001 pela instrução STOSB, usando o prefixo REP
e o contador CX inicializado com 50. Como STOS é especifi cado para o segmento extra, o registrador ES deve ser
inicializado. Observe que, como feito anteriormente, um segmento de dados é primeiro definido (pelo

.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

CONCEITOS DE PROGRAMAÇÃO ÿ III


145

LEA DI, ÁREA ;endereço AREA com DI


MOV CX, 50 ;contagem de carga em CX
CLD ;limpar sinalizador de direção
MOV AX, 0001 ;carrega AX com 0
REP STOSW ;repete até CX = 0
.SAÍDA ;sair para DOS
FIM ;fim do programa

É ó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

146 OS MICROPROCESSADORES x86

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

Figura 4.2 | Ligue e retorne


Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ III 147

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

PROC QUADRADO PRÓXIMO ;defina o procedimento


MOV BL, AL ;mover multiplicando para BL
MUL BL ;multiplicar
CERTO ;voltar ao programa principal
PONTO QUADRADO ;defina o fim do procedimento
FIM

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

148 OS MICROPROCESSADORES x86

CÓDIGO DE OPERAÇÃO COMPENSAÇÃO BAIXA COMPENSAÇÃO ALTA

NOVO IP = IP ATUAL + OFFSET (16 bits)

Figura 4.3 | Formato da instrução direct near CALL

4.2.2 | Instruções de chamada e devolução


Agora que vimos o formato geral e a estrutura de um programa com procedimentos, vamos examinar a instrução CALL com
mais detalhes. Esta instrução é obviamente uma instrução de 'ramificação' porque faz com que o controle se mova para um
endereço diferente (chamado de destino ou destino), que pode estar no mesmo ou em um segmento de código diferente.

4.2.2.1 | Chamada intrasegmentar ou 'Perto'


e) CHAMADA Direta

Utilização: etiqueta CALL (ver Fig. 4.3).


A chamada direta é como uma instrução de salto direto e tem três bytes de comprimento. É relativo e o destino pode
ser de -32.768 bytes a +32.767 bytes do endereço da instrução que segue a chamada (este será o conteúdo atual do IP).
Isso significa que o off set pode ser um número com sinal de 16 bits. Quando esta chamada é executada, o novo valor de IP
= IP antigo + off set, onde o segundo e terceiro bytes da instrução dão o off set. A montadora deve calcular o off set na
primeira passagem. O Exemplo 4.5 usa esse tipo de instrução de chamada – a chamada de proximidade direta.

LIGUE PARA NOVA_WAY ;usando o rótulo, o montador calcula o off set


LIGUE MÚLTIPLOS ;chama um procedimento chamado MULTI

ii) CHAMADA Indireta

Uso: CALL reg16, CALL [reg16]


Neste caso, o destino é especificado em um registrador de 16 bits ou em um local de memória apontado por um registrador.
Esta não é uma chamada 'relativa'. O conteúdo do referido registrador ou localização de memória é carregado no IP para
utilização do procedimento.

CHAMAR BX ;o endereço do procedimento está em BX


PALAVRA DE CHAMADA PTR[BX] ;o endereço do procedimento está na memória e
é apontado por BX

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 149

.COMECE ;inicia o programa


LEA BX, ENT ;offset de ENT em BX
LEA E, DISPONÍVEL ;deslocamento de DISP no SI
CHAMAR BX ;chamar o procedimento ENT
ADICIONAR AL, 20H ;maiúsculas para minúsculas
MOV DL, AL ;transfere letras minúsculas para DL
LIGUE SIM ;chamar o procedimento DISP
.SAÍDA

ENT PROC PRÓXIMO

MOV AH, 01 ;procedimento para inserir a chave


INT 21H
CERTO

ENT ENDP

EXIBIR PROC PRÓXIMO

MOV AH, 02 ;procedimento para exibição


INT 21H
CERTO

DISP ENDP
FIM

4.2.2.2 | Intersegmento ou Chamada Distante

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.

4.2.3 | A Instrução RET


i) Uso: RET Quando
um procedimento é chamado, o valor atual de IP é empurrado para a pilha. Isso significa naturalmente que quando o
procedimento terminar, o controle deve retornar ao programa principal no ponto

CÓDIGO DE OPERAÇÃO IP BAIXO IP ALTO CS BAIXO CS ALTO

Figura 4.4 | Formato da instrução de salto distante


Machine Translated by Google

150 OS MICROPROCESSADORES x86

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.)

ii) Uso: TRIBUNAL n


Esta é outra forma da instrução RET. Isso adiciona o número 'n' ao ponteiro da pilha (SP) após o
endereço de retorno ter sido retirado da pilha, no retorno de um procedimento. Veremos o uso disso no
Exemplo 4.10.

4.2.4 | O uso da pilha em chamadas de procedimento


A pilha é usada em chamadas de procedimento para salvar o endereço de retorno. Há outro contexto
quando uma pilha é necessária. O programa principal pode estar usando vários registradores de uso geral.
Como o número de registros é limitado, o que acontece se o procedimento também precisar de alguns
desses registros? Se o procedimento utilizar os mesmos registradores, obviamente seu conteúdo será
alterado. Para evitar esse problema, o conteúdo desses registradores (incluindo o registrador fl ag) pode
ser empurrado para a pilha antes de chamar o procedimento e retornado da pilha ao retornar do
procedimento. Isso permite tanto ao programa principal quanto ao procedimento, a utilização dos mesmos
registradores sem perder seu conteúdo. Cabe ao programador escrever essas instruções push e pop (no
programa principal ou no procedimento). O único ponto a ser lembrado seria empurrar e estourar na ordem
inversa. No entanto, agora o MASM 6.x tem uma construção 'USES' que automaticamente coloca os registradores esp
O estalo será automático ao retornar do procedimento. O Exemplo 4.7a ilustra isso.

Exemplo 4.7a
.MODELO PEQUENO
.DADOS
----------------
.CÓDIGO
.COMECE
..
..
..
LIGUE MÚLTIPLOS
..
..
..

MULTI PROC PERTO DE USA DX CX


MUL BL
MOV DX, 4509H
ADICIONAR AX, DX
MOV CX, 0608H
ADICIONAR AX, CX
CERTO

MULTI ENDP
FIM
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ III 151

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

4.2.5 | Passando parâmetros para e de procedimentos

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.

4.2.5.1 | Passando Parâmetros Através de Registradores

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

152 OS MICROPROCESSADORES x86

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 PROC PRÓXIMO


MUL CL ;multiplica (N-1)x D, produto em AX
ADICIONAR BX, AX ;Nº termo = A + (N-1)D estará em BX agora
CERTO

NTH_TERM_AP ENDP
FIM

4.2.5.2 | Passando Parâmetros pela Memória No Exemplo


4.9, os dados usados pelo procedimento são acessados da memória através do registrador de ponteiro
BX, e os dados são colocados de volta na memória da mesma forma. O Exemplo 4.9 é um programa
para organizar um conjunto de números (armazenados na memória) em ordem decrescente. O método
envolve comparar números em pares e repetir isso N ÿ 1 vezes, se houver N números a serem
ordenados. Os passos são:

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 153

.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

ONE_SET PROC PRÓXIMO


MOV AL, [BX] ;pega o primeiro número em AL
INC BX ;incrementa o ponteiro
REPEA: MOV AH, [BX] ;pega o segundo número em AH
CMP AL, AH ;compare os números
CÂMBIO JB ;salto se o primeiro número estiver
DE VOLTA: CERTO abaixo ;caso contrário retorna
TROCA: MOV [BX], AL ;coloca AL no segundo endereço
MOV [BX-1], AH ;coloca AH no primeiro endereço
JMP BACK ;depois retorna
ONE_SET ENDP ;encerrar o procedimento
FIM

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.

4.2.5.3 | Passando parâmetros pela pilha


Pode haver razões pelas quais a pilha, que é uma área da memória, pode ser usada para armazenar dados.
O procedimento pode pegar dados da pilha para seu cálculo. O Exemplo 4.10 é um exemplo simples que
também detalha como o registrador BP é usado para acessar dados na pilha. Aqui, quatro palavras que
estão no segmento de dados são empurradas para a pilha pelo programa principal. O procedimento acessa
os dados usando os recursos de indexação do PB. Lembre-se que BP é um registrador associado (por
padrão) ao segmento da pilha, e que BP não pode ser usado sem um off set.
O Exemplo 4.10 calcula (A + B) ÿ (E + D) onde A, B, E e D são palavras armazenadas na memória de dados.
O resultado também deve ser salvo no segmento de dados.

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

154 OS MICROPROCESSADORES x86

.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

COMPUTADOR DE CHAMADA ;chamar o procedimento


RESULTADO DE MOVIMENTO, ;salva AX na memoria
AXE .EXIT

COMPUTAR PROC PRÓXIMO

MOV BP,SP ;copia SP para BP


MOV AX, [BP + 10] ;move o valor mais alto da pilha para AX
MOV BX, [BP + 8] ;move a próxima palavra na pilha para BX
ADICIONAR AX, BX
MOV CX, [BP + 6] ;mover a próxima palavra para CX
MOV DX, [BP + 4] ;mover a próxima palavra para DX
ADICIONAR CX, DX
SUB AX, CX
TRIBUNAL 8 ;retorna e adiciona 8 ao SP
COMPUTAR ENDP
FIM

Nota As principais características do programa são:

i) Uma pilha de 100 bytes foi definida no início.

ii) As instruções push estão no programa principal.

iii) No procedimento, o valor SP é copiado para BP.

iv) Os dados na pilha são acessados adicionando off sets ao BP.


v) A instrução de retorno é RET 8. Isso faz com que SP tenha o valor que tinha antes das quatro operações PUSH
serem executadas. Caso contrário, o que aconteceria é que cada vez que esse programa fosse executado, o
ponteiro da pilha diminuiria em 8 bytes (para as quatro operações PUSH).
Assim, o tamanho da pilha é reduzido tanto para cada chamada de procedimento que finalmente fará com
que o tamanho da pilha seja reduzido a zero, causando, assim, falha no sistema.

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 155

Pilha Pilha
Morada contente
011FH 09
UMA
011EH 87
011DH 06
B
011CH 78
011BH 0A
E
011AH 5E
0119H 00
D
0118H 34

Figura 4.5 | Operação de empilhamento para as instruções PUSH e RET 8

É 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.

Sobrefluxo e subfluxo de pilha

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.

4.3.1 | Escrevendo uma macro


Sempre que temos um conjunto de linhas de código que podemos usar com frequência, pode ser conveniente
fazer uma macro a partir dele. Uma macro tem o seguinte formato:

MACRO NOME MACRO [lista de parâmetros]


Instruções (corpo da macro)
AUTO
Machine Translated by Google

156 OS MICROPROCESSADORES x86

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.

ENTR MACRO ;a macro para inserir um caractere com eco


MOV AH, 01H
INT 21H
AUTO

Esta macro não possui parâmetros a serem passados para ela. Outra macro semelhante é para exibir um
caractere conforme mostrado abaixo.

EXIBIR MACRO ;a macro para exibir um caractere


MOV AH, 02H
INT 21H
AUTO

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

EXIBIR MACRO ;defina a macro para exibir um caractere


MOV AH, 02H
INT 21H
AUTO

ENTRA ;chama a macro ENTR


MOV DL, AL ;copia o código ASCII da chave de AL para DL
DISP ;chama a macro DISP
SAÍDA
FIM

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 157

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

MOSTRAR MENSAGEM1 ;invoca macro para exibir MESG1


MOSTRAR MESG2 ;invoca macro para exibir MESG1
.SAÍDA
FIM

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.

4.3.2 | Usando a Diretiva 'Local' em Macros


Sempre que as macros usam rótulos, elas devem ser declaradas como locais para a macro. Caso contrário,
se a mesma macro for usada muitas vezes, eles criarão erros de montagem, pois a etiqueta corresponderá
a endereços diferentes a cada vez. Assim, logo após a declaração do nome da macro, os rótulos devem ser
escritos precedidos da palavra 'LOCAL'. Qualquer número de rótulos pode ser declarado dessa maneira.
Seria uma boa idéia examinar o arquivo de lista do programa a seguir para ver como o rótulo 'AGAIN'
está sendo gerenciado.

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

158 OS MICROPROCESSADORES x86

MOV CL, N ;mover contagem para CL


MOV DL, '*' ;jogada '*' para DL
NOVAMENTE: MOV AH, 02 ;AH = 2 para exibir um caractere
INT 21H
DEC CL ;diminui a contagem
JNZ NOVAMENTE ;repete a exibição até CL = 0
AUTO ;termina a macro

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

ESTRELA 5 ;chama a macro STAR com N = 5


NOVO ;chama a macro NOVA ;chama
ESTRELA 4 a macro STAR com N = 4
NOVO
ESTRELA 3
NOVO
ESTRELA 2
NOVO
ESTRELA 1
NOVO

.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>

4.4 | Conversões de formato de número

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 159

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.

Algumas conversões úteis estão entre os seguintes formatos de números diferentes:


i) BCD empacotado para BCD desempacotado.

ii) BCD descompactado para BCD embalado.

iii) BCD descompactado para ASCII.

iv) Binário para ASCII.

v) ASCII para binário.

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.

4.4.1 | Conversão de BCD empacotado para BCD não empacotado

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

160 OS MICROPROCESSADORES x86

LEA SI, BCD ;carrega o offset do BCD no SI


LEA BX, ASC ;carrega o offset do ASC no BX
MOV CX, 4 ;contagem de bytes BCD
RPT: LIGUE BCD_TO ;chamar o procedimento de conversão
INC SIM ;ponteiro de incremento
INC BX ;ponteiro de incremento
LOOP RPT ;continua até CX = 0
;com o loop acima, a ;conversão é

;concluído e só resta a exibição


MOV CX, 08 ;contagem de bytes ASCII ;para
DEC BX apontar para o endereço do último
;dígito ASCII
STRT: MOV DL, [BX] ;move o valor ASCII para DL para exibição
MOV AH, 02 ;função para exibir um caractere
INT 21H
DEC BX ;aponta para o próximo dígito ASCII
CAMINHADA ;repete até CX = 0
.SAÍDA

BCD_TO PROC NEAR USA CX AX


MOV AL, [SI] ;move o primeiro byte BCD para AL
MOV AH, AL ;copie para AH também
AND AL, 0FH ;mascarar o nibble superior de AL
AND AH, 0F0H ;mascarar o nibble inferior de AH
MOV CL, 04 ;contagem de operações de deslocamento
SHR AH, CL ;deslocar AH 4 vezes
OR AX, 3030H ;converte AX para dois bytes ASCII
MOV [BX], AL ;mover um valor ASCII para a memória
INC BX ;BX para apontar para os próximos locais
MOV [BX], AH ;armazena o próximo dígito
CERTO

BCD_TO ENDP
FIM

A conversão de ASCII para BCD compactado é apenas o inverso de todos esses processos.

4.4.2 | Cálculos BCD


e) Adição

DAA – Ajuste decimal AL após adição.


Uso: DAA
Para BCD, nenhum dos dígitos deve ter um valor maior que 9, mas sabemos que um nibble pode
conter um valor de 0FH. Isso causa problemas quando os números BCD são adicionados. Para
resolver este problema, existe uma instrução específica DAA que significa 'Decimal Adjust Accumulator'.
Isso assume que a soma da adição de BCD está em AL.
A necessidade dessa instrução é porque a adição direta de números BCD causa erros e geralmente é
necessária uma correção. Os detalhes da correção feita são discutidos na Seção 0.7.2.
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ III 161

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

DAS – Ajuste decimal AL após a subtração.


Uso: O
Para a subtração BCD, existe uma instrução DAS, que atua sobre os dados em AL. Consulte a Seção 0.7.5
para os meandros da subtração de BCD. O DAS é usado (como o DAA) para fazer as correções necessárias.
O uso desta instrução é deixado para você.
Machine Translated by Google

162 OS MICROPROCESSADORES x86

4.5 | Operações ASCII


O processador possui várias instruções relacionadas ao processamento de números ASCII.

4.5.1 | Adição ASCII


AAA – ASCII Ajustar AL após adição
Esta instrução é usada após a adição de dois números ASCII. Ele verifica o nibble inferior de AL para uma
das duas condições:

i) se está dentro de A e F.

ii) se a bandeira de transporte auxiliar (AF) está definida.

Dependendo disso, ele realiza as correções necessárias. Veja os três casos mostrados.

Adicione '5' e '4', obtenha a soma em AL.


Caso 1
35H
34H
69H

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.

MOV AL, '5' ;AL = 35H


ADICIONAR AL, '4' ;AL = 35H + 34H = 69H
AAA ;AL = 09H
OU AL, 30H ;AL = 39H, o valor ASCII de 9

obtemos 39H em AL que é o código ASCII de 9. Também AH = 0.


Caso 2

Adicione '7' e '6', obtenha a soma em AL.

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).

MOV AL, '7' ;AL = 37H


ADICIONAR AL, '6' ;AL = 37H + 36H = 6DH
AAA ;AL = 03, AH = 01, CF = 1
OU AX, 3030H ;AX = 3133

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 163

Caso 3

Adicione '9' e '8', obtenha a soma em AL.

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.

4.5.2 | Subtração ASCII


AAS – ASCII ajusta AL após a subtração.
Uso: AAS
Esta função é semelhante à instrução AAA. Após a subtração de dois números ASCII, o AAS verifica o
nibble inferior de AL. Se este número tiver um valor entre A e F, ou se o sinalizador AF estiver definido, 6
será subtraído de AL. Também 1 é subtraído de AH e AF e CF são definidos. Em todos os casos, o nibble
superior de AL é limpo.

Caso 1
Subtraia '5' de '8'.

38H -
35H
03

Se AAS for usado após esta subtração, o conteúdo AL é 03.

Caso 2
Subtraia '8' de '5'.

35H -
38H
FDH

Após AAS, AH = FFH, AL = 07.


Na verdade, a resposta deveria ser -3, mas obtemos FF07, que é o complemento de dez -10 + 3 = 7.
Vamos subtrair '4' de '15'. Obtemos o valor ASCII de '11' no registrador AX com o seguinte programa.

MOV AX, '15' ;AX = 3135H


SUB EIXO, '4' ;AX = 3101H
AAS ;AX = 3101H
OU AX, 3030H ;AX = 3131H

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

164 OS MICROPROCESSADORES x86

4.5.3 | Multiplicação e divisão


AAM – ASCII ajusta AX após a multiplicação.
Uso: AAM
Para multiplicação e divisão de números ASCII, precisamos convertê-los para BCD descompactado. Vamos
lidar primeiro com a multiplicação ASCII. No programa a seguir, os números a serem multiplicados são 6 e
9. O produto deve ser 54. Os números ASCII são primeiro descompactados e multiplicados. Depois disso, a
instrução AAM é usada. Isso faz com que o produto esteja no formato BCD descompactado. Se o resultado
da multiplicação (MUL BL) for comparado com o resultado de AAM, é óbvio que AAM realiza a conversão
dividindo AX por 10. Em seguida, se for feito ORing com 3030H, o valor ASCII do produto está disponível
em MACHADO. No programa, esse valor é copiado para CX e exibido usando a macro DISP.

Nota O dígito mais significativo é exibido primeiro.

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

AAD – ASCII ajusta AX antes da divisão.


Uso: AAD
Esta instrução funciona convertendo o BCD descompactado em AX para binário (hex) antes da divisão.
Ele multiplica AH por 10, adiciona o produto a AL e limpa AH. Esta é a representação hexadecimal do
número BCD em AX. Após a divisão, encontramos o quociente em AL e o resto em AH.
Consulte o seguinte segmento de programa.

MOV AX, '82' ;AX = 3832H


E AX, 0F0FH ;AX = 0802H
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ III 165

AAD ;AX = 0052H, o valor hexadecimal do dividendo


MOV BL, '9' ;BL = 39H, o valor ASCII de 9
E BL, 0FH ;BL = 09H
DIV BL ;AX = 0109H, o quociente em AL, resto em AH
OU AX, 3030H ;AX = 3139H, os valores ASCII correspondentes

4.6 | Conversões para cálculos e exibição/entrada


Vimos vários formatos de números até agora, mas agora deve ser óbvio que usar números BCD e
ASCII para cálculo é complicado, especialmente quando grandes números estão envolvidos. Um
formato mais conveniente para todos os cálculos aritméticos é o formato binário, que é escrito de forma
compacta em hexadecimal. Outro ponto é que, uma vez feito o cálculo, o formato natural para exibição
é o formato ASCII. Para exibir, convertemos o número binário em BCD descompactado e depois em
ASCII. Ao inserir dados também pelo teclado, o formato de número ASCII é usado. Tudo isso implica a
necessidade de converter números binários para ASCII e vice-versa.

4.6.1 | Convertendo números ASCII para formato binário


Vamos ver como convertemos um número decimal (digamos 6754) para a forma binária.

6754 = 6 × 1000 + 7 × 100 + 5 × 10 + 4 × 1


4×1=4+
5 × 10 = 50 +
7 × 100 = 700 +
6 × 1.000 = 6.000
6754

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

166 OS MICROPROCESSADORES x86

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.

4.6.2 | Convertendo Números Binários em Forma


ASCII O método para isso é a divisão repetitiva. Isso foi feito no Exemplo 3.22 para um
número binário de 16 bits.

4.7 | Aritmética de Número Assinado


Em todas as nossas discussões e problemas, sempre que lidávamos com números, assumimos que os números não
tinham sinal. Agora, vamos trazer os números assinados também para o nosso domínio.
Os números negativos são representados no formato de complemento de dois. Quando o comprimento
dos dados é de um byte, o valor máximo de números decimais que pode representar é -128 a +127. Com 16
bits, isso é de -32.768 a +32.767. Se o resultado de qualquer operação exceder esse tamanho de palavra, o
sinalizador de estouro é definido. Isso indica que nosso resultado deve ser reinterpretado e corrigido. As
condições sob as quais a bandeira de estouro é definida podem ser indicadas como:
i) Quando há um carry de D6 para D7, ou um carry de D7 para fora, mas não ambos. Isso é para
operações de byte.
ii) Para operações de palavra, quando há um carry do bit D14 para D15, ou um carry de D15 para
fora, mas não ambos.
Vejamos alguns casos de operações com números assinados.

Exemplo 4.18
.MODELO PEQUENO

.CODE .STARTUP
MOV AL, + 34
ADICIONAR AL, - 23
.SAÍDA
FIM
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ III 167

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

Assim, a soma é 0BH (11 em decimal), que é a soma certa. CF = 1, OF = 0, SF = 0.

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

A resposta deste cálculo é 96H (ÿ106), o que está correto.


Em ambos os problemas acima, a bandeira de estouro é encontrada limpa, o que indica que o
o cálculo do número assinado produziu o resultado correto. Agora, veja o próximo programa.

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

168 OS MICROPROCESSADORES x86

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.

i) CBW – converte byte em palavra.


Esta instrução funciona nos dados em AL. Copia o bit de sinal (D7) de AL para todos os bits de AH, assim o
byte em AL é estendido para uma palavra em AX.

ii) CWD – converte palavra em palavra dupla.


Esta instrução funciona nos dados em AX. Copia o bit de sinal (D15) de AX para todos os bits de DX. Assim,
DX ÿ AX é a nova palavra dupla. Vamos agora usar essas instruções para evitar overflow no caso de
operações com números assinados.

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.

4.7.1 | Comparação de Números Assinados


A comparação de dois números sem sinal é baseada apenas em seu valor numérico, e o sinal não aparece
na imagem. Por exemplo, 7 é maior que 3 numericamente. No entanto, quando esses números são assinados,
a imagem muda. A tinta dos números -7 e -3. Dizemos agora que ÿ3 é maior que ÿ7. Com esta imagem,
usamos os termos 'acima' e 'abaixo' para números sem sinal e 'maior que' e 'menor que' para números com
sinal. Os mnemônicos usados e as bandeiras usadas também são diferentes.
No Capítulo 3, a Tabela 3.2 lista uma série de instruções de salto condicional, atendendo a operações
de números sem sinal. Agora, vamos dar uma olhada nas instruções de salto para operações de números
assinados. Consulte a Tabela 4.2.
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO ÿ III 169

Tabela 4.2 | Instruções de salto condicional atendendo a números assinados


Sim. Não. Mnemônico O que significa Condições testadas
1 É Saltar se for igual ZF = 1

2 JG Pule se maior ZF = 0 e SF = OF

3 JGE Saltar se Maior ou Igual SF = OF ou ZF = 1

4 JL Pule se menos SF! = DE

5 JLE Saltar se menor ou igual ZF = 1 ou SF!= OF

6 fã Pule se não for maior ZF = 1 ou SF!= OF

7 JNGE Pule se não for maior SF! = DE


Nem igual
8 JNL Salte se não menos SF = DE

9 JNLE Salte se não menos ZF = 0 e SF = OF


Nem igual
10 JNO Saltar se não houver estouro DE = 0

11 JO Saltar se estourar DE = 1

12 JNS Pular se não estiver assinado SF = 0

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 resultado de cada comparação do programa acima ajudará a esclarecer a confusão. i) Quando o

destino é maior que a origem, OF = SF.


ii) Quando o destino é menor que a origem, OF ! = DE.

iii) Quando o destino é igual à origem, ZF = 1.


Machine Translated by Google

170 OS MICROPROCESSADORES x86

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

4.7.2 | Multiplicação e Divisão Assinada


Existem duas instruções a serem usadas para multiplicação e divisão com sinais.

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 171

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

MOV AL, X ;copia X para AL


MOV BL, Y ;copia Y para BL
LIGUE MUITO ;chama o procedimento para multiplicar X e Y
MOV CX, AX ;copia o produto para CX
MOV AL, Z ;copia Z para AL
MOV BL, AL ;copie Z para BL também
LIGUE MUITO ;chame o procedimento para obter Z2
SUB CX, AX ;calcula XY—Z2
XCHG CX, AX ;troca CX e AX, para obter dividendo em AX
IDIV L ;divisão assinada por L
MOV QUO, AL ;copia o quociente para a memória
.SAÍDA

MUITO PERTO DO PROC ;defina o procedimento MULT


IMUL BL ;multiplica AL por BL, produto em AX
CERTO ;retorna ao programa de chamada
MUITO ENDP ;encerrar o procedimento
FIM

Neste programa, os operandos são números positivos e negativos. Façamos algumas observações.

i) Com os valores de X, Y, Z e L dados no programa, o produto é -511 (FE01H)


e o quociente é +56, que é encontrado em AL como 38H. ii)
Se o divisor agora é alterado para +9, o quociente é -56, que é encontrado em AL como C8H. iii) Se
o divisor for alterado para -3, obtemos uma mensagem de erro de estouro de divisão e a execução do
programa é encerrada. Isso ocorre porque o quociente (+ 170) é muito grande para caber em AL.
Lembre-se de que o maior número positivo que AL pode conter é apenas +127.
Machine Translated by Google

172 OS MICROPROCESSADORES x86

4.7.3 | Deslocamento aritmético

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

ii) Destino SAL, contagem – Deslocamento aritmético à esquerda.

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.

4.8 | Programação usando construções de linguagem de alto nível


O MASM tornou-se mais fácil e muito conveniente de usar desde que foi acrescentado a uma série de construções
de linguagem de alto nível. Tais construções estão disponíveis apenas para MASM 6.0 e versões superiores.
Eles são designados como 'comandos de ponto', pois são precedidos por um ponto. Essas construções fazem
do MASM um 'montador de alto nível'. Algumas dessas construções estão listadas abaixo:
i) SE, ELSEIF e ELSE … ENDIF
ii) REPETIR … ATÉ … ENDW
iii) REPETIR … ENQUANTO … ENDW
iv) QUEBRA
v) CONTINUAR
vi) REPETIR … ATÉ CXZ

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.

i) O valor do número está entre 0 e 5?


ii) O valor do número está entre 6 e 9?

iii) Uma tecla pressionada 'não é um número'?

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 173

SEGUNDO DB “O VALOR ESTÁ ENTRE 6 E 9$”


OUTRO BD “NÃO UM NÚMERO$”

.CÓDIGO
.COMECE

MOV AH, 08 ;ler na chave sem eco


INT 21H
.IF AL> = '0' && AL< = '5' ;primeira condição IF
LEA DX, PRIMEIRO ;exibe a primeira mensagem
MOV AH, 09
INT 21H
.ELSEIF AL > = '6' && AL< = '9' ;segunda condição IF
LEA DX, SECOND ;exibe a segunda mensagem
MOV AH, 09
INT 21H
.SENÃO

LEA DX, OUTROS ;ELSE ;exibe a terceira mensagem


MOV AH, 09
INT 21H
.FIM SE
.SAÍDA
FIM

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

174 OS MICROPROCESSADORES x86

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

Em seguida, faremos um programa usando o REPEAT …. ENQUANTO construir. O Exemplo 4.26


mostra como a instrução WHILE é usada para repetir a execução de um loop enquanto uma condição é
satisfeita e para sair do loop quando a condição não é mais válida.
Enquanto CX não for igual a zero, o loop se repete. O final do loop é especificado com uma
construção .ENDW. Neste programa, uma string consistindo de todas as letras do alfabeto, armazenadas no
local a partir de DAT, deve ser invertida e exibida. Depois que a string invertida é armazenada no local DAT1
em diante, ela é anexada com um '$' para que possa ser exibida com a função INT 21H número 9. A
mensagem REVERSED STRING: é exibida antes da string invertida ser exibida.

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

CONCEITOS DE PROGRAMAÇÃO ÿ III 175

MOV AH,09
INT 21H
.SAÍDA
FIM

A saída do programa acima é mostrada abaixo.

STRING INVERTIDA: ZYXWVUTSRQPONMLKJIHGFEDCBA


C:\masm6.14\BIN>

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

176 OS MICROPROCESSADORES x86

.SE (AL == BL) ;comparar com referência


INC CL ;se combinar, incrementa CL
.FIM SE ;fim do loop IF ;sai
.ATÉ AL == 0DH quando 'enter' é pressionado
ADICIONAR CL, 30H ;converter para ASCII
MOV DX, OFFSET MES3 ;endereço do local MES3
MOV AH, 09
INT 21H ;exibe mensagem
MOV DL, CL ;mover contagem para DL
MOV AH, 06 ;exibe a contagem
INT 21H
.SAÍDA
FIM

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.

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| O prefixo REP condicional/incondicional é usado para operações de string repetitivas.

| 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.

| A aritmética numérica com sinal envolve o uso de instruções especiais.

| A bandeira de estouro é muito importante em operações assinadas.

| 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

CONCEITOS DE PROGRAMAÇÃO ÿ III 177

PERGUNTAS

1. Qual é o papel da bandeira de direção nas instruções de string?

2. Qual a diferença no funcionamento das instruções STD e CLD?

3. Como funciona a instrução CLD no caso das duas instruções a seguir?


a) REPMOVSB b)
REP MOVSW

4. Qual é o registrador de ponteiro a ser usado ao usar o segmento extra em operações de string?

5. Por que a instrução LODS não usa o prefixo REP?

6. As instruções a seguir funcionam de maneira diferente? De que maneira? a) REPNE


CMPSB b) REPE CMPSB

7. Para REPNZ CMPSB, quais são as condições sob as quais o loop é encerrado?

8. Distinga entre uma chamada próxima e uma distante.

9. Qual a diferença no funcionamento das instruções RET e RET n?

10. O que significa o termo 'passagem de parâmetros' no contexto de procedimentos?

11. Qual é o benefício de usar macros?

12. Compare procedimentos e macros.

13. Como são tratadas as variáveis locais em uma macro?

14. O que é um argumento fictício?

15. Explique como funciona a instrução DAA.

16. Explique a ação das seguintes instruções: a) AAM b) AAS c)


AAD d) AAM

17. Anote as etapas necessárias para as seguintes conversões:


a) binário para ASCII, b)
ASCII para binário.

18. Quando a instrução CWD é usada?

19. É justificável chamar a MASM de montadora de alto nível?

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.

2. Escreva um programa para escanear o nome SAHABUDDIN e substitua S por B e B por H.

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.

5. Escreva um programa para procurar uma palavra em um bloco de N palavras.


Machine Translated by Google

178 OS MICROPROCESSADORES x86

6. Escreva um programa que contenha as seguintes macros:


a) para calcular a série de Fibonacci para N,
b) para inserir o valor de N,
c) para exibir os números.

7. Faça o problema acima usando procedimentos.

8. Exiba o fatorial de três números. Resolva o problema usando macros, bem como procedimentos.

9. Obtenha o arquivo de listagem do programa acima em ambos os casos e observe as diferenças.

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.

12. Escreva um programa onde sejam usadas macros aninhadas.

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.

18. Divida '3476' por '5'. Exiba o quociente sozinho.

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

Neste capítulo, você aprenderá


| A diferença entre E/S periférica e E/S mapeada na | Para escrever programas em diferentes módulos e
memória. vinculá-los.

| 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.

5.1 | Programação de entrada/saída


Existem muitos dispositivos de E/S conectados ao processador, usando os quais, os dados são recebidos (dispositivo de
entrada) ou dados são fornecidos (dispositivo de saída). Assim, no processamento de E/S, surge o conceito de porta que
significa um registro ou área de armazenamento de dados, de/para o qual os dados são transferidos para o processador.
Assim, um dispositivo de E/S é frequentemente chamado de 'porta' com um endereço associado. Qualquer dispositivo de
E/S tem um endereço único, conhecido como 'endereço de porta' ou simplesmente mencionado como 'porta'.
Agora veja a Figura 5.1 que mostra um dispositivo de entrada e saída conectado ao processador através do
endereço e barramento de dados e um pino de controle. Assim, quando seu endereço é colocado no barramento de
endereços e o sinal WR é ativado, os dados do processador são escritos na porta de saída. Da mesma forma, os dados
da porta de entrada são lidos no processador quando a porta de entrada é endereçada e o sinal RD é ativado. Existem
dois esquemas para conectar um dispositivo de E/S ao processador.

Imagem de abertura do capítulo: Um chip de buffer.


Machine Translated by Google

180 OS MICROPROCESSADORES x86

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

5.1.1 | E/S mapeada na memória


Neste esquema, o dispositivo de E/S tem o mesmo espaço de endereçamento e esquema de endereçamento que a memória.
Por exemplo, dada a instrução MOV AL, [3456H], o endereço 3456H pode ser um local de memória ou o
endereço de um dispositivo de E/S. Isso significa que, se houver 50 dispositivos de E/S em um sistema, o
espaço de endereçamento disponível para a memória será reduzido em 50. No entanto, isso também
significa que a E/S não precisa de nenhuma instrução especial para acesso, e também que os dados de/
para E/S pode ser transferido para qualquer registrador de uso geral do processador. Este tipo de
abordagem é usado para alguns processadores RISC onde a ideia é reduzir o número de instruções. Isso
também implica que não há necessidade de sinais extras de controle de hardware para diferenciar entre E/S e memó

5.1.2 | E/S periférica ou isolada


Este esquema é algumas vezes referido como 'E/S mapeada de E/S' também. Aqui, existem instruções
especiais que atendem aos dispositivos de entrada e saída, e o espaço de endereço é separado e
separado do espaço de endereço da memória. Assim, para 8086, os 220 endereços completos estão
disponíveis como endereços de memória. Se houver 50 portas em um sistema, haverá 50 endereços de E/
S. Como a E/S não utiliza a instrução MOV, não haverá conflito entre os acessos à memória e E/S. No
entanto, são necessários sinais de controle extras neste caso. Os aspectos de hardware de E/S e sua
conexão com o processador serão discutidos no Capítulo 7. Trataremos apenas do esquema de E/S
Periférica aqui, pois esse é o esquema mais comumente usado para sistemas baseados em 8086.

5.2 | Instruções de E/S


O 8086 possui duas instruções para comunicação com E/S.

e) EM
Uso: IN acumulador, porta
Machine Translated by Google

CONCEITOS DE PROGRAMAÇÃO - IV 181

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.

5.2.1 | Endereçamento de porta fixa


Th é usado apenas quando o endereço de um dispositivo de E/S tem 8 bits de largura. Aqui o endereço da
porta é mencionado diretamente na instrução. Observe que os dados podem ter 8 bits ou 16 bits, dependendo da
largura do barramento de dados do dispositivo de E/S.

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

5.2.2 | Endereçamento de porta variável


Th é usado quando a porta endereçada tem um endereço de 16 bits. Aqui, o endereço da porta deve ser carregado
no DX e somente a instrução de E/S pode ser usada. Somente o registrador DX pode ser usado para isso. Por
exemplo, se o endereço de um dispositivo de entrada for 9876H, as etapas são:

MOV DX, 9876H ;carrega o endereço da porta no DX


EM AL, DX ;move dados de 8 bits para AL de uma porta de
entrada cujo endereço está em DX

De forma similar,

MOV DX, 0FC6H ;carrega o endereço de 16 bits da porta no DX


SAÍDA DX, AX ;move dados de 16 bits do AX para a porta de saída
cujo endereço está em DX
Machine Translated by Google

182 OS MICROPROCESSADORES x86

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

EM EIXO, 67H ;chega ao AX, dados de 16 bits da porta de entrada 67H


E AX, 0FFFH ;mascarar a mordida superior
OUT 0FEH, AX ;envia o conteúdo do AX para a porta de saída FEH

O programa completo também pode ser escrito usando a diretiva EQU.

.MODELO PEQUENO
.CÓDIGO

TRANSPORTADOR EQU 67H ;usar rótulos para números de porta


PORTB EQU 0FEH
.COMECE
EM MACHADO, PORTA
E AX, 0FFFH
PORTA DE SAÍDA, AX
.SAÍDA
FIM

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

CONCEITOS DE PROGRAMAÇÃO - IV 183

ASSIMILAR: MOV TMPS[BX], AL ;transferir dados para a memória


INC DX ;incrementa o endereço da porta
INC BX ;incrementa ponteiro de endereço de memória
LOOP TAKE_IN ;repete até CX = 0
MOVIMENTO AH, MAX ;copia a temperatura máxima para AH.
MOV DX, 0200H ;pega o endereço da primeira porta o/p
MOV AL, 01 ;pega dados para alarme, em AL
MOV CX, 20 ;CX = contagem
MOV BX, 0 ;BX = 0
NOVAMENTE: CMP TMPS[BX], AH ;compara dados na memória com MAX
EU ALARME ;se dados>MAX, vai para ALARM
OUTRO: INC DX ;incrementa o endereço da porta
INC BX ;incrementa ponteiro de endereço
LOOP NOVAMENTE ;repete até CX = 0
JMP EXEET ;saltar para o ponto de saída
ALARME: OUT DX, AL ;envia dados de alarme para a porta o/p
JMP OUTRO
SAÍDA:
.SAÍDA
FIM

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.

5.3 | Programação Modular


Quando um grande problema de programação deve ser tratado, é bastante lógico pensar em dividi-lo em módulos,
testando os módulos individuais separadamente e, em seguida, integrando os módulos juntos para formar a
solução completa. Também pode ser que um problema simples possa ser resolvido facilmente usando módulos
de programa que já foram escritos e testados. Outro cenário seria quando várias equipes trabalham em diferentes
módulos do mesmo problema e finalmente integram tudo para uma solução final e completa. Tudo isso indica a
importância do que chamaríamos de 'programação modular'.

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

184 OS MICROPROCESSADORES x86

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

também pode ser declarado como


PÚBLICO número1
PÚBLICO número2
PÚBLICO número 3

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 nome1:tipo EXTRN ;um nome de item sozinho é declarado


nome1:tipo, nome2:tipo Por exemplo, ;muitos nomes de itens são declarados juntos

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

CONCEITOS DE PROGRAMAÇÃO - IV 185

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

.MODELO GRANDE ;definir modelo grande


.DADOS
SOMA DB? ;atribui espaço para soma
EXTRN DATA1: BYTE ;DATA1 definido em outro módulo
EXTRN DATA2: BYTE ;DATA2 definido em outro módulo
.CÓDIGO
COLHEITA EXTERNA: DISTANTE ;o procedimento em outro segmento
.COMECE
LIGUE PARA COLHER ;chamar o procedimento externo
MOV AL, DATA1 ;obtém dados externos DATA1 para AL
ADD AL, DATA2 ;adiciona AL com dados externos DATA2
MOV SUM, AL .EXIT ;soma armazenada no segmento de dados

FIM

MODB.ASM

.MODELO GRANDE ;definir modelo grande


.DADOS
DADOS PÚBLICOS1 ;declara que DATA1 é PÚBLICO
DADOS PÚBLICOS 2 ;declara que DATA2 é PÚBLICO
DATA1 DB ? ;defina DATA1
DATA2 DB 26H ;defina DATA2
.CÓDIGO
COLHER PÚBLICO
.COMECE
COLHER PROC LONGE ;defina o procedimento REAP
MOV AH, 01 ;para inserir caractere
INT 21H ;através do teclado
SUB AL, 30H ;converte ASCII para binário
MOV DATA1, AL ;armazena no segmento de dados
CERTO ;Retorna
COLHER ENDP ;encerrar o procedimento
.SAÍDA
FIM

Os módulos podem ser montados e vinculados usando ml.exe. O comando é


ml arquivo nome1.asm arquivo nome2.asm arquivo arquivo3.asm …
Machine Translated by Google

186 OS MICROPROCESSADORES x86

Veja a saída na janela de comando correspondente ao comando

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

Linker executável segmentado da Microsoft (R) Versão 5.60.339 5 de dezembro de 1994


Direitos autorais (C) Microsoft Corp 1984–1993. Todos os direitos reservados.

Módulos de objetos [.obj]: moda.obj+


Módulos de objetos [.obj]: “modb.obj”
Execute o arquivo [modul1a.exe]: “moda.exe”
Listar arquivo [nul.map]: NUL
Bibliotecas [.lib]:
Arquivo de definições [nul.def ]:
LINK: aviso L4021: nenhum segmento de pilha

C:\MASM6~1.14N\BIN>

Os arquivos de lista de ambos os módulos podem ser obtidos pelo comando

ml/Fl moda.asm modb.asm.

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

CONCEITOS DE PROGRAMAÇÃO - IV 187

EXTRN PW1:BYTE ;PW1 está definido em outro módulo


EXTRN PW2:BYTE ;PW2 está definido em outro módulo
.CÓDIGO
EXTRN LER: FAR ;READ está definido em outro módulo
.COMECE
MOV AX, DS ;copia DS para AX
MOVE ES, AX ;copia AX para ES
LEA SI, PW1 ;deixe SI apontar para PW1
LEA DI, PW2 ;deixe DI apontar para PW2
MOV CX, 6 ;CX = 6, o número de caracteres
COMEÇAR: CHAMADA DE LEITURA ;chamar procedimento para inserir PW2
CLD ;limpar DF
REPE CMPSB ;repete a comparação até CX = 0
JCXZ CORRETO ;se CX =0,vai para exibir a mensagem
MOV DX, OFFSET MES1 ;aponta DX para MES1
MOV AH, 09 ;número da função para exibição
INT 21H
JMP EXEET
CORRETO: MOV DX, OFFSET MES2 ;aponte DX para MES2
MOV AH, 09
INT 21H
SAÍDA:
.SAÍDA
FIM

Exemplo 5.5b

.MODEL HUGE ;use um modelo enorme


.DADOS
PÚBLICO PW1 ;declara PW1 como público
PÚBLICO PW2 ;declara PW2 como público
PW1 DB 'SAMSON' ;defina PW1
PW2 DB 6 DUP(0) ;alocar espaço para PW2

.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

188 OS MICROPROCESSADORES x86

LEIA FINAL ;entrar no procedimento


.SAÍDA
FIM

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.

5.3.3 | Módulos usados com frequência

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

CONCEITOS DE PROGRAMAÇÃO - IV 189

.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.

5.4 | Programando em C com Módulos Assembly


Discutimos no Capítulo 0 a importância e as vantagens da programação em linguagem assembly em
comparação com a programação em linguagem de alto nível. No entanto, encontramos linguagens de alto
nível sendo usadas com mais frequência, por serem portáteis e independentes de plataforma (geralmente,
mas nem sempre). No entanto, devido à eficiência da linguagem assembly, há vantagens quando ambas
são usadas de forma mista. C é uma linguagem muito popular e nesta seção, usaremos módulos de
linguagem assembly dentro de programas C. Isso é chamado de 'assembly inline' e a maioria dos recursos
(mas não todos) da linguagem assembly pode ser usada aqui. Dependendo da versão de C usada, as
construções dentro do módulo assembly podem variar. Usaremos o Turbo C++ da Borland
compilador aqui. Para entender bem os programas, você precisa ter alguma experiência em C/C++
programação. É melhor usar letras minúsculas para escrever o código, para que não haja conflito com algumas
das palavras reservadas de C que estão em maiúsculas.
Os exemplos a seguir 5.7ae 5.7b usam o shell C++ com um módulo assembly inserido entre
parênteses. Observe a forma como o módulo assembly está escrito. Começa com asm {. O colchete de
abertura '{' deve estar na mesma linha que a palavra asm. Este módulo de montagem simplesmente
obtém um caractere do teclado com eco. Em seguida, ele usa caracteres de retorno de carro e de nova
linha para ir para a próxima linha. Na próxima linha, o caractere inserido é exibido. Assim, o mesmo
caractere é exibido em duas linhas consecutivas.
Machine Translated by Google

190 OS MICROPROCESSADORES x86

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

CONCEITOS DE PROGRAMAÇÃO - IV 191

asm mov dl, cl ;exibe o caractere que foi preservado em cl


asm mov ah, 02
asm int 21h
}
obter();
retornar 0;
}

Em todos os programas aqui, a tela é limpa com a função clrscr().


Os registradores de rascunho (A, B, C e D) geralmente não são usados diretamente pelo compilador C.
No entanto, os outros registradores podem estar em uso e, portanto, seria seguro empurrá-los na pilha (e pop-
los posteriormente) antes de iniciar a execução do módulo assembly.
Agora, vejamos outro programa que define dois caracteres 'a' e 'b'. Um caractere (char) define um número
de 8 bits e, portanto, no módulo assembly, pode ser carregado em um registrador de 8 bits. Neste programa,
quando dois números de um dígito são inseridos pelo teclado, a soma é exibida. Por exemplo, para os números
4 e 5, a exibição é 4 + 5 = 09. Para os números 7 e 8, será 7 + 8 = 15.

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

192 OS MICROPROCESSADORES x86

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; }

;parte para exibição

O próximo programa mostra como uma sequência de caracteres é exibida.

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

CONCEITOS DE PROGRAMAÇÃO - IV 193

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| Existem dois tipos de endereçamento de E/S – porta fixa e porta variável.

| 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.

| A programação modular é muito útil quando é necessário utilizar o serviço de


módulos.

| Na programação modular, a diretiva PUBLIC indica que o referido item de dado ou procedimento é acessível a outros módulos.

| A diretiva EXTRN mostra que o referido item está em outro módulo.

| O montador embutido é usado para inserir sequências de montagem em um shell CC++ .

PERGUNTAS

1. Diferencie entre E/S mapeada na memória e E/S isolada.

2. O que se entende por endereçamento de porta fixa?

3. Por que são usados chips de interface entre o processador e os periféricos?

4. Por que a programação modular é importante?

5. Como um item de dados pode ficar visível para outros módulos?

6. Qual é a relação entre as diretivas EXTRN e PUBLIC?

7. Como vinculamos dois módulos usando MASM?

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

194 OS MICROPROCESSADORES x86

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.

7. Use as instruções de montagem no shell C para os seguintes programas:


a) Digite dois dígitos através do teclado e adicione-os. Se a soma for maior que 10, emita uma mensagem
indicando isso, caso contrário, exiba a soma. Os programas de exibição e entrada devem usar instruções
de montagem enquanto a comparação (se esquema) usa programação C.
b) Digite um número de dígitos através do teclado. Encontre a soma e exiba a soma.
c) Digite um número de seis dígitos através do teclado. Exiba-o. Em seguida, exiba-o invertido.
Machine Translated by Google

o hardware
6 estrutura de 8086

Neste capítulo, você aprenderá


| As diferenças entre 8086 e 8088. | A razão para usar o IC do controlador de barramento em
| As funções do pino 8086 nos modos mínimo e máximo. um sistema de modo máximo.
| Como um 8086 é usado no modo máximo.
| O uso de travas de endereço e buffers de dados em um | Para calcular o tempo de instrução e, assim, criar loops
sistema baseado em 8086. de atraso.
| O conceito de ciclos de máquina e os tempos de
barramento associados 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.

6.1 | Configuração de pinos


Tentaremos entender o processador em termos de seu hardware, que inclui a configuração dos pinos, funções dos pinos, ciclos do
barramento de memória, conexões com outros chips, modos de operação e assim por diante. Foi mencionado no Capítulo 0 que o
primeiro PC foi construído com o processador 8088. Este processador é em muitos aspectos muito semelhante ao 8086. A seguir
estão as pequenas diferenças:

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 .

iv) O pino nº 34 é SSO para 8088, enquanto é BHE/ S7 para 8086.

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

Imagem de abertura do capítulo: um chip de trava.


Machine Translated by Google

196 OS MICROPROCESSADORES x86

MIN MÁX. MÁX. MIN


MODO MODO MODO MODO

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

AD3 13 28 I0/M (S2) AD3 13 28 S2 (M/I0)


AD2 14 27 DT/R (S1) AD2 14 27 S1 (DT/R)
AD1 15 26 A (S0) AD1 15 26 S0 (A)
AD0 16 25 MAS (QS0) AD0 16 25 QS0 (MAS)

NMI 17 24 ENQUANTO (QS1) NMI 17 24 QS1 (quantos)

TESTE DENTRO 18 23 TESTE


DENTRO 18 23
CLK PRONTO CLK 19 22 PRONTO
19 22
GND 20 21 REDEFINIR
GND 20 21 REDEFINIR

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.

6.1.1 | Pinos de Modo Mínimo


Vamos discutir a operação de modo mínimo de 8086. Na Fig 6.1b, os pinos 24 a 31 são vistos
como tendo funções duplas. As funções entre parênteses indicam a designação dos pinos no
modo mínimo, para esses pinos. O chip com designações de pino de modo mínimo é redesenhado na Fig 6
Para operação no modo mínimo, pino no. 33 MN / MX deve estar em nível lógico alto. Foi mencionado anteriormente que
o 8086 possui um barramento de dados de 16 bits e um barramento de endereços de 20 bits. Vamos localizar os pinos de

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

A ESTRUTURA DE HARDWARE DE 8086 197

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

Figura 6.2 | 8086 pinos no modo mínimo

6.1.2 | Desmultiplexando o endereço/barramento de dados


Vamos supor que a memória deve ser lida ou gravada. Relembre a sequência de passos para leitura e
escrita da memória (Seção 0.7). O primeiro passo na (digamos) leitura de memória é 'colocar o endereço no
barramento de endereço'. Esta é, na prática, a primeira parte do ciclo do ônibus. Em seguida, os dados
devem aparecer no barramento de dados, o que significa que o barramento deve ser liberado para transportar dados.
Para desmultiplexação, durante o tempo em que o endereço está no barramento de endereço/dados, ele é
travado em um 'latch IC' cujo clock é o sinal ALE (Address Latch Enable) fornecido pelo 8086. O sinal ALE
fica alto e funciona como um relógio para um latch que é usado para salvar os valores de endereço, porque
o endereço deve estar disponível durante todo o ciclo do barramento. Uma vez que o endereço está preso
nas travas, ele pode ser removido das linhas AD, e essas linhas ficam livres para transportar dados.
No entanto, isso representa apenas 16 linhas de endereço. 8086 tem um endereço de 20 bits. No
diagrama de pinos, os pinos de 35 a 38 também atendem ao endereço, e possuem as designações A16 a A19.
No entanto, eles também são multiplexados com sinais de status e também precisam ser desmultiplexados.
Além destes, há mais um pino que carrega informações de endereço, que é a linha baixa ativa BHE (Bus
A 7.
High Enable), que é multiplexada pelo sinal de status S7 . este sinal é explicado no Capítulo função decom
Agora,
todas essas informações incluídas, o diagrama de blocos de desmultiplexação de endereço/dados é
mostrado na Fig 6.3.

6.1.3 | Funções do pino de modo mínimo


Agora vamos conhecer as funções de cada um dos pinos do 8086. A Tabela 6.1 lista os números dos pinos,
designações dos pinos e funções dos pinos, no modo mínimo.
Machine Translated by Google

198 OS MICROPROCESSADORES x86

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

Figura 6.3 | Diagrama de blocos do endereço de multiplexação/barramento de dados

Tabela 6.1 | Funções do pino de modo mínimo


Número do pino Designação Função Modelo

16 a 2, 39 AD0–AD14, 16 linhas de endereço/dados multiplexadas que Bidirecional


AD15 carregam o endereço quando o ALE é alto e,
posteriormente, funciona como linhas de dados

D0–D15, quando o ALE é baixo

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

32 RD Quando este sinal é baixo, os dados podem ser Resultado


recebidos da memória ou dispositivos de entrada

29 WR Quando este sinal está baixo, é uma indicação de que Resultado


os dados nas linhas de dados estão disponíveis para

escrita na memória ou saída para dispositivos de saída

(contínuo )
Machine Translated by Google

A ESTRUTURA DE HARDWARE DE 8086 199

Tabela 6.1 | (contínuo)


Número do pino Designação Função Modelo

19 CLK Este é o pino do relógio ao qual um relógio com pelo Entrada

menos 33% de ciclo de trabalho deve ser fornecido

21 REDEFINIR Este é um sinal ativo alto que sinaliza ao Entrada

microprocessador para se redefinir desde que o pino


seja mantido alto por pelo menos 4 períodos de clock

22 PRONTO Para que o ciclo de barramento prossiga normalmente, Entrada


o pino READY deve estar em nível lógico alto quando
for amostrado. Se estiver em nível lógico baixo, os
estados WAIT são inseridos no ciclo de barramento
atual. Este pino é usado geralmente quando um

23 TESTE coprocessador aritmético está no sistema. Este pino é Entrada


testado pela instrução WAIT. Se o pino estiver no zero
lógico, a instrução 'WAIT' se torna uma instrução NOP.
Caso contrário, o processador espera até que este
pino se torne o zero lógico

25 MAS 'Address Latch Enable' – este sinal fica alto no Resultado


início de um ciclo de barramento e indica que o
barramento de endereço multiplexado contém informações
de endereço

26 A 'Data Enable' – Este sinal baixo ativo funciona Resultado


como um sinal de ativação para os buffers de
barramento de dados externos

27 DT/R 'Data Transmit / Receive' – O valor lógico deste Resultado


sinal indica se os dados são recebidos (em um ciclo
de leitura DT / R = 0) ou transmitidos (em um ciclo
de escrita DT / R = 1). Assim, ele é usado como um pino
de direção para buffers de barramento de dados externos

Para acesso de E/S este pino é baixo, e para acesso à

28 MINHA memória, é alto Este é um sinal de um periférico Resultado


solicitando acesso direto à memória (DMA). Se o sinal

31 AGUARDE for alto, o processador emite um sinal Hold Acknowledge Entrada

e tri-state seus dados, endereço e barramento de controle

30 HLDA 'Hold Acknowledge' indica a confirmação da Resultado


solicitação HOLD

(contínuo )
Machine Translated by Google

200 OS MICROPROCESSADORES x86

Tabela 6.1 | (contínuo)


Número do pino Designação Função Modelo

33 MN / MX Este pino é usado para selecionar o modo de Entrada


operação – mínimo ou máximo. Para o modo mínimo,
o pino deve ser conectado à alimentação de 5 V

34 BHE / S7 O 'Bus High Enable' é um sinal lógico baixo que é Resultado


usado para habilitar o 'banco de memória alto' do

barramento de dados – as linhas D8 – D15 tornam-se


ativas então. O status desse pino é travado junto com as
informações de endereço.

Isso é multiplexado com o pino de status S7 , que é


sempre 1

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

40 VCC A fonte de alimentação deve ser + 5V + /ÿ10% —

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

17 NMI Solicitação de interrupção não mascarável que é Entrada

colocada por um dispositivo externo - semelhante ao


INTR, mas o Interrupt Flag (IF) não precisa ser definido
para que seja atendido. É um

interrupção de alta prioridade

6.1.4 | O endereço/barramento de dados desmultiplexado

6.1.4.1 | O barramento de endereços

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

A ESTRUTURA DE HARDWARE DE 8086 201

1D G 1T
2D 2º trimestre

3D 3T
4D 4T
74LS373
5D 5T
6D 6T
7D 7º trimestre

8D CO 8º trimestre

Figura 6.4 | Diagrama de pinos da trava octal IC 74LS373

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.

6.1.4.2 | O barramento de dados

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.

6.1.5 | Sinais de controle para leitura e gravação

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

202 OS MICROPROCESSADORES x86

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

MAS G'373 CO G '373 CO

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

Figura 6.5 | O barramento de endereços em buffer e desmultiplexado


Machine Translated by Google

A ESTRUTURA DE HARDWARE DE 8086 203

A1 G B1

A2 B2

A3 B3

A4 B4
74LS245
A5 B5

A6 B6

A7 B7

A8 B8
VOCÊS

Figura 6.6 | Diagrama de pinos do buffer bidirecional octal tri-state 74LS245

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.

6.1.6 | Memória e E/S


Os sinais RD, WR e M/ IO devem ser utilizados adequadamente para obter os sinais de leitura/escrita de memória MEMRD e
MEMWR e os sinais de leitura/escrita de E/S IORD e IOWR. Veja o diagrama de circuito na Fig 6.8. Com isso, E/S e memória
possuem linhas separadas para acesso. A geração desses sinais de controle pode ser feita com qualquer porta lógica.

6.1.7 | Geração de Relógio


Foi enfatizado que todas as atividades dentro de um processador são sincronizadas com um relógio. Um relógio é um sinal de
onda quadrada de frequência fixa. Todos os tempos das atividades realizadas pelo processador são calculados com base
nesse período de clock. Um ciclo do relógio é chamado de estado T, e todos os tempos e atrasos são múltiplos da duração
desse estado T.
Assim, é óbvio que o 8086 tem que ter um sinal de clock. Não há circuitos dentro do processador para isso e, portanto,
um CI gerador de clock externo é usado. A Intel forneceu o gerador de clock IC 8284A que é compatível com 8086 / 8088.
Este gera um clock de frequência dependendo do cristal conectado entre dois de seus terminais. A frequência do cristal deve
ser três vezes a frequência desejada para o microprocessador. 8086 opera em frequências de 5 a 15 MHz; dependendo do
requisito, o cristal apropriado pode ser usado. A saída CLK gera um ciclo de trabalho de 33% projetado para acionar o
processador 8086 diretamente. O diagrama de pinos do CI gerador de clock é dado na Fig 6.9.

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

204 OS MICROPROCESSADORES x86

Ônibus

MINHA 1A1 74LS244


1Y1 MINHA
1A2 1Y2 RD Controle
buffer
em

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

Figura 6.7 | Barramento de dados com buffer e pinos de controle

RD

IORD

MEMRD

M/I0

MEMBRO

WR IOWR

Figura 6.8 | Geração de memória e sinais de leitura/gravação de E/S


Machine Translated by Google

A ESTRUTURA DE HARDWARE DE 8086 205

CSYNC 1 18 VCC

PCLK 2 17 X1

AEN1 3 16 X2

4 15 ASYNC
RDY1

PRONTO 5 8284A 14 EFI

RDY2 6 13 F/C

7 12 OSC
AEN2

CLK 8 11 RES

GND 9 10 REDEFINIR

Figura 6.9 | Configuração de pinos do gerador de clock 8284A

X1 X2

8284A
PRONTO
RDY

REDEFINIR

RES

CLK

CLK
REDEFINIR

PRONTO

8086

Figura 6.10 | Conexões do IC do gerador de clock para 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

206 OS MICROPROCESSADORES x86

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.

6.1.10 | Power on Reset Quando

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

Figura 6.11 | Circuito 'Power on reset'


Machine Translated by Google

A ESTRUTURA DE HARDWARE DE 8086 207

5V

VC

VH

REDEFINIR

PULSO

t=4T

Figura 6.12 | Carregamento do capacitor e geração de pulso de reset

8284 Gerador de Relógio

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

208 OS MICROPROCESSADORES x86

6.2 | Relógio Foi

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

ii) Gravação na 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

ii) Gravação de Memória

iii) Leitura de E/S

iv) E/S Escrita

Há também o 'Ciclo de máquina de reconhecimento de interrupção', mas isso será discutido no Capítulo 8.

6.2.1 | Ciclo de leitura da máquina Na

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.

iv) Transfira os dados do barramento de dados para o processador.

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

A ESTRUTURA DE HARDWARE DE 8086 209

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

Figura 6.14 | Leia o diagrama de temporização do ciclo da máquina

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

210 OS MICROPROCESSADORES x86

6.2.2 | Ciclos de espera


Se o tempo de acesso para um dispositivo for maior do que o permitido pela temporização 8086, ciclos de
clock extras denominados 'estados de espera' devem ser inseridos no ciclo de barramento. Th é aplicável
para leitura e escrita. O arranjo para isso é amostrar a linha READY no final de T2 . Se o
O sinal READY é encontrado baixo, um estado T extra é inserido no ciclo do barramento, entre T3 e T4 ,
que édedesignado como
espera extra TW.No
(TW). Todos
meioos
desinais
TW , no barramento
mais uma vez opermanecem
sinal READYinalterados durante
é verificado. este na
Se estiver estado
lógica
1, o próximo estado T será T4 – caso contrário,
deoutro
barramento
estado de
podem
espera
serTW
alongados
será inserido.
para acomodar
Assim, os ciclos
dispositivos mais lentos nos sistemas. Nesses casos, um 'gerador de estado de espera' é conectado ao
pino READY do gerador de clock para controlar o pino READY. Consulte o manual da Intel no Apêndice A
para obter um diagrama de temporização mais detalhado de READ com os valores de tempo exatos
fornecidos.

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

Figura 6.15 | Amostragem do sinal READY e inserção de estados de espera

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

A ESTRUTURA DE HARDWARE DE 8086 211

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

O período de um microprocessador de 12 MHz é T = 1 / f = 83 ns.


Assim, a duração do ciclo de ônibus, sem nenhum estado de espera, é dada por; Ciclo Tbus

= 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.

6.2.3 | Ciclo da máquina de gravação

As etapas em um ciclo de máquina de gravação são (consulte a Seção 0.2.5):

i) Colocar no barramento de endereços, o endereço do local onde os dados devem ser gravados.

ii) No barramento de dados, coloque os dados a serem escritos.

iii) Confirme o sinal de controle de gravação que faz parte do barramento de controle.

iv) Aguarde até que os dados sejam armazenados no local endereçado.

v) Desative o sinal de escrita na memória. Isso encerra a operação de gravação na memória.

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.

6.3 | Outras atividades do processador


6.3.1 | Linhas de interrupção

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

Figura 6.17 | Tempo de ciclo da máquina de gravação simplificado


Machine Translated by Google

212 OS MICROPROCESSADORES x86

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

Figura 6.18 | Conceito de acesso direto à memória


Machine Translated by Google

A ESTRUTURA DE HARDWARE DE 8086 213

DMA
T4 ou T1
Ciclos

CLK

AGUARDE

HLDA

Execução Aguarde Execução


Estado Currículos
Suspenso

Figura 6.19 | Tempo dos sinais HOLD e 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.

6.3.4 | Habilitação alta do barramento (BHE)

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.

6.3.5 | Parar o ciclo da máquina

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

214 OS MICROPROCESSADORES x86

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

Figura 6.20 | 8086 na configuração do modo mínimo

6.4 | Modo Máximo


Agora vamos discutir os pinos de modo máximo. É necessário usar o modo máximo se o processador
for usado em configurações de multiprocessador. As questões mais importantes em um ambiente
multiprocessador são a comunicação entre processadores e a contenção de barramento. Nesse modo,
o 8086 possui pinos especiais para resolver esses problemas. Para usar o modo máximo, o pino nº 33
MN/ MX deve ser conectado ao terra. Então, pinos nos. 24 a 31 têm designações diferentes do que
vimos no modo mínimo. Consulte a Figura 6.21. Neste modo, algumas das funções de controle mais
importantes não são obtidas do processador, mas terão que ser geradas a partir de um chip externo
chamado controlador de barramento. As funções de, INTA
M / IO, ALE, DTdevem
, e WR /R ser gerados externamente.
Este modo de operação foi projetado pela Intel para permitir que o 8086 se comunique com outros
processadores como o coprocessador aritmético (8087) e o processador de entrada/saída 8089.
Ele também foi usado para permitir que o 8086 fosse usado em grandes sistemas multiprocessadores fracamente
acoplados. Este modo foi retirado dos designs da Intel de 80286 em diante. Processadores posteriores (80486 em
diante) tinham o coprocessador aritmético integrado no próprio chip do processador.
Agora, vamos ver como os sinais perdidos do processador são gerados pelo controlador de barramento. O
controlador de barramento 8288 foi projetado pela Intel para ser compatível com o 8086.

6.4.1 | Controlador de barramento

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 ESTRUTURA DE HARDWARE DE 8086 215

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

Figura 6.21 | Pinos de modo máximo de 8086

Tabela 6.2 | Sinais de controle gerados pelo controlador de barramento

Sinais de status Ciclo da máquina Sinal de controle


gerado por 8288

S2 S1 S0

0 0 0 Interromper reconhecimento ENQUANTO

0 0 1 E/S ler IORC

0 1 0 E/S escrever IOWC

0 1 1 Parar NENHUM

1 0 0 Busca de instruções MRDC

1 0 1 Memória lida MRDC

1 1 0 Gravação de memória MWTC

1 1 1 Inativo NENHUM
Machine Translated by Google

216 OS MICROPROCESSADORES x86

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

Figura 6.22 | Diagrama de pinos do controlador de barramento IC 8288

O diagrama de conexão entre o 8086 e o 8288 é mostrado na Fig 6.23.


Observe que o gerador de clock aplica o mesmo clock a ambos os ICs. Assim, de acordo com os apropriados
o código em S 0,
S e S2 , _ os sinais são gerados e podem ser usados para ler/escrever memória ou E/S, e
1
fornecer os sinais necessários para travas e transceptores.
Observe que o controlador de barramento gera os sinais de controle de leitura e escrita para memória e I/O, o
sinal ALE para os latches, os sinais DT/ R e DEN para os transceptores e o sinal INTA para reconhecimento de
interrupções.
Existem mais alguns pinos para o IC do controlador de barramento, mas não os discutiremos, porque esses
sistemas de modo máximo se tornaram obsoletos. No entanto, para completar nossa compreensão do 8086, vamos
ver o restante dos pinos de modo máximo.

6.4.2 | Solicitar / conceder pinos


Os números de pinos 30 e 31 são designados como RQ/ GT . São pinos especiais, no sentido de serem
bidirecionais. Como o nome indica, eles atendem a 'solicitação' e 'concessão'. Cada pino age de forma semelhante
ao pino HOLD e HLDA. No modo mínimo, HOLD é para solicitação de barramento e HLDA é para concessão de
barramento. No modo máximo, um pino executa as duas funções. Aqui o pedido /
pinos de concessão são mais propensos a serem usados para comunicação com outros processadores do que para
operações de DMA. Lembre-se que este modo é utilizado em configurações de multiprocessadores, ou seja,
sistemas em que existem outros processadores além do 8086. Em sistemas multiprocessados, recursos como
memória e E/S provavelmente são compartilhados e o barramento do sistema é comum a todos os processadores.
Quando um processador está usando o barramento, outro processador pode solicitar o uso do barramento e o
mestre do barramento atual pode abrir mão do barramento (sujeito a condições). Assim, as requisições de outro
processador serão colocadas nessas linhas e o sinal de concessão também será colocado nesses pinos, mas no
sentido oposto, obviamente. É assim que esses pinos são 'bidirecionais'. Existem tempos associados a solicitações
e concessões, e são mostrados na Figura 6.24.
São necessários três pulsos para completar uma solicitação/concessão/liberação do barramento. Os pinos RQ/
GT são examinados na borda ascendente de cada pulso de clock. Se uma solicitação (lógica baixa para um estado
T) for detectada e se as condições forem propícias à concessão da solicitação, o pulso de concessão aparecerá no
mesmo pino imediatamente após o próximo estado T4 ou T1 . Isso permite que o processador solicitante use o
barramento. Quando este processador está pronto para retornar o barramento após o uso, ele envia o pulso de liberação
Machine Translated by Google

A ESTRUTURA DE HARDWARE DE 8086 217

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

Figura 6.23 | Conexão entre o 8086 e o 8288

T4 ou T1

CLK

RG/GT

Um Processador Solicita 8086 Concede ônibus para Processador


Acesso de ônibus Processador solicitante Libera ônibus

Figura 6.24 | Tempo associado ao pino RQ / 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.3 | Pinos de status da fila QS0 , QS1


Esses pinos são entradas para o 8086. Torna-se útil quando um coprocessador aritmético é o
segundo processador no sistema. Uma vez que se espera que o coprocessador trabalhe em
sintonia com 8086, o coprocessador pode interrogar o 8086 sobre seu status de fila, nessas linhas,
e decidir seu curso de ação de acordo. Mais detalhes são fornecidos no Capítulo 13.

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

218 OS MICROPROCESSADORES x86

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

6,5 | Ciclo de Instrução Agora,

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

Vcc GND 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

Figura 6.25 | Configuração máxima do modo do 8086


Machine Translated by Google

A ESTRUTURA DE HARDWARE DE 8086 219

FI – Instrução de busca
DI – Instrução de decodificação

CO – Calcular endereços de operandos


FO – Busca operandos
EI – Executar instrução
WO – Grava ou armazena o resultado na memória

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

220 OS MICROPROCESSADORES x86

Tabela 6.3 | Tempos de execução de algumas instruções de amostra


Não. Instrução Nº de ciclos de clock para execução
1 ADICIONAR AX, BX 2

2 MOV AX, BX 2

3 MUL BX 133

4 MOV BX, N 4

5 CMP AX, [BX] [SIM] 9 + EA


6 Etiqueta JNZ 16/4
7 Rótulo de LOOP 17/5

Tabela 6.4 | Número de ciclos gastos no cálculo do 'endereço efetivo'


Não. Modo de endereçamento Nº de relógios para cálculo de EA
1 Direto 6

2 Registro indireto 5

3 Registrar parente 9

4 Baseado indexado com BP 8

como base cadastral


5 Baseado indexado com BX 7

como base cadastral


6 Base relativa indexada com 12

BP como base cadastral


7 Relativo baseado indexado com 11

BX como o registro base

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.

6.5.1 | Loops de atraso


Agora que temos meios de calcular o tempo necessário para executar qualquer instrução do processador, vamos usar o
tempo de execução para uma aplicação interessante. Vemos que um certo tempo, ou melhor, um 'atraso' está associado à
execução de uma instrução. Assim, a execução da instrução nos dá um meio de gerar um atraso. Veja as instruções abaixo.

MOV CX, 100 4 ciclos


AQUI: LOOP AQUI 17/5 ciclos

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

A ESTRUTURA DE HARDWARE DE 8086 221

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

222 OS MICROPROCESSADORES x86

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

Assim, um valor de 11 (0BH) pode ser usado no lugar de N1 no programa.

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.

6.5.2 | Por que Delay Loops?


Que aplicação há para o exercício que acabamos de fazer? Onde esses atrasos devem ser usados? A geração de
atrasos dessa maneira é chamada de 'atraso de software'. Pode-se gerar uma onda quadrada usando um atraso de
software. Suponha que tenhamos uma porta de saída com um endereço de 78H. Veja o Exemplo 6.4.

Exemplo 6.4
Gere uma onda quadrada de frequência 1 KHz na porta de saída com endereço 78H

Solução

NOVAMENTE: MOV AL, 0FFH


SAÍDA 78H, AL
CHAMADA DELAY_1MS
MOV AL, 00
SAÍDA 78H, AL
CHAMADA DELAY_1MS

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

A ESTRUTURA DE HARDWARE DE 8086 223

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| Quando no modo mínimo, o 8086 funciona em um ambiente de processador único.

| 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.

| Leitura e escrita de memória e E/S são importantes ciclos de barramento.

| Um ciclo de máquina de leitura/gravação típico de 8086 tem 4 T estados de comprimento.

| Os estados de espera são inseridos nos ciclos da máquina para acomodar memória lenta ou periféricos.

| No modo mínimo, todos os sinais de controle são obtidos do processador.

| No modo máximo, um IC controlador de barramento externo gera os sinais de controle importantes.

| No modo máximo, haverá outros processadores no sistema.

| 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.

2. Como é selecionado o modo de operação do processador e qual é a finalidade de cada modo?

3. Por que os buffers/drivers de linha são usados nas linhas de endereço, dados e controle?

4. Qual a especificação do clock a ser aplicado no pino CLK do processador?

5. Qual a especificação do sinal RESET a ser dado ao processador?

6. Em que endereço o 8086 é ativado?

7. Por que os sinais RESET e READY são aplicados ao IC do gerador de clock?

8. Quando o DT/R está alto, o que é indicado?


9. Qual é a diferença entre os CIs 74LS244 e 74LS245?

10. Quando o pino READY é amostrado?

11. Qual é a diferença nos sinais de interrupção INTR e NMI?

12. Quais são as funções dos pinos HOLD e HLDA?

13. Quando o pino HOLD é amostrado?

14. Quantos ciclos de espera podem ser inseridos em um ciclo de barramento?


Machine Translated by Google

224 OS MICROPROCESSADORES x86

15. Como o processador pode ser retirado do estado HALT?

16. O que se espera que a ALE faça? Qual é a duração da ALE?

17. Qual é a finalidade do pino LOCK?

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?

20. Para que serve a instrução NOP?

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.

4. Redesenhe o ciclo de barramento acima com dois estados de espera incluídos.

5. Explique com temporização relevante, o funcionamento dos pinos RQ/GT.

6. Em um ciclo típico de máquina de gravação, liste as atividades que ocorrem durante cada um dos quatro estados T.

7. Escreva um programa para obter um atraso de 100 ms.

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.

9. Em um ambiente de monitoramento de pressão, 10 sensores de pressão foram conectados. As várias pressões


desses sensores devem ser lidas em intervalos de 5 ms. Escreva um programa para ler os valores do sensor das
portas de entrada com endereço 0FF0H a 0FF9H.
Machine Translated by Google

memoryandi / o 7
decodificação

Neste capítulo, você aprenderá


| As funções dos pinos de um chip de memória típico. | A razão da organização da memória nos bancos.
| A técnica de decodificação de endereços de memória. | Os princípios da decodificação de endereços de E/S.
| A razão e a lógica de usar a decodificação de endereço
parcial.

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.

7.1 | Pinos do dispositivo de memória


A memória de que estamos falando pode ser RAM ou ROM – a diferença é que a ROM só pode ser lida, então o
sinal MEMWR do processador não tem relevância para a ROM. Uma RAM típica tem as linhas de pinos mostradas
na Figura 7.1. Como mostrado, possui linhas de dados Do para DMÿ1 .
Se for uma memória organizada em bytes, as linhas de dados são D0 a D7 . O número de linhas

de endereço (A0 a ANÿ1 ) depende do número de localizações que contém. Por exemplo, se for

Imagem de abertura do capítulo: Um chip de RAM.


Machine Translated by Google

226 OS MICROPROCESSADORES x86

A0
D0

BATER

D M–1
AN-1

NÓS CS VOCÊ ESTÁ

MEMBRO MEMRD
SELECIONAR

Figura 7.1 | RAM típica com pinos de controle

é 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).

Por que sinais de controle baixo ativos?

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

DECODIFICAÇÃO DE MEMÓRIA E E/S 227

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

ii) 512 × 8 iii)

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

Este chip tem 8 linhas de dados.


512 = 29 . Assim, tem 9 linhas de endereço.

iii) 1K × 16.

Este chip tem 16 linhas de dados.


1 K = 1024 = 210. Possui 10 linhas de endereço para acessar cada uma das palavras de dados de 16 bits.

iv) 32 K × 8

Possui 8 linhas de dados.


32 K = 25 × 210 = 215.
Possui 15 linhas de endereço

v) 128 K × 8

Possui 8 linhas de dados.


128 K = 27 × 210 = 217
Possui 17 linhas de endereço.

7.2 | Decodificação de endereço de memória Veja a Fig 7.2

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

quando a lógica da porta NAND for alterada como na Fig 7.3.


Machine Translated by Google

228 OS MICROPROCESSADORES x86

A0
8086

A0–A10
A10 MEMÓRIA
Endereço
Bus
de

A11 2K x 8

A19

CS

SELECIONAR
o

Figura 7.2 | Memória com decodificação de endereço

A19 o
A18 o

A17 o
o
A16 SELECIONAR
o o
A15
o
A14
A13 o
A12 o
A11 o

Figura 7.3 | Decodificador de porta NAND

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

O primeiro endereço no chip:

1111 1111 1000 0000 0000

O último endereço no chip:

1111 1111 1111 1111 1111

Assim, o intervalo de endereços do chip é FF800H a FFFFFH ou seja, 2048 bytes ou seja, 2 K bytes.
Machine Translated by Google

DECODIFICAÇÃO DE MEMÓRIA E E/S 229

Se a lógica na porta NAND for modificada como na Fig 7.3, a faixa de endereços será:

0000 0000 0000 0000 0000

para

0000 0000 0111 1111 1111

Por exemplo, 00000 a 007 FFH (0 a 2047 bytes), que é 2 K bytes.

7.2.1 | Conceitos de decodificação de endereço

• 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.

• Em geral, os decodificadores de endereço podem ser construídos usando:

– Lógica aleatória (portas simples)

– Descodificadores de bloco (por exemplo, 2 × 4, 3 × 8 …)

– Lógica programável (PLAs, CPLDs, FPGAs, …)

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 é:

0000 0000 0000 0000 0000

E o endereço mais alto:

0000 0111 1111 1111 1111

A faixa de endereços deste chip de memória é de 00000 a 07FFFFH.


Machine Translated by Google

230 OS MICROPROCESSADORES x86

32K x 8

A0 D0
Barramento de dados
Barramento de endereços BATER

A14 D15

CS

A19
SELECIONAR

A15

Figura 7.4 | Decodificação de endereço usando lógica OR

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:

1111 1010 0000 0000 0000

para

1111 1011 1111 1111 1111

Por exemplo, FA000H a FBFFFH.

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:

0001 1110 0000 0000 0000

para

0001 1111 1111 1111 1111

Por exemplo, 1 E000 a 1 FFFFH.


Machine Translated by Google

DECODIFICAÇÃO DE MEMÓRIA E E/S 231

(uma) +5V (b)


o

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

7.2.2 | Decodificação de endereço usando decodificadores de bloco

Um decodificador muito popular é o decodificador de 3 a 8 (74LS138) cujo diagrama de blocos é mostrado na


Figura 7.6a. As linhas de saída são baixas ativas e dependendo das entradas selecionadas, uma linha de saída
sozinha estará ativa. Para habilitar o chip decodificador, deve-se garantir que G2A e G2B estejam no nível lógico
0 e G1 esteja no nível lógico 1. A tabela de decodificação do chip é mostrada na Figura 7.6b . Considere que um
chip de 1 K × 8 RAM usa um decodificador de 3 a 8 para decodificação de memória. A RAM tem 10 linhas de endereço.
Assim, as 10 linhas restantes do barramento de endereço do processador podem ser usadas para
decodificação. Vamos calcular seu espaço de endereçamento. Considere uma conexão de hardware como
mostrado na Fig 7.7. Neste, as linhas de endereço A0 a A9 do barramento de endereço do processador são
conectadas diretamente às linhas de endereço da RAM. A lógica dessas linhas pode variar de 00 0000 0000 a
11 1111 1111. As 10 linhas de endereço restantes do processador são usadas para decodificação de endereço.
Assim, nós os vemos conectados aos pinos do decodificador. Para habilitar o decodificador, G2 A e G2 B
devem ser 0, e G1 deve ser 1. Além disso, para habilitar Y3, CBA deve ser 011. Assim, a lógica nas linhas de
A19 a A10 deve ser 1111 1111 10. Th nós, o intervalo superior e inferior do endereço é mostrado na tabela a seguir.

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

232 OS MICROPROCESSADORES x86

(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

Figura 7.6a | Diagrama de bloco funcional do decodificador de 3 a 8 74LS138

(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

Nota G2* = G2 A e G2 B Figura

7.6b | Tabela de decodificação de 74LS138

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

Figura 7.7 | Decodificação de endereço de uma RAM usando um decodificador de bloco


Machine Translated by Google

DECODIFICAÇÃO DE MEMÓRIA E E/S 233

O intervalo de endereços é

1111 1111 1000 0000 0000

para

1111 1111 1011 1111 1111

ou seja, FF800H para FFFFH

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.

A16 A17 A18

ROM
A0–A15
64K×8
AB C

CS
SELECIONAR

o
A19 G1 Y1

G2A
Y4 o
G2B

BATER
A0–A15
64K×8

SELECIONAR
CS

Figura 7.8 | Decodificação de endereço de uma RAM e ROM usando um decodificador de 3 a 8


Machine Translated by Google

234 OS MICROPROCESSADORES x86

7.2.3 | Decodificação de endereço parcial

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

DECODIFICAÇÃO DE MEMÓRIA E E/S 235

A0–A13

16K × 8 16K × 8
BATER ROM

CS CS

o
A14

Figura 7.9 | Decodificação de endereço parcial

A0–A12

8K x 8 8K x 8
BATER EPROM

CS CS

A14 o
A13 o

Figura 7.10 | Decodificação de endereço parcial usando duas linhas de endereço

7.3 | Bancos de memória


8086 possui um barramento de memória de 16 bits – o que significa que a transferência de dados pode ocorrer a uma
taxa máxima de 16 bits (uma palavra) por ciclo de barramento. No entanto, às vezes apenas um byte precisa ser acessado.
Isso significa que o processador deve ter ambas as opções – ou seja, a transferência de byte e palavra deve ser possível.
Sabemos que para uma transferência de palavras, dois locais de byte devem ser acessados, ou seja, dois endereços
são realmente necessários.
Machine Translated by Google

236 OS MICROPROCESSADORES x86

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

Banco Alto Banco Baixo

(selecionado por BHE) (Selecionado por A0)


FFFFF FFFFE

FFFFD FFFFC

8 bits 8 bits
D15–D8
D7–D0
Endereço Ímpar Endereço par

00003 00002
00001 00000

Figura 7.12 | Bancos de memória de 8086


Machine Translated by Google

DECODIFICAÇÃO DE MEMÓRIA E E/S 237

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

BAIXO (PARA) ALTO (ÍMPAR)


BANCO BANCO

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

238 OS MICROPROCESSADORES x86

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

(mesmo) MOV AL, [0000] mudar 1 0 Baixo 1

(ímpar) MOV AL, [0001] mudar 0 1 Alto 1

(mesmo) MOV AX, [0000] palavra 0 0 Ambos 1

(ímpar) MOV AX, [0001] byte ímpar 0 1 Alto eu pedalo

byte par 1 0 Baixo II ciclo

7.3.1 | Palavra de endereços ímpares

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.

7.3.2 | Por que bancos de memória?

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:

MOV AL, [0000]


Machine Translated by Google

DECODIFICAÇÃO DE MEMÓRIA E E/S 239

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.

7.3.3 | Usando Strobes de Gravação Separados

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.

7.3.4 | Mapa de Memória do IBM-PC

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.

7.4 | Decodificação de endereço de E/S

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)

Figura 7.14 | Usando flashes de gravação separados


Machine Translated by Google

240 OS MICROPROCESSADORES x86

Tabela 7.2 | Mapa de memória do IBM PC


Intervalo de endereços Tamanho
Modelo Alocação

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

vetores de interrupção, algumas partes para armazenamento


BIOS, alguns para parâmetros DOS e alguns para o sistema
operacional

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

Figura 7.15 | Portas de entrada e saída conectadas ao 8086

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.

7.4.1 | Portas de saída


As portas de saída usam a instrução 'OUT' para escrever nelas. Em seguida, os dados no acumulador (AL ou AX) são gravados no
dispositivo de saída. Um dispositivo de saída pode ser tão complexo quanto uma tela de vídeo ou tão simples quanto LEDs, que precisam
acender. Os dados do processador são enviados para uma porta de saída durante o ciclo de gravação de E/S. Esses dados estarão
disponíveis no barramento de dados somente até o final de um ciclo de máquina. Para que a porta de saída possa usar esses dados, ela
deve estar travada. Assim, uma trava é obrigatória para a configuração de uma porta de saída. (Para memória, existem travas dentro do
chip.)
A Fig 7.17 mostra uma porta de saída básica.
Machine Translated by Google

DECODIFICAÇÃO DE MEMÓRIA E E/S 241

FFFFH

Apenas endereçamento de porta variável

FFH
Porta fixa/porta variável

Endereçamento
0000 00

Figura 7.16 | Esquemas de endereçamento de portas

Resultado
Dispositivo

Endereço SELECIONAR
CLK
Decodificador o
Barramento de endereços
ROBUSTO

Barramento de dados

IOWR
Sistema
Barramento de dados

Figura 7.17 | Configuração básica da porta de saída

Requisitos de uma porta de saída


i) Para identificar/selecionar o dispositivo específico, um decodificador de endereço deve fornecer um

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

atividades acima ocorrem durante um ciclo de escrita de E/S.

Exemplo 7.7 Projete

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

A Fig 7.18 mostra a configuração do


hardware. i) É mostrado o diagrama com o decodificador de endereço, o pulso de seleção e o sinal
IOWR . O decodificador de endereço fornece um pulso de seleção alto. Isso é ANDed com o pulso
IOWR invertido e aplicado ao pino G da trava transparente octal 74LS373 (consulte a Seção 6.1.4).
Machine Translated by Google

242 OS MICROPROCESSADORES x86

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

Figura 7.18 | Porta de saída com 8 LEDs conectados a ela

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:

STRT: MOV AL, 0FFH ;dados para acender todos os


SAÍDA 0F8H, AL LEDs ;transferir para a porta de
CHAMADA DELAY_1SEC saída ;chamar o procedimento de
MOV AL, 00 atraso ;dados para desligar os
SAÍDA 0F8H, AL LEDs ;transferir para a porta de
CHAMADA DELAY_1SEC saída ;transferir para a porta de
JMP STRT saída ;repetir continuamente

v) Para o procedimento de atraso, consulte o Exemplo 6.3.

7.4.2 | Portas de entrada


As portas de entrada usam a instrução IN para receber dados no processador no acumulador do
processador (AL ou AX). Uma porta de entrada requer um buffer de três estados junto com ela para garantir que
Machine Translated by Google

DECODIFICAÇÃO DE MEMÓRIA E E/S 243

Dados do sistema
Ônibus

SELECIONAR
TSB

E
Endereço
Barramento de endereços
Decodificador

Entrada
Dispositivo
IORD

Figura 7.19 | Porta de entrada básica

é 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.

Requisitos de uma porta de entrada

i) Para identificar/selecionar o dispositivo específico, um decodificador de endereço deve fornecer um

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

244 OS MICROPROCESSADORES x86

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.

iv) O programa para entrada de dados de cada uma dessas portas é

STRT: EM AL, 3EH ;pega dados do Port2


MOV BL, AL ;mover dados para BL
EM AL, 7EH ;pega dados da Porta1
MOV DL, AL ;mover dados para DL

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.

7.4.3 | Decodificação de endereços de E/S de 16 bits

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.

7.4.4 | Portas com barramento de dados 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

DECODIFICAÇÃO DE MEMÓRIA E E/S 245

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

Banco Ímpar Mesmo banco

Ativado por BHE Ativado por A0

E/S alta E/S baixa


Banco Banco

0005

0003 0004

0001 0002

D15 D8 D7 D0

Figura 7.22 | Bancos de E/S


Machine Translated by Google

246 OS MICROPROCESSADORES x86

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| 74LS138 é um decodificador de 3 a 8 muito popular.

| O número de localizações em um chip de memória é 2N onde N é o número de linhas de endereço do chip.

| A memória é sempre organizada como 'bancos'.

| 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.

| Os chips de memória possuem buffers de três estados e travas dentro do chip.

| 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

1. Quantas linhas de endereço são necessárias para um chip de memória de 256K?

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?

6. Por que a memória está organizada em 'bancos'?

7. Por que a linha de endereço A0 também é designada como BLE?

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

DECODIFICAÇÃO DE MEMÓRIA E E/S 247

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

Neste capítulo, você aprenderá


| O conceito de interrupção. | Como acessar a tela de vídeo gravando/lendo diretamente
| A resposta de interrupção do 8086. na RAM de vídeo.

| 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.

| A operação de interrupções de hardware de 8086. | O método de 'ligar' interrompe.

| O significado das interrupções do DOS e do BIOS. | Como escrever programas TSR.

| Como acessar a exibição de vídeo usando interrupções do


BIOS.

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' é

Imagem de abertura do capítulo: Um chip PIC.


Machine Translated by Google

250 OS MICROPROCESSADORES x86

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.

8.1 | Interrupções de 8086


Agora que aceitamos que as interrupções fazem parte do funcionamento normal de um processador, vamos ver
o mecanismo de processamento de interrupção do 8086. O 8086 tem interrupções de hardware, interrupções de
software e interrupções geradas por erros. Para os três casos mencionados aqui, o mecanismo de interrupção é
diferente, mas a forma como o processador responde é semelhante. Então, vamos primeiro dar uma olhada na
forma como o 8086 responde a qualquer interrupção. O ponto a ser observado é que, após uma solicitação de
interrupção ser processada, o processador deve retornar à sua tarefa anterior que foi deixada inacabada. Assim,
uma interrupção não é muito diferente de uma instrução CALL em sua filosofia, mas existem algumas diferenças
na forma como ela é tratada e processada.

8.1.1 | Resposta de interrupção de 8086


Após cada ciclo de instrução, o processador verifica se alguma interrupção está aguardando serviço. Se encontrar
uma solicitação de interrupção e decidir reconhecê-la e atendê-la, a resposta será a seguinte sequência de etapas:

i) O registrador flag é empurrado para a pilha.

ii) O sinalizador de interrupção está desabilitado (IF = 0).

iii) O sinalizador de armadilha está desabilitado (TF = 0).

iv) O registrador CS é empurrado para a pilha.

v) O registrador IP é empurrado para a pilha.

vi) O controle é transferido para o local em que o 'Serviço de Interrupção correspondente


Rotina' (ISR) é armazenado. Isso é, com efeito, seria um salto distante.

vii) O programa correspondente ao ISR é executado. A última instrução no ISR irá


seja IRET

viii) Então o IP é retirado da pilha.

ix) CS é retirado da pilha.

x) O registrador Flag é retirado da pilha.

xi) O controle retorna ao ponto em que parou.

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

A ESTRUTURA INTERROMPIDA DE 8086 251

PROGRAMA PRINCIPAL
PUSH
INT LIMPAR SE ISR

LIMPAR TF

EMPURRAR CS

ENVIAR IP

CET SRI

POP IP

POP CS

POPF ele iria

Figura 8.1 | Etapas no processamento de uma solicitação de interrupção

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 é

I. Finalmente, a execução da instrução recomeça de onde foi desviada.

8.1.2 | Rotina de serviço de interrupção e vetor de interrupção


Agora, o que é uma rotina de serviço de interrupção? Quando ocorre uma interrupção, o processador suspende a
execução de sua tarefa atual e assume outra tarefa conforme solicitado pela fonte de interrupção. Este programa, ou
rotina como pode ser chamado, é designado como uma 'rotina de serviço de interrupção'. Essa rotina corresponde à
solicitação de uma determinada fonte de interrupção e também é chamada de 'manipulador de interrupção'.
Isso significa que, para qualquer interrupção que ocorra, há uma rotina de serviço de interrupção (ISR) específica.
Agora, onde este ISR está disponível? Deve estar disponível na memória e deve ser acessado na ocorrência da
interrupção específica. Para isso, o endereço do ISR deve ser obtido. O endereço de um ISR é chamado de seu
'vetor de interrupção'. Para um sistema baseado em 8086, qualquer endereço de código está no seguinte formato,
CS:IP. Assim, o vetor de interrupção para qualquer interrupção tem 4 bytes – dois para o valor CS e dois para o valor
IP. Assim, se o vetor de interrupção para uma interrupção em particular for obtido, o controle pode ser transferido para
a nova localização usando os novos valores de CS e IP especificados como o 'vetor de interrupção'.
Machine Translated by Google

252 OS MICROPROCESSADORES x86

8.1.3 | Tabela de vetores de interrupção

É ó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

Figura 8.2a | Tabela de vetores de interrupção de 8086

CS ALTO

CS BAIXO

IP ALTO

IP BAIXO

byte

Figura 8.2b | Um vetor de interrupção típico (4 bytes)


Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 253

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

O número do tipo da interrupção é 61H = 97 em decimal.


O endereço do vetor de interrupção é 97 × 4 = 388 = 184H.
Assim, o vetor de interrupção deve ser armazenado no IVT na posição 0000:0184 em diante.
Para o ISR, o valor CS é 0F00H e o valor IP é 9872H. A parte da tabela de vetores de interrupção que possui esses
vetores armazenados é mostrada.

0FH

0186H 00

98H

0184H 72H

Endereço

Agora, como a tabela de vetores de interrupção obtém essas entradas?

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.

Como uma interrupção é diferente de uma 'Chamada'?

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.

8.2 | Tipos de interrupção dedicados


A Intel dedicou certos tipos de interrupção para aplicativos específicos diretamente relacionados às operações da
CPU. Estes estão listados abaixo.

8.2.1 | INT 0 (Divisão por Erro Zero)


A interrupção com tipo número 0 é dedicada ao erro 'dividir por zero'. Esta interrupção é uma interrupção 'gerada por
erro' (também chamada de 'exceção'). Na divisão, se o registrador de quociente não for grande o suficiente para conter
o quociente, esta interrupção é gerada automaticamente. Dedicar o Tipo 0 para este caso significa que o vetor de
interrupção correspondente na tabela de vetores de interrupção está disponível em 0000:0000 (veja a Fig 8.2a). Assim,
o ISR para esta interrupção gerada por erro é escrito
Machine Translated by Google

254 OS MICROPROCESSADORES x86

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.

8.2.2 | INT 1 (Passo Único)


Este número de tipo é dedicado para 'single stepping' ou 'trace'. O passo único é uma ideia importante na depuração. Durante
a depuração lógica de nossos programas, gostaríamos de parar após a execução de cada instrução e verificar o conteúdo
dos registradores, memória e assim por diante. Geralmente realizamos a ação de 'traçar' dessa forma. A Intel forneceu o
sinalizador 'Armadilha' para isso, e esse sinalizador deve ser definido para permitir que isso aconteça. O ISR para visualização
do registrador e do conteúdo da memória será apontado pelo vetor de interrupção tipo 1. Entretanto, uma questão importante
neste caso é como definir o sinalizador de trap.
Nenhuma instrução desse tipo foi encontrada até agora. Relembre a configuração do registrador de bandeira.

D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0


UUUU DE DF IF TF SF ZF U AF U PF U CF

O sinalizador Trap é o bit D8 do registrador sinalizador.


PUSH ;empurra o registrador flag para a pilha
EIXO POP ;puxe para o AX
OU AX, 0000000100000000B ;OU para definir o bit D8 ou seja, TF
EMPURRAR MACHADO
;pressione AX para empilhar
POPF ;coloque-o no registrador fl ag

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.

8.2.3 | INT 2 (Interrupção Não Mascarável)


Esta interrupção corresponde ao vetor (ponteiro) da interrupção de hardware NMI. Quando uma interrupção é recebida no
pino NMI (Non Maskable Interrupt) do processador, ocorre uma interrupção do tipo 2 – isso significa que o ISR para NMI
deve ser escrito no endereço apontado pelo conteúdo IVT correspondente. Vamos lidar com a interrupção NMI em detalhes
na Seção 8.4.1.

8.2.4 | INT 3 (Interrupção de Ponto de Interrupção)

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 ESTRUTURA INTERROMPIDA DE 8086 255

8.2.5 | INT 4 (Interrupção de estouro)


Esta interrupção corresponde ao fl ag de estouro. Se o sinalizador de estouro estiver definido, essa interrupção ocorre,
mas não automaticamente. Uma instrução INTO (interrupt on overflow) deve ser escrita após o segmento de programa
que provavelmente fará com que o sinalizador de overflow (OF) seja ativado.

MOV AL, NUM1


ADICIONAR AL, NUM2
EM ;interromper no estouro

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.

8.2.6 | Alocação de Números de Tipo de Interrupção


Assim, vemos que interrupções com números de tipo 0 a 4 foram atribuídas a ações pré-definidas relacionadas à CPU.
Consulte a Tabela 8.1. Interrupções com números de tipo 5 a 31 são reservadas pela Intel, para usos especiais e para
processadores futuros. Na verdade, alguns deles são usados para vários dispositivos de hardware e E/S e alguns para
condições de erro dos processadores superiores na família x86. As demais interrupções podem ser utilizadas pelo
usuário. No entanto, no PC, muitos tipos de interrupção foram usados pelo BIOS e pelo DOS. Veremos a lista dessas
interrupções e também usaremos algumas delas posteriormente.

8.3 | Interrupções de software


O que significa o termo 'interrupção de software'? Quando uma interrupção é iniciada por uma instrução, ela é chamada
de interrupção de software. O formato desta instrução é:

Número do tipo INT.

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

Tabela 8.1 | Interromper a alocação da tabela de vetores


Tipo INT nº. Localização em IVT (HEX) Inscrição
0 0000:0000 Dividir por zero erro
1 0000:0004 Interrupção de passo único
2 0000:0008 Interrupção não mascarável
3 0000:000C Ponto de interrupção

4 0000:0010 Transbordar

5 a 31 Reservado pela Intel


32 a 255 Disponível para o usuário
Machine Translated by Google

256 OS MICROPROCESSADORES x86

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'.

Qual é o tamanho de uma instrução de interrupção?

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.3.1 | Rotinas de interrupção do DOS e BIOS


Usamos interrupções de software na forma da função DOS INT 21H. O DOS possui várias funções (procedimentos)
para acessar dispositivos de entrada/saída, e podemos usar essas funções conhecendo o número do tipo de
interrupção. O endereço absoluto da função não precisa ser conhecido por nós.
Além das interrupções do DOS, há outro conjunto de funções para acesso de E/S e isso é fornecido pelo
BIOS do sistema. BIOS é um acrônimo para 'Basic Input Output System'. Uma coleção de rotinas, ou seja,
procedimentos estão disponíveis aqui também, para acessar E/S. Essas funções são acessadas por interrupções
com números de tipo especificados para um determinado periférico (consulte a Tabela 8.2). Assim, as interrupções
do DOS e do BIOS pertencem à classe de interrupções de software e serão discutidas com mais detalhes em breve.

8.4 | Interrupções de hardware


Agora vamos examinar os pinos de interrupção de hardware do 8086. Existem dois pinos nos quais as
solicitações de interrupção podem ser recebidas – eles são o pino INTR e o pino NMI.

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

A ESTRUTURA INTERROMPIDA DE 8086 257

1º Ciclo da Máquina 2º Ciclo da Máquina

T1 T2 T3 T4 T1 T2 T3 T4

MAS

ENQUANTO

FLUTUADOR

AD0 - AD15 Nº do tipo

Figura 8.3 | Interromper o ciclo da máquina de reconhecimento do 8086

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.

8.4.2.1 | Geração de um número de tipo


A Fig 8.4 mostra um circuito simples que é capaz de enviar um 'número de tipo' para o processador.
Considere um dispositivo de interrupção interrompendo o 8086 em seu pino INTR. O processador responde baixando
a linha INTA. Este sinal é conectado aos pinos de habilitação de um buffer tri-state (74LS244). Oito chaves são
conectadas aos pinos de entrada do TSB. Quando uma chave é fechada, a linha é aterrada correspondendo a um
nível '0' no pino. Quando um switch está aberto, ele recebe Vcc e, portanto, está no estado '1'. Na figura, a
configuração do switch corresponde a 1000 0001 ou 81H. Isso ocorre porque o primeiro e o último interruptores
estão abertos e os demais estão fechados. Quando os pinos de habilitação (OE) do TSB estão baixos (ou seja,
quando INTA fica baixo), os dados na entrada do TSB são transferidos para a saída do chip TSB.

Durante o primeiro ciclo de máquina de reconhecimento de interrupção, as linhas de endereço/dados do


processador são flutuantes. Este ciclo de máquina de 'reconhecimento de interrupção' sinaliza ao dispositivo de
interrupção que seu pedido de interrupção foi reconhecido e que ele deve ficar pronto. Neste ciclo, embora
Machine Translated by Google

258 OS MICROPROCESSADORES x86

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

Figura 8.4 | Geração de um número de tipo durante o ciclo INTA

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.

Podemos considerar o pino de reset como um pino de interrupção?

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

A ESTRUTURA INTERROMPIDA DE 8086 259

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:

30 36 2F 32 30 2F 30 35 ou seja, 20/06/05 no formato mm/dd/aa.

8,5 | Prioridade de interrupções


Quando ocorrem muitas interrupções ao mesmo tempo, qual fonte obtém sua solicitação atendida primeiro? O
processador decide a prioridade. A ordem de prioridade é definida da seguinte maneira:

i) Interrupções internas e interrupções de software – obtenha a prioridade mais alta,


ii) MNI,

iii) INTR – obtém a prioridade mais baixa.

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.

8.6 | Alocação de tipo de interrupção para PCs atuais


A alocação de números de tipo para o PC é mostrada na Tabela 8.2. Esta será nossa referência ao discutir as
interrupções de vídeo e teclado.

8.6.1 | Interrupções de BIOS e DOS


Já falamos sobre essas interrupções antes e sabemos que elas correspondem a rotinas já escritas por projetistas
de sistemas. Ambas as classes de interrupções servem para lidar com dispositivos de entrada e saída. As
interrupções do DOS vêm junto com o sistema operacional (MS-DOS). As rotinas do BIOS são armazenadas em
ROM e, portanto, também são chamadas de ROM BIOS. Como o acesso à ROM é bastante lento, a prática atual é
copiar o BIOS para a RAM (que é mais rápido) também. Isso é chamado de memória sombra, que é protegida
contra gravação para evitar adulteração das rotinas do BIOS. No início da era do desenvolvimento do PC, havia
problemas devido ao BIOS não padrão, mas agora a padronização foi mais ou menos acordada. A Tabela 8.2
mostra os números dos tipos de interrupções que atendem a dispositivos específicos. Mesmo para um determinado
tipo de interrupção, as rotinas que foram escritas têm várias funções e podemos usá-las apropriadamente passando
parâmetros para registradores designados. Ao comparar as rotinas do BIOS e do DOS, notará que o BIOS oferece
um grau de controle maior do que as rotinas do DOS e, portanto, está mais próximo do hardware real.

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.

8.6.2 | Funções do BIOS 10H


Para podermos utilizar estas funções de forma eficaz, primeiro temos de fazer um estudo da apresentação do vídeo.
Precisamos ter uma ideia geral (não todos os detalhes intrincados) de sua história, como componentes e padrões.
Então vamos agora embarcar no estudo do sistema de vídeo de um PC típico.
Machine Translated by Google

260 OS MICROPROCESSADORES x86

Tabela 8.2 | Alocação de interrupção para números de tipo 0 a 21 no IBM PC


Tipo de interrupção nº. (HEX) Função

0 CPU ÿ Dividir por zero (interrupção de exceção)

1 CPU - Passo único

2 CPU - Interrupção não mascarável (NMI)

3 CPU - Instrução de ponto de interrupção

4 CPU - Estouro

5 BIOS - Tela de impressão

6 CPU - Código operacional inválido

7 CPU ÿ Coprocessador matemático ausente

8 Interrupção do temporizador do sistema (IRQ 0)

9 Dados do teclado prontos (IRQ 1)

UMA
Cascata reservada (IRQ 2) do controlador de interrupção escravo

B, C Interrupção de hardware para comunicação serial

D Interrupção de hardware de porta paralela (IRQ 5, LPT 2)

E Interrupção de hardware do controlador de disquete (IRQ 6)

F Interrupção de hardware da impressora (IRQ 7, LPT 1)

10 BIOS - Interrupção de software para usar vídeo

11 BIOS - Chamada de verificação de equipamento

12 BIOS ÿ Chamada de verificação de memória

13 BIOS - Interrupção de software para usar o disco rígido

14 BIOS - Interrupção de software para usar a porta serial

15 Não usado

16 BIOS - Interrupção do software do teclado

17 BIOS ÿ Interrupção do software da impressora

18 BIOS - carregador ROM BASIC

19 BIOS - carregador de inicialização

1A BIOS - Interrupção do software do sistema e do relógio em


tempo real

1B BIOS - Manipulador de interrupção de controle

1C BIOS - Manipulador de ticks do timer do sistema

1D BIOS - Ponteiro de tabela de parâmetros de inicialização de vídeo

1E BIOS ÿ Ponteiro da tabela de parâmetros de inicialização do


disquete

1F BIOS - Tabela de bitmap de caracteres de exibição de gráficos

20 DOS ÿ Program terminate

21 DOS - Serviços de solicitação de funções


Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 261

8.6.3 | Adaptador de vídeo


A exibição de vídeo, juntamente com o hardware e software associados, é uma das partes mais complexas
do PC. Para podermos ter uma certa acessibilidade a ele, precisamos desenvolver uma compreensão básica
do sistema de vídeo de um PC. Em qualquer PC, existe a unidade de exibição e um 'adaptador de vídeo'.
Este adaptador é o hardware que fornece ao sistema seus recursos de exibição. Também é designado por
nomes como placa de vídeo e placa de vídeo. É o hardware que funciona entre o processador e o monitor.
Ele transmite as informações recebidas de programas e aplicativos em execução no sistema para o monitor
e fornece representação visual dos resultados.
Anteriormente, o adaptador de vídeo era conectado a um slot na placa-mãe – agora está na placa-mãe.
Além disso, geralmente há uma placa de vídeo adicional com processador embutido e RAM para melhorar a
capacidade gráfica do PC. Isso é chamado de acelerador gráfico.
Agora, vamos ver os conceitos básicos de adaptadores de vídeo e monitores. A tela de vídeo geralmente
tem um 'controlador' que cuida das complexidades do mecanismo de exibição. Além disso, ele precisa de
memória RAM para armazenar os dados a serem exibidos. O mapa de memória do IBM PC (Tabela 7.3.)
mostra que as localizações de A0000H a BFFFFH (128K) são dedicadas ao vídeo, e essa área da memória
é chamada de RAM de exibição de vídeo (VDR) ou memória de vídeo ou VRAM.

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: Adaptador gráfico colorido


EGA: Adaptador gráfico estendido
VGA: adaptador gráfico de vídeo
SVGA: Super VGA

8.6.5 | Texto e gráficos


A classificação mais básica do modo de exibição é 'texto ou gráficos'. No modo de texto, um monitor pode
exibir apenas caracteres ASCII. No modo gráfico, um monitor pode exibir qualquer imagem mapeada em
bits. A ênfase de nossas discussões aqui será o modo texto. Além dos modos de texto e gráficos, os
adaptadores de vídeo oferecem diferentes modos de resolução de tela e número variável de cores usadas.

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

262 OS MICROPROCESSADORES x86

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.

8.6.6 | Exibição de caracteres


Na memória de vídeo, para qualquer caractere, o valor ASCII está no endereço par e o byte de atributo está
no endereço ímpar. O byte de atributo decide a cor do fundo e do texto. A ordem de armazenamento dos
dados é que na localização da primeira palavra a partir de B800:0000, todas as palavras de 80 caracteres
da primeira linha são armazenadas, depois os dados da segunda linha e assim por diante; em outras
palavras, os dados são armazenados em linhas. Para 25 linhas e 80 colunas, as coordenadas do primeiro e
do último elemento de caractere são (0, 0) e (24, 79). Isso é mostrado na Figura 8.5.

Tabela 8.3 | Detalhes do modo de texto do CGA

Tipo de modo Linhas × Colunas Páginas Endereço inicial no VDR Nº de cores


00 Cor 25 × 40 8 B800:0000 16
01 Cor 25 × 40 8 B800:0000 16
02 Cor 25 × 80 4 B800:0000 16
03 Cor 25 × 80 4 B800:0000 16
07 Monocromático 25 × 80 1 B000:0000 2

80 colunas

C
Aumentando os endereços de memória
(2 Bytes/Elemento)
(0,0)

TELA DE VÍDEO EM MODO DE TEXTO

C
(24,79)

Atributo Personagem

B EU Valor ASCII

PRIMEIRO PLANO (RGB)

INTENSIDADE

ANTECEDENTES (RGB)

PISCAR

Figura 8.5 | Tela de vídeo em modo texto


Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 263

8.6.7 | Configuração de cores


As configurações de bits para as várias cores possíveis são fornecidas nas Tabelas 8.5 e 8.6. Tudo isso para o atributo
byte que tem o formato mostrado na Tabela 8.4. Este byte define as cores de fundo e de primeiro plano. O primeiro plano
refere-se à cor do caractere exibido. Fundo é a cor que envolve um personagem. É bem conhecido que a adição das cores
primárias vermelho, verde e azul (RGB) em proporções adequadas pode dar uma cor resultante. Ao adicionar intensidade
(brilho) a essa cor, obtemos uma cor mais clara.

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,

Tabela 8.4 | Formato do Byte de Atributo

D7 D6 D5 D4 D3 D2 D1 D0
B RGB I GB

PISCANDO = 1 NORMAL = 0 FUNDO PRIMEIRO PLANO

Tabela 8.5 | As 16 cores da atribuição de bits de primeiro plano


EU R G B Cor

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

264 OS MICROPROCESSADORES x86

Tabela 8.6 | As 8 cores da atribuição de bits de fundo


R G B Cor

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.

i) Fundo preto com texto branco brilhante (primeiro plano)

ii) Fundo branco, texto vermelho (primeiro plano)

iii) Piscando com fundo ciano com texto marrom (primeiro plano)

Solução

Veja as Tabelas 8.4, 8.5 e 8.6.

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.

Os quatro bits inferiores do atributo são 0111

Assim, o atributo bye é 0000 0111 ou seja, 07

ii) Sem piscar. Portanto, D7 = 0.


O fundo branco precisa de 111
O primeiro plano vermelho (texto) precisa de 0100
Assim, o byte de atributo é 0111 0100 ou seja, 74H

iii) Piscando e fundo ciano precisa de 1011


O primeiro plano marrom (texto) precisa de 0110
Assim, o byte de atributo é 1011 0110 ou seja, B6H

8,7 | Funções do BIOS 10H


Na Tabela 8.2, de alocação do vetor de interrupção, pode-se ver que o número do tipo 10H foi alocado para aplicações de
exibição de vídeo. Nesta categoria, uma série de ações são possíveis
Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 265

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.

i) BIOS 10H Função 0 – Configura o modo de vídeo.

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

MOV AH, 0 ;defina o número da função


MOV AL, 3 ;modo 3, modo texto padrão
INT 10H ;a tela está limpa
.SAÍDA
FIM

Este programa limpa a tela e configura a exibição para o modo 3 (CGA).

ii) BIOS 10H Função 02 – Definir a posição do cursor.


Isto serve para posicionar o cursor, especificando as coordenadas de linha e coluna. (A coordenada linha varia
de 0 a 24 e a coluna de 0 a 79). Os registros a seguir devem conter as informações relevantes. BH = número
da página (a página padrão é 0), DH = linha, DL = coluna.

Exemplo 8.4
.MODELO PEQUENO
.CÓDIGO
.COMECE

MOV AH, 0 ;defina o número da função


MOV AL, 3 ;modo 3, modo texto padrão
INT 10H ;a tela é limpa com isso.

MOV AH, 02 ;número da função para definir a posição do cursor


MOV BH, 0 ;especificar página (que é a página padrão
MOV DH, 09 ;coordenada de linha
MOV DL, 35 ;coordenada de coluna
INT 10H
.SAÍDA
FIM
Machine Translated by Google

266 OS MICROPROCESSADORES x86

iii) Função 06 – Rolar a tela para cima.


Esta função rola a tela para cima pelo número especificado de linhas e linhas em branco aparecem na parte
inferior. Os registradores envolvidos e os valores a serem armazenados neles são:
AL = número de linhas a serem roladas para cima (0 para uma tela cheia em branco)
BH = valor do atributo ou valor do pixel, CH:CL = linha inicial: coluna,
DH:DL = linha final: coluna
Consulte o seguinte segmento de programa.
MOV AH, 06 ;número da função
MOV AL, 00 ;número de linhas a serem roladas para cima
MOV BH, 30H ;fundo ciano, primeiro plano preto
MOV CH, 0 MOV ;coordenada da linha inicial = 0
CL, 0 MOV DH, ;coordenada da coluna inicial = 0
24 MOV DL, 79 ;coordenada da linha inicial = 24
INT 10H ;coordenada da coluna inicial = 79

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.

iv) INT 10 H Função 09 – Exibe caractere com atributo na posição do cursor.


Esta função exibe um caractere na posição do cursor.
AL = caractere ASCII, BH = número da página, BL = atributo byte, CX = contagem
MOV AH, 09 ;número da função
MOV AL, 'S' ;exibe 'S' na posição do cursor
MOV BH, 0 ;página 0
MOV BL, 16H ;fundo azul, primeiro plano marrom
MOV CX, 9 ;exibe o personagem 9 vezes
INT 10H

O segmento de programa acima exibe 'S', nove vezes começando na posição do cursor.
Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 267

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.

ii) Faz uma janela de tamanho e cor especificados.


iii) Coloca o cursor em uma posição especificada dentro da janela.
iv) Exibe 10 vezes o caractere '*' na posição do cursor.

Solução

.MODELO PEQUENO
.CÓDIGO
.COMECE

MOV AH, 0 ;defina o modo de


MOV AL, 3 vídeo ;modo 3, modo de texto normal
INT 10H ;limpar tela

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

MOV AH, 02 ;número da função para definir o cursor


MOV BH, 0 ;número da página = 0
MOV DH, 09 ;coordenada linha do cursor
MOV DL, 39 ;coordenada da coluna do cursor
INT 10H ;cursor em (9, 39)

MOV AH, 09 ;função para exibir o caractere


MOV AL, '*' ;caractere a ser exibido = '*'
MOV BH, 0 ;número de página
MOV BL, 16H ;azul com texto marrom
MOV CX, 10 ;conta = 10
INT 10H ;exibe o personagem 10 vezes
.SAÍDA
FIM

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

268 OS MICROPROCESSADORES x86

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:

i) Corrija a posição inicial do cursor. Escreva o primeiro caractere lá.

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

SET_C LINHA MACRO ;macro para posicionamento do cursor


MOV AH, 02 ;função para configurar o cursor
MOV BH, 0 ;página 0
MOV DH, LINHA ;especifique a coordenada da linha
MOV DL, COL ;especifique a coordenada da coluna
INT 10H
AUTO

MOSTRAR MACRO CH ;macro para exibir o caractere


MOV AH, 09 ;função para exibição
MOV BH, 0 ;página 0
MOVIMENTO BL, 0E9H ;piscando, fundo marrom, texto azul
MOV AL, CH ;o caractere a ser exibido
MOV CX, 1 ;exibe o personagem apenas uma vez
INT 10H ;limpar tela
AUTO

MOV AH, 0 ;defina o modo de vídeo e limpe a tela


MOV AL, 3 ;modo 3
INT 10H
Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 269

SET_C 11 ;coloca o cursor na linha 11


DISP 'H' ;exibe 'H'
SET_C 12 ;coloca o cursor na linha 12
DISP 'E' ;exibe 'E'
SET_C 13 ;coloca o cursor na linha 13
DISP 'L' ;exibe 'L'
SET_C 4 ;coloca o cursor na linha 14
DISP 'L' ;exibe 'L' ;coloca o
SET_C 15 cursor na linha 15
DISP 'O' 'exibe 'O'

.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

MOV AH, 0 ;defina o modo de


MOV AL, 02 vídeo ;modo = 2
INT 10H ;limpar a tela depois de definir o modo
MOV AH, 09 ;função de exibição
MOV BH, 0 ;página 0
MOV BL, 22H ;fundo verde com primeiro plano verde
MOV CX, 2000 ;número de caracteres = 2000
INT 10H

Ú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

270 OS MICROPROCESSADORES x86

8,8 | Endereçamento direto da memória de vídeo


Agora, vamos tentar endereçar a RAM de vídeo, que é como qualquer outra RAM. Sabemos que o endereço
inicial da memória de vídeo para exibição CGA é B800:0000. Tentaremos exibir nossos dados sem usar o
BIOS, em vez disso, gravamos dados diretamente na RAM de vídeo, o que causa a exibição dessas
informações. Vamos tentar fazer com que toda a tela da página 0 apareça em verde. Para isso é carregado
no AX um número de 16 bits com o atributo byte e caractere ASCII. Esta palavra é escrita nas 2000
localizações (25 × 80 caracteres) a partir do endereço B800H. Usando instruções de string, esta exibição
pode ser facilmente realizada.

Exemplo 8.8
.MODELO PEQUENO
.CÓDIGO
.COMECE
MOV AH, 0
MOV AL, 3
INT 10H ;é usado para limpar a tela

CLD ;limpar sinalizador de direção


MOV AX, 0B800H ;endereço inicial da memória de vídeo
MOVE ES, AX ;torna a memória de vídeo o segmento extra
MOV DI, 0 ;para apontar para o primeiro local em ES
MOV CX, 25*80 ;personagens na tela (2000)
MOV AH, 29H ;atributo para fundo verde
MOV AL, 20H ;código ASCII da tecla da barra de espaço
REP STOSW ;armazena esses dados nos 2000 locais
.SAÍDA
FIM

Vamos discutir o esquema do Exemplo 8.8.


i) Primeiro, toda a tela é limpa usando INT 10H, função 00.
ii) Em seguida, usamos instruções de string para endereçar a memória de vídeo. O registrador ES é carregado com o
endereço inicial da memória de vídeo.
iii) DI é carregado com o off set 0.

iv) CLD é para auto-incrementar este ponteiro.


v) O STOSW (store string word) é repetido 2000 vezes, ou seja, o conteúdo do AX é armazenado em todas
as localizações da página 0 da memória de vídeo. Para usar a instrução STOSW, a memória de destino
deve ser definida como o 'segmento extra' e deve ser apontada por DI. Isso foi feito aqui.

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

A ESTRUTURA INTERROMPIDA DE 8086 271

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'

MOV AH, 0 ;defina o modo de


MOV AL, 03 vídeo ;modo = 2
INT 10H ;limpar a tela depois de definir o acima

CLD ;limpar sinalizador de direção


MOV AX, 0B800H ;endereço inicial da memória de vídeo
MOVE ES, AX ;torna a memória de vídeo o segmento extra
MOV DI, 0 ;aponta para o primeiro local em ES
MOV CX, 25*80 ;personagens na tela (2000)

MOV AH, 0A9H ;fundo verde, texto azul piscando


MOV AL, 20H ;código ASCII da tecla da barra de espaço
REP STOSW ;armazenar isso nos 2000 locais
;a tela agora está verde

MOV AX, 0B800H ;endereço inicial da memória de vídeo


MOV ES, AX ;torna a memória de vídeo o ES
MOV DI, 2000 ;aponta para o centro da tela
MOV SI, OFFSET MESG ;SI para apontar para a mensagem
MOV AH, 0A9H ;fundo verde, texto azul piscando
MOV CX, 11 ;caracteres na mensagem = 11
COMEÇAR:
LODSB ;carrega cada caractere em AL
STOSW ;armazena cada palavra na memória de vídeo
INÍCIO DO LOOP ;repete até CX = 11
.SAÍDA
FIM

As principais características deste programa:

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

272 OS MICROPROCESSADORES x86

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.

8,9 | Interface de teclado


Em seguida, vamos usar as interrupções do BIOS para o teclado do computador. Para isso, primeiro temos
que entender o teclado do computador, bem como o hardware associado ao teclado.

8.9.1 | Teclado de computador


Todos nós estamos familiarizados com o teclado do PC, que é mais ou menos padrão. No entanto, o teclado
que é uma das partes mais importantes (mas tidas como garantidas) do PC nem sempre foi assim. No primeiro
IBM PC e PC-XT, havia 83 teclas. Mais tarde, o teclado PC-AT tinha o mesmo número de teclas, mas a
disposição das teclas era diferente. Depois de levar em consideração várias idéias de design, o teclado do PC
atual foi projetado para ter 101 teclas, incluindo as teclas de função F1 a F12. Isso é chamado de 'teclado
aprimorado'. Estamos todos muito acostumados com o teclado do PC, mas nem todos conhecem realmente as
funções de cada tecla. Então, vamos começar com uma discussão sobre as teclas do teclado.

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

A ESTRUTURA INTERROMPIDA DE 8086 273

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.

8.9.2 | Hardware do teclado


Agora, vamos discutir o hardware associado ao teclado de um PC moderno. O teclado junto com o hardware
envolvido é uma parte bastante complicada, mas aqui a tentativa será apresentá-lo de forma simples com detalhes
importantes cobertos e mais detalhes deixados para serem referidos de outras fontes.

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.

8.9.2.1 | Controlador de teclado


O teclado que está conectado à placa-mãe por meio de um cabo possui um microcontrolador, que pertence à
família 8042. Na placa-mãe, existe outro microcontrolador semelhante (ou sua emulação, como nos tempos atuais)
e eles se comunicam através de um protocolo de comunicação serial bidirecional.

8.9.2.2 | Código de digitalização

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

274 OS MICROPROCESSADORES x86

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.

8.9.3 | Tipo de interrupção do teclado 09


Na Tabela 8.2, vemos que a interrupção do tipo número 09 foi alocada ao teclado na linha IRQ1. Assim, esta é
uma interrupção de hardware. A linha IRQ significa 'interrupt request line 1' do PIC/8259 (consulte o Capítulo 10)
que é vetorizado para o tipo 9 da tabela de vetores de interrupção.
Assim, quando uma tecla é pressionada, seu código de varredura é enviado para a placa-mãe em formato serial,
e então convertido para o formato paralelo e este código de varredura de 8 bits é apresentado à porta A do 8255
(consulte o Capítulo 9) com I/ O endereço 60H, e junto com isso, é ativada a linha IRQ1, que foi vetorizada para
INT 9.

8.9.3.1 | Rotina BIOS INT 09


O que é a rotina INT 09?

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

A ESTRUTURA INTERROMPIDA DE 8086 275

D7 Inserir chave alternada

D6 Tecla Caps Lock alternada

D5 Tecla num lock alternada

D4 Tecla de bloqueio de rolagem alternada

D3 Alt pressionado

D2 Ctrl pressionado

D1 Tecla shift esquerda pressionada

D0 Tecla shift direita pressionada


(uma)

Nota O bit correspondente é '1' para as teclas pressionadas ou alternadas.

Figura 8.6a | Primeiro byte de status do teclado

D7 Tecla Inserir pressionada

D6 Tecla Caps Lock pressionada

D5 Tecla num lock pressionada

D4 Tecla de bloqueio de rolagem pressionada

D3 Ctrl Num lock (pausa) pressionado

D2 Sys Req pressionado

D1 Tecla Alt esquerda pressionada

D0 Tecla Ctrl esquerda pressionada


(b)
Nota O bit correspondente é '1' para as teclas mantidas pressionadas.

Figura 8.6b | Segundo byte de status do teclado

8.9.4 | Funções do BIOS 16H


Algumas interrupções do BIOS para controle do teclado são apresentadas aqui. Algumas das
primeiras funções do BIOS atendiam apenas ao antigo teclado de 83 teclas. Mais tarde, mais
algumas funções do BIOS foram adicionadas ao teclado aprimorado. i) AH = 0 ou AH = 10H. O
primeiro número de função é para o teclado 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. Por
Machine Translated by Google

276 OS MICROPROCESSADORES x86

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

MOVIMENTO AH, 10H


INT 16H
MOV AH, 12H
INT 16H

.SAÍDA
FIM

Solução

Existem duas funções de interrupção no programa acima.

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.

ii) A função com AH = 12H, fornece o byte de status do teclado em AL.


Sem as teclas shift, alt ou control pressionadas, AL = 0.
Com CAPSLOCK ativado, NUMSLOCK ativado e a tecla Shift esquerda pressionada, o valor em AL = 62H ou
seja, 0110 0010B.
Mantenha a tecla shift esquerda pressionada e verifique o conteúdo da área de dados do BIOS 0040:0017.

-d0040:0017
0040:0010 62-00

Encontramos a primeira bandeira de status do teclado salva lá.


Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 277

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.

8.10 | Conectando uma interrupção

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.

8.10.1 | Terminar e Permanecer Residente


O DOS usa uma parte dos 640K de RAM na área inferior da memória, e a quantidade exata disso varia de
versão para versão. Sempre que um programa aplicativo é executado, uma parte da RAM é alocada ao
aplicativo. Depois disso, o programa é abandonado e a memória alocada é liberada e marcada como
disponível para outros programas. Se isso não for feito, o valor
Machine Translated by Google

278 OS MICROPROCESSADORES x86

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.

8.10.2 | Funções do DOS para ganchos de interrupção

Existem três funções que usaremos para conectar um vetor de interrupção.

i) INT 21H, Função 35H – Obter Vetor de Interrupção.

Obtenha o valor definido de segmento desligado de um vetor de interrupção.


Entrada: AL = número da interrupção. Saída: ES:BX = endereço do manipulador de interrupção.
Quando tentamos fazer com que nosso novo ISR seja apontado por um determinado vetor de interrupção, existe
a possibilidade de já existir um ISR anterior usando esse número de tipo. Portanto, temos que salvar o valor de
CS:IP desse manipulador de interrupção. Isso será necessário para restaurar o estado anterior da tabela de vetores
de interrupção. Isto é feito pela Função 35H.

ii) INT 21H, Função 25H – Definir Vetor de Interrupção.

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.

iii) INT 21H, Função 31H – Terminar e permanecer residente.

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

A ESTRUTURA INTERROMPIDA DE 8086 279

MOV CH, 0 ;coordenada linha = 0


MOV CL, 0 ;coordenada da coluna = 0
MOV DH, 24 ;coordenada linha = 24
MOV DL, 79 ;coordenada da coluna = 79
INT 10H
ele iria
NOVO60 ENDP

INICIAR: MOV AX, 3560H ;pega vetor de interrupção do tipo 60H


INT 21H
MOV WORD PTR ANTIGO, BX ;salva IP antigo em OLD
MOV WORD PTR OLD + 2, ES ;salva CS antigo em OLD + 2

MOV DX, OFFSET NOVO60 ;ISR apontado pelo vetor 60H


MOV AX, 2560H ;AL = 60H, AH = 25H
INT 21H

MOV DX, COMEÇO DE COMPENSAÇÃO ;encontra o número de parágrafos


MOV CL, 4 ;divide por 16, deslocando 4 vezes
SHR DX, CL ;Para a direita
INC DX ;adicione 1 a ele
MOV AX, 3100H ;sair com AH = 31H em vez de 4CH
INT 21H ;isso torna o NEW60 residente
FIM

Vamos examinar as características salientes do Exemplo 8.12.


i) Este programa instala um novo ISR correspondente ao vetor tipo 60H. Está fora do set NEW60.
Isso significa que o CS e o IP deste programa (ISR) devem ser instalados na posição correspondente
na tabela de vetores de interrupção.
ii) O novo ISR é um programa denominado NEW60. Ele faz o trabalho de tornar a tela ciano em cores. Ele
termina com a instrução IRET e é definido como um procedimento distante. iii) O programa para salvar o
antigo CS e IP e instalar o novo CS e IP começa em
a etiqueta INICIAR.

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.

v) A função AH = 25H instala o CS e IP do NEW60 no IVT.

vi) A função AH = 31H torna o programa NEW60 residente.


vii) Note que o programa não termina com AH = 4CH mas tem que terminar com AH = 31H.
A próxima questão é como invocar este programa que agora instalamos. Como o instalamos no local tipo 60H
do IVT, podemos invocá-lo pela instrução INT 60H como no Exemplo 8.15.
Machine Translated by Google

280 OS MICROPROCESSADORES x86

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.

O que é um Programa de Reentrada?

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.

8.10.3 | Conectando-se a interrupções de hardware

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:

i) Substitui a rotina normal associada a INT 9.


ii) A tecla de atalho utilizada é Alt+F10. Para verificar esta combinação, primeiro é utilizada a rotina INT
16H com AH = 12H, para verificar a tecla ALT. Th é testes para o bit D3 dos dados em AL
Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 281

(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

MOV AH, 12H ;função AH = 12H, KB s/w interrupção


INT 16H ;entra no AL o byte de status kb
TESTE AL, 08 ;verifica se D3 está alto
JZ ACIMA ;se não, vá para OVER
EM AL, 60H ;ler porta paralela
CMP AL, 44H ;comparar AL com o código de varredura de F10
JNE OVER ;se não for igual, vá para OVER
MOV AH, 0 ;o seguinte é o programa pop-up
MOV AL, 3
INT 10H ;defina o modo de vídeo e limpe a tela

MOV AH, 06 ;função para janela de rolagem


MOV AL, 07 ;nº de linhas = 7
MOV BH, 66H ;atributo byte
MOV CH, 0CH
MOV CL, 19H
MOV DH, 12H
MOV DL, 36H
INT 10H ;este programa configura uma janela de vídeo

ACIMA: POP AX
JMP CS:ANTIGO
NEWINT9 ENDP

INÍCIO: MOV AH, 35H ;salva vetor de interrupção antigo


MOV AL, 09 ;o número do tipo = 9
INT 21H ;interrupção do DOS para obter vetor
Machine Translated by Google

282 OS MICROPROCESSADORES x86

MOV WORD PTR OLD, BX ;salvar IP antigo


MOV WORD PTR OLD+2, ES ;salva CS antigo
MOV AH, 25H ;instala novo vetor
MOV AL, 09 ;no tipo número 9
MOV DX, OFFSET NEWINT9 ;aponta DX para o novo ISR
INT 21H

MOV DX, OFFSET START ;conta o número de parágrafos


MOV CL, 4
SHR DX, CL
INC DX
MOV AX, 3100H ;tornar o programa residente
INT 21H
FIM

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?

NOVOINT9 PROC FAR


EMPURRAR MACHADO
;tecla de atalho é Ctrl+F3
MOV AH, 12H
INT 16H
TESTE AL, 04 ;teste se a tecla Ctrl é pressionada
JZ ACIMA
EM AL, 60H
CMP AL, 3DH ;teste para o código de varredura de F3
JNE OVER

MOV AH, 0 ;o novo ISR para Int 9


MOV AL, 3 ;isso deixa a tela verde
INT 10H
CLD
MOV AX, 0B800H
MOVE ES, AX
MOV DI, 0
MOV CX, 25*80
MOV AX, 2920H
REP STOSW

ACIMA: POP AX
JMP CS:ANTIGO
NEWINT9 ENDP
Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 283

INÍCIO: MOV AH, 35H


MOV AL, 09
INT 21H
MOV WORD PTR ANTIGO, BX
PALAVRA DE MOVIMENTO PTR ANTIGO+2, ES

MOV AH, 25H


MOV AL, 09
MOV DX, OFFSET NEWINT9
INT 21H

MOV DX, COMEÇO DE COMPENSAÇÃO


MOV CL, 4
SHR DX, CL
INC DX
MOV AX, 3100H
INT 21H
FIM

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

DISP MACRO SYMB ;macro para exibir um caractere


CSET
MOV AH, 09 ;para exibir o caractere
;na posição do cursor
MOV AL, SYMB ;exibe SYMB na posição do cursor
MOV BH, 0 ;página = 0
MOV BL, 04AH ;atributo byte
MOV CX, 1 ;exibe o personagem uma vez
INT 10H
AUTO
Machine Translated by Google

284 OS MICROPROCESSADORES x86

NEWINT9 PROC FAR ;o ISR a ser instalado.


EMPURRAR MACHADO

MOV AH, 12H ;AH = 12H, kb s/w interrupção


INT 16H ;entra em AL, kb status byte
TESTE AL, 08h ;verifica se D3 é tecla alta - alt
JZ ACIMA ;se não, vá para OVER
TESTE AL, 04h ;verifica se D2 é alto - tecla ctrl
JZ ACIMA ;se não, vá para OVER
EM AL, 60H ;ler porta paralela
CMP AL, 17H ;compare AL com o código de varredura de i
JNE OVER ;se não for igual, vá para OVER
;o seguinte é o programa pop-up
MOV AH, 0
MOV AL, 3
INT 10H ;defina o modo de vídeo e limpe a tela
MOV AH, 06 ;função para uma janela de rolagem
MOV AL, 07 ;nº de linhas = 7
MOV BH, 4ah ;atributo byte
MOV CH, 0
MOV CL, 18
MOV DH, 6
MOV DL, 61
INT 10H ;janela de vídeo de (0, 18) a (6, 61)
;exibe valores com a posição do cursor

MOV DL, 20
MOV DH, 2
DISP 'A'
DISP 'N'
DISP 'U'
DISP 'R'
DISP 'A'
DISP 'G'
CSET

ACIMA: POP AX ;estalando AX


JMP CS:ANTIGO
NEWINT9 ENDP ;fim do ISR
;programa principal
INÍCIO: MOV AH, 35H ;salva vetor de interrupção antigo
MOV AL, 09 ;o número do tipo = 9
INT 21H ;interrupção do DOS para obter vetor
MOV WORD PTR OLD, BX ;salvar IP antigo
MOV WORD PTR OLD+2, ES ;salva CS antigo
MOV AH, 25H ;instala novo vetor
MOV AL, 09 ;no tipo número 9
MOV DX, OFFSET NEWINT9 ;aponta DX para o novo ISR
INT 21H
MOV DX, COMEÇO DE COMPENSAÇÃO ;conta o número de parágrafos
Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 285

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.

8.10.3.1 | Códigos de digitalização do PC†

Tabela 8.7 | Códigos de digitalização de PC para teclado PC/XT de 83 teclas

Chave Hex Chave Hex Chave Hex Y e Y Chave Hexagonal

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)

0F aba 23 Heh 37 PrtSc e * 4B 4 e seta para a esquerda

10 QeQ 24 Jej 38 Tudo 4C 5 (teclado)


11 W e w 25 Kek 39 Barra de espaço 4D 6 e Seta Direita
12 Eee 26 Lel 3A Caps Lock 4E + (cinza)
13 Rer 27 :e; 3B F1 4F 1 e Fim
14 Tet 28 "e' 3C F2 50 2 e seta para baixo
51 3 e PgDn
52 0 e Ind
53 . e Del

† Tabela 8.7–8.9: Reimpressão cortesia da International Business Machines Corporation, copyright © International
Business Machines Corporation.
Machine Translated by Google

286 OS MICROPROCESSADORES x86

Tabela 8.8 | Códigos de leitura de chave de combinação

Chaves hexadecimais Chaves hexagonais Chaves hexagonais Chaves hexagonais

54 Mudar F1 60 Ctrl F3 6C Alt F5 78 Tudo 1

55 Turno F2 61 Ctrl F4 6D Tudo F6 79 Tudo 2

56 Mudar F3 62 Ctrl F5 6E Tudo F7 7A Tudo 3

57 Mudar F4 63 Ctrl F6 6F Tudo F8 7B Todos os 4

58 Mudar F5 64 Ctrl F7 70 Alt F9 7C Todos os 5

59 Mudar F6 65 Ctrl F8 71 Tudo F10 7D Todos os 6

5A Turno F7 66 Ctrl F9 72 Ctrl PrtSc 7E Total 7

5B Mudar F8 67 Ctrl F10 73 Ctrl Seta Esquerda 7F Total 8

5C Turno F9 68 Tudo F1 74 Ctrl Seta Direita 80 Total 9

Mudança 5D F10 69 Alt F2 75 Ctrl Fim 81 Total 10

5E Ctrl F1 6A Alt F3 76 Ctrl PgDn


5F Ctrl F2 6B Tudo F4 77 Ctrl Início

Tabela 8.9 | Códigos de leitura de teclado estendido

Chaves hexagonais Chaves hexagonais Chaves hexagonais Hex Chaves

85 F11 8E Ctrl- 97 Alt Home A0 Seta Alt Down

86 F12 8F Ctrl 5 98 Alt UpSeta A1 Tudo PgDn


87 Turno F11 90Ctrl + 99 Todas as páginas A2 Alt Inserir

88 Turno F12 91 Ctrl Seta para baixo 9A A3 Tudo Excluir

89 Ctrl F11 92 Ctrl Inserir 9B Alt Seta Esquerda A4 Tudo /

8A Ctrl F12 93 Ctrl Excluir 9C A5 Todas as perdas

8B Alt F11 94 Guia Ctrl 9D Alt RightSeta A6 Todos entram

8C Alt F12 95 Ctrl / 9E

8D Ctrl Seta para cima 96 Ctrl * 9F Fim de tudo

PONTOS-CHAVE DESTE CAPÍTULO

| Sempre que o processador está executando uma tarefa, ela pode ser interrompida por outros programas ou periféricos solicitando serviço.

| O 8086 responde a uma interrupção de maneira padrão, independentemente da fonte da interrupçã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.

| Muitos tipos de interrupção são usados pelo BIOS e DOS.

| As funções do BIOS 10H são comumente usadas para funções de exibição.

| Também é possível endereçar a memória de vídeo diretamente.


Machine Translated by Google

A ESTRUTURA INTERROMPIDA DE 8086 287

| Para exibição em modo texto, cada caractere precisa de dois bytes, um para o código ASCII e outro para o
atributo.

| As funções do BIOS 16H são usadas para acessar o teclado.

| A interrupção de hardware 09 é usada pelo teclado do PC.

| É possível ligar interrupções usando algumas funções padrão do DOS.

| Os programas TSR são programas pop-up que residem na memória.

| 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?

2. Quantas interrupções de hardware e software o 8086 pode suportar?

3. Explique os termos 'rotina de serviço de interrupção' e 'vetor de interrupção'.

4. A interrupção de hardware INTR é chamada de interrupção não vetorial. Por quê?

5. Liste as interrupções reservadas pela Intel.

6. Explique a sequência de ações que ocorrem em um ciclo de confirmação de interrupção.

7. O que acontece se ocorrerem várias interrupções ao mesmo tempo?

8. O que significa o byte 'atributo' com referência à exibição de texto em vídeo?

9. Liste algumas funções do BIOS usadas para ativação do monitor.

10. Liste algumas funções do BIOS usadas para teste de teclado.

11. O que significa a palavra TSR?

12. Por que as interrupções do DOS não podem ser usadas em programas TSR?

EXERCÍCIO

1. Encontre o endereço no IVT para as interrupções dos tipos 102H e 200H.

2. Localize o byte de atributo e o byte de caractere para os seguintes casos. a) Exibindo


'&' em um fundo azul e em primeiro plano vermelho. b) Exibindo 'O' com fundo
vermelho piscando e texto amarelo.

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.

Imagem de abertura do capítulo: um chip PPI.


Machine Translated by Google

290 OS MICROPROCESSADORES x86

9.1 | Kit do treinador


Lembre-se de que os PCs atuais não usam o processador 8086 e, portanto, não podemos usar o PC para um entendimento de
primeiro nível da interface. No entanto, o PC usa muitos chips de interface em seu 'chipset'. Agora, vamos tentar entender a ideia de
'interface' usando um kit de treinamento que foi projetado para fins educacionais. Como o nome indica – terá todos os componentes
de hardware e software para 'treinamento'. O kit de treinamento usado aqui tem as seguintes especificações (ver Fig 9.1).

Características

1. CPU Intel 8086 com velocidade de clock de 4,77 MHz.

2. 16 KB para monitor EPROM atualizável para 64 KB.

3. 16 KB de RAM expansível até 64 KB.

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.

8. Pacote de comunicação serial para conectar o PC e o kit

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.

Figura 9.1 | O kit do treinador


Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 291

9.2 | Interface Periférica Programável (PPI)-8255A


Este chip também é chamado de chip de porta paralela e facilita os problemas e questões relacionados à
transferência paralela de dados. A transferência paralela de dados é o que temos feito todo esse tempo.
Transferimos 8/16 bits de uma só vez para/da memória ou dispositivos de E/S. Os dispositivos de E/S que
discutimos (Capítulo 7) eram bastante simples e precisavam apenas de um sinal de controle de leitura/gravação
e um pulso selecionado gerado durante o ciclo de leitura/gravação. No entanto, quando os dispositivos de E/S
são mais versáteis e possuem mais recursos, um PPI será muito útil, especialmente quando mais de um
dispositivo de E/S deve ser conectado ao processador. Quando este chip é usado, suas funções são suficientes
para garantir que, normalmente, nenhum outro hardware extra seja necessário para fazer interface com
dispositivos periféricos que realizam transferências paralelas de dados. O chip 8255A é uma versão mais
avançada do 8255 original, mas como o original é obsoleto, vamos simplesmente nos referir a este chip como o
chip de porta paralela 8255.

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

Figura 9.2 | As conexões entre um 8086, 8255 e três periféricos


Machine Translated by Google

292 OS MICROPROCESSADORES x86

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.

9.2.1 | Configuração de pinos e diagrama de bloco interno


A Figura 9.3 mostra a configuração dos pinos da versão DIP (dual-in-line) do chip. Vemos que ele possui 40 pinos,
que consistem em três portas de 8 bits denominadas Porta A (PA), Porta B (PB) e Porta C (PC), cada uma das quais
pode ser programada como portas de entrada ou saída. A Figura 9.4 mostra o diagrama de blocos interno do chip. É
visto como consistindo de vários blocos funcionais, e vamos dar uma olhada rápida em cada um dos blocos.

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

Figura 9.3 | Diagrama de pinos de 8255


Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 293

grupo A grupo A PA0–PA7


Ao controle Porta A

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

Figura 9.4 | Diagrama de bloco interno do 8255

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

294 OS MICROPROCESSADORES x86

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

Figura 9.5 | Decodificação de endereços e conexões entre o 8086 e o 8255

Tabela 9.1 | Seleção de porta para o 8255 usando os pinos A0 e A1


CS A1 A0 Entidade selecionada
0 0 0 Porta A

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

INTERFACE PERIFÉRICO ÿ I 295

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

Entidade Endereço (hex)

Registro de controle C6
Porta A C0
Porta B C2
Porta C C4

9.2.2 | Programando o PPI


Como o chip é programado e quais são as opções disponíveis?
A programação do chip envolve apenas a escrita de uma determinada palavra no registrador de controle.
O registrador de controle é um registrador de 8 bits que pode ser escrito. Os bits desta palavra (chamada
palavra de controle) decidirão a forma como as portas do chip serão configuradas. Para entender isso, vamos
dar uma olhada no formato da palavra de controle (consulte a Fig 9.6).
Como visto neste e também no diagrama de blocos, as portas A, B e C são agrupadas em dois – Grupos
A e B. O Grupo A consiste na Porta A e nos 4 bits superiores (PC4–PC7) da Porta C. O Grupo B então
obviamente inclui a Porta B e a Porta C inferior (PC0–PC3). A divisão em grupos nos dá apenas uma
informação – é que as portas do Grupo A podem ter três modos de operação (0, 1 e 2), mas as portas do
Grupo B têm apenas dois modos de operação.

D7 D6 D5 D4 D3 D2 D1 D0
grupo A Grupo B

1=Modo E/S Porta C


0=Modo BSR (Inferior: PC3–PC0)
1=Entrada; 0=Saída
Seleção de modo
00=Modo 0 Porta B
01=Modo 1
1=Entrada; 0=Saída
10=Modo 2

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

Figura 9.6 | Formato de palavra de controle de 8255


Machine Translated by Google

296 OS MICROPROCESSADORES x86

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.

9.3 | Modos de operação


O 8255 pode funcionar em três modos, conforme decidido pelo projetista do sistema. Eles são:

Modo 0: entrada/saída básica


Modo 1: entrada/saída estroboscópica
Modo 2: barramento bidirecional

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:

i) Duas portas de 8 bits e duas portas de 4 bits.

ii) Qualquer porta pode ser de entrada ou saída.

iii) As saídas são travadas (ref Seção 7.4.1 para o motivo disso).

iv) As entradas não são travadas.

v) 16 diferentes combinações de entrada/saída possíveis.

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

Consulte a Fig. 9.6.

Como estamos usando o modo I/O (em vez do modo BSR), D7 = 1


Ambos os grupos devem estar no modo 0. Portanto, D6 D5 = 00 e D2 = 0
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 297

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

Figura 9.7 | Conexão de interruptores e LEDs a um 8255


Machine Translated by Google

298 OS MICROPROCESSADORES x86

Agora, vamos discutir os passos no programa que serão executados:


i) As portas e os endereços dos registradores de controle receberam rótulos e serão especificados
usando a diretiva EQU. Como os endereços de porta têm apenas 8 bits, o endereçamento de porta
fixo pode ser usado.

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:

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A
PB EQU 0C2H ;endereço do Porto B
PC EQU 0C4H ;endereço da Porta C

MOV AL, 8AH ;mover palavra de controle para AL


OUT CR, AL ;envia para o registrador de controle
EM AL, PB ;obtém o status do switch da porta i/p B
OUT PA, AL ;envia para os LEDs na porta o/p A
EM AL, PC ;leve as configurações do switch da Porta C
MOV CL, 04 ;CL = 4
ROR AL, CL ;gire AL 4 vezes para a direita
OUT PC, AL ;os dados estão na parte inferior do PC
;emiti-lo para os LEDs lá
FIM ;fim do arquivo de montagem

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.

9.4.1 | Interface de portas de E/S de 16 bits com o 8255


Todo o acima é para uma porta para a qual apenas dados de 8 bits devem ser transferidos de D0 para D7 do
barramento de dados do processador. Como nosso processador (8086) tem uma largura de barramento de
dados de 16 bits, é bem possível que às vezes ele precise enviar/receber 16 bits através de uma porta paralela
quando a porta tiver uma largura de barramento de dados de 16 bits. Isso exigirá a necessidade de dois chips
do PPI (ver Fig 9.8).
Lembre-se da discussão sobre bancos de memória e bancos de E/S. Os dados de 16 bits devem ser
organizados em dois bancos de 8 bits, um banco superior e um banco inferior. Quando os dados devem ser
acessados através das linhas de dados superiores, o processador faz arranjos para diminuir a linha BHE . Este é
usado para decodificar o endereço do banco superior, conforme mostrado na figura. Assim, para transferir dados
de 16 bits, ambos os PPIs serão habilitados. Com a mesma lógica de decodificação do Exemplo 9.2, os endereços
das portas de cada um dos PPIs podem ser enumerados e deixados para o leitor interessado. Todos os dispositivos
de E/S que discutiremos mais adiante são aqueles com apenas barramento de dados de 8 bits, e usaremos a Fig
9.5 como nossa referência.
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 299

A2 A1
A1 A0
PA0–PA7

Byte baixo de dados


8255
D0–D7 PB0–PB7

(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

Figura 9.8 | Interface de porta de 16 bits usando dois PPIs

Exemplo 9.4 Gere

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

Como a frequência de clock é de 4,77 MHz, um período de clock = 0,21 µseg O


atraso deve ser de 1 mseg Tempo de atraso total = 1 mseg = 20 N × 0,21 µseg
Para um atraso de 1 mseg, o valor de N = [1 mseg/(20
× 0,21 ÿsegs)] = 238 ou EEH
Machine Translated by Google

300 OS MICROPROCESSADORES x86

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.

PA EQU 0C0H ;endereço da Porta A


CR EQU 0C6H ;endereço do registro de controle

MOV AL, 80H ;palavra de controle para saída da porta A


OUT CR, AL ;envia para o registro de controle
VOLTAR: MOV AL, 0 ;AL = 0
OUT PA, AL ;enviá-lo para a porta A
ATRASO DE CHAMADA ;chama um atraso de um ms
ATRASO DE CHAMADA ;chama um atraso de um ms

MOV AL, 0FFH ;AL = FFH


OUT PA, AL ;enviá-lo para a porta A
ATRASO DE CHAMADA ;chama um atraso de 1 ms
JMP VOLTAR ;repetir
PROC DE ATRASO PRÓXIMO ;programa de atraso
MOV CX, 0EEH ;N = SIM
AQUI: NÃO
LOOP AQUI
CERTO

ENDP
FIM

9.4.2 | Modo de reinicialização do conjunto de bits

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:

i) PC0 a ser definido

ii) PC7 a ser reiniciado


iii) PC1 a ser definido
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 301

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

Figura 9.9 | Formato da palavra de controle BSR

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

PC7 a ser reiniciado 0 iii) 0 0 0 1 1 1 0 = 0EH

PC1 a ser configurado 0 0 0 0 0 0 1 1 = 03

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 é

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A
PC EQU 0C4H ;endereço da Porta C
Machine Translated by Google

302 OS MICROPROCESSADORES x86

MOV AL, 90H ;palavra de controle


OUT CR, AL ;envia para o registrador de controle
EM AL, PA ;recebe dados através da porta A
CMP AL, 7FH ;comparar com 7FH
E BAIXO ;se AL > 7FH, vai para LOW
MOV AL, 0EH ;AL < 7FH, escreva uma palavra para PC7 = 0
OUT CR, AL ;envia para o registrador de controle
JMP HIT ;vai sair
BAIXO: MOV AL, 0FH ;AL > 7F, palavra BSR para PC7 = 1 em AL
OUT CR, AL ;envia para o registrador de controle
XIT:
FIM ;encerra 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.

Para entendê-lo completamente, precisamos separar os casos de entrada e saída.

9.5.1 | Modo de entrada estroboscópica

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

INTERFACE PERIFÉRICO ÿ I 303

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

Entrada da Porta A PC6, 7

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

Figura 9.11 | Formas de onda de tempo para o modo de entrada estroboscópica


Machine Translated by Google

304 OS MICROPROCESSADORES x86

9.5.2 | Modo 1: Saída Strob De maneira


semelhante, a saída do Modo 1 usa os pinos da Porta C como mostrado na Fig 9.12. O diagrama de
tempo para transferência de dados é como na Fig 9.13. Vamos discutir as definições dos sinais de
aperto de mão aqui.
i) OBF (Output Buffer Full): Quando o processador escreve um byte de dados no latch
de saída do 8255, este sinal fica baixo. Indica que esses dados podem ser lidos no
periférico. Ele vai alto quando o periférico pega os dados e os reconhece. ii) ACK: Este
é o sinal dado por um periférico quando este aceita os dados do 8255A. Um 'baixo' nesta
entrada informa ao 8255 que os dados da porta foram aceitos. Em essência, uma
resposta do dispositivo periférico indicando que recebeu os dados de saída da CPU.

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

OBFA 101 0 0X 1/0 1


PC7

Ai
PC6

Modo de E/S
Saída da Porta B

PC3
INTRA Porta A Modo 1 Porta B Modo 1

Saída da Porta A PC4, 5

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

INTERFACE PERIFÉRICO ÿ I 305

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

Figura 9.13 | Forma de onda de tempo para o modo de saída estroboscópica

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

OBFA START I/OI /O ENTER INTEB OBFB INTRB

GRUPO A GRUPO B

Figura 9.14 | Status da Porta C para configurações de entrada e saída do Modo 1


Machine Translated by Google

306 OS MICROPROCESSADORES x86

PA7–PA0
8

RD
PC4 STBA

PC5 IBFA
PALAVRA DE CONTROLE

D7 D6 D5 D4 D3 D2 D1 D0

0 1 11 1/0 1 0 PC3 INTRA

PC6, 7 E/S
PC6, 7

1=ENTRADA
0=SAÍDA PB0–PB7 8

WR
PC1 OFB

PC2 ACKB

PC0 INTRB

PORTA A - (ENTRADA ESTROMBADA)

PORTA B - (SAÍDA ESTROMBADA)

Figura 9.15 | Porta A na entrada estroboscópica e Porta B no modo de saída estroboscópica

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

para encontrar o estado do sinal IBFA e OBFB .

Solução

Consulte a Fig 9.4 ou Fig 9.15 para projetar a palavra de controle.


A palavra de controle é assim

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

INTERFACE PERIFÉRICO ÿ I 307

D7 D6 D5 D4 D3 D2 D1 D0

I/O I/O IBFA INTEA INTRA INTEB OFB INTRB

Assim, o status da Porta C será como mostrado.


O que é necessário, é ler na Porta C e testar a condição de D 5 para conhecer a situação do IBFA.
Testar a condição de D1 para o status de OFBB

IMPRIMIR AL, PORTC ;leia o conteúdo da Porta C ;para testar a


TESTE AL, 5 condição de D5, IFBA ;para testar a condição de D1,
TESTE AL, 1 OFBB

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

PC4, 5 PC4, 5 E/S

1=ENTRADA
0=SAÍDA
PB7–PB0 8

RD
PC2
STBB

PC1 IBFB

PC0 INTRB

PORTA A - (SAÍDA ESTROMBADA)

PORTA B - (ENTRADA ESTROMBADA)

Figura 9.16 | Porta A na saída estroboscópica e Porta B no modo de entrada estroboscópica


Machine Translated by Google

308 OS MICROPROCESSADORES x86

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

Figura 9.17 | Conectando um teclado e uma impressora ao 8086 no Modo 1


Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 309

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.

ii) Configure a habilitação de interrupção FF (INTEA) configurando o bit PC4 .

iii) Defina o sinalizador de interrupção do processador 8086.


iv) Leia o status da Porta C.
v) Teste o status do IBF A.

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.

Etapas no ISR de impressão

i) Leia o conteúdo da Porta C.


ii) OBF Teste o alfinete.
B

iii) Se estiver alto, envie os dados para a impressora.

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A
PB EQU 0C2H ;endereço do Porto B
PC EQU 0C4H ;endereço da Porta C

LOC DB? ;espaço para armazenar dados chave

MOV AL, 0B4H ;modo 1, entrada da porta A, saída da porta B


OUT CR, AL ;envia para o registro de controle
MOV AL, 09 ;palavra BSR para configurar PC4
OUT CR, AL ;define o bit PC4 para configurar INTEA
DST ;defina o sinalizador de interrupção de 8086
EM AL, PC ;ler na porta C
REPETIÇÃO: TESTE AL, 20H ;bit de teste D20H (IBFA)
JZ REPEA ;se for 0, continue testando
EM AL, PA ;se IBFA for alto, envia dados da Porta A para AL
MOV LOC, AL ;movê-lo para a memória

IMPRIMIR ISR

EM AL, PC ;ler na porta C


COLHER: TESTE AL, 2 ;bit de teste D1 (OBFB)
JZ COLHE ;se baixo, teste bit até alto
FORA PB, AL
ele iria
Machine Translated by Google

310 OS MICROPROCESSADORES x86

9.6 | Modo 2 (E/S de barramento bidirecional estroboscópico)


Esta configuração funcional fornece um meio de comunicação com um dispositivo periférico ou estrutura em um único
barramento de 8 bits para transmissão e recepção de dados (E/S de barramento bidirecional).
Sinais de 'handshaking' são fornecidos para manter a disciplina de fluxo de barramento adequada de maneira semelhante
ao Modo 1. A geração de interrupção e as funções de habilitar/desabilitar também estão disponíveis.
Modo 2 Definições Funcionais Básicas:

i) Usado apenas no Grupo A.

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.

9,7 | Interface de impressora Centronics


Agora, vamos discutir uma aplicação muito popular do 8255 no Modo 1. A interface da impressora Centronics é uma
dessas aplicações. A porta paralela da impressora está em uso há muitos anos, mas está ficando mais ou menos
obsoleta nos dias de hoje – isso porque a porta USB agora é usada na maioria dos aplicativos substituindo a porta
paralela, bem como a porta serial convencional. No entanto, a porta paralela ainda é mantida como uma porta herdada
em muitos computadores. Vamos dar uma olhada neste aplicativo que está em uso há muitos e muitos anos.

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.

ii) O PC então envia um byte de dados no barramento de dados.

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

INTERFACE PERIFÉRICO ÿ I 311

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.

vii) Os requisitos de tempo 'mínimo' devem ser atendidos.

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

Tabela 9.3 | Lista de pinos Centronics e DB-25 SLCTIN

Centronics Pino DB-25 Nome Direção Descrição


Alfinetes

1 1 ESTROBO PC para impressora Strobo

2 2 D0 PC para impressora Bit de dados 0

3 3 D1 PC para impressora Bit de dados 1

4 4 D2 PC para impressora Bit de dados 2

5 5 D3 PC para impressora Bit de dados 3

6 6 D4 PC para impressora Bit de dados 4

7 7 D5 PC para impressora Bit de dados 5

8 8 D6 PC para impressora Bit de dados 6

9 9 D7 PC para impressora Bit de dados 7

10 10 ACK Impressora para PC Reconhecer

11 11 OCUPADO Impressora para PC Ocupado

12 12 BICO Impressora para PC Sem papel

13 13 ISTO Impressora para PC Selecionar

14 14 ALIMENTAÇÃO AUTOMÁTICA PC para impressora Alimentação automática

15 N/D s/c N/D Não usado

16 N/C 0V N/D Aterramento lógico

17 N/C GND DO CHASSIS N/A Terra do escudo

18 N/C PULLUP +5 V Impressora para PC +5 V DC (50 mA máx.)

19-30 18–25 GND N/D Referência de aterramento

para os pinos de sinal 1–12,


na maioria dos cabos como

pares trançados

31 16 REDEFINIR PC para impressora Redefinir

32 15 CULPA Impressora para PC Falha (Baixa quando off-line)

33 N/C 0V N/D Campo de sinal

34 N/C N/C N/D Não usado

35 N/C +5 V Impressora para PC +5 V CC

36 17 SLCTIN PC para impressora Selecione em (Tomar baixa ou


alta impressora em linha ou fora
de linha, respectivamente)
Machine Translated by Google

312 OS MICROPROCESSADORES x86

D0–D7

ESTROBO

ACK

OCUPADO

0,5ÿs 0,5ÿs 0,5ÿs 0,5ÿs


min min min min

Figura 9.18 | Diagrama de temporização da interface Centronics

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

INTERFACE PERIFÉRICO ÿ I 313

9,8 | Interface de um conversor analógico para digital para o 8086


As aplicações do mundo real usam sensores para obter uma tensão de sinal. Por exemplo, para medir uma
temperatura, um termopar pode ser o sensor usado. Isso dá uma tensão analógica correspondente ao valor
da temperatura. Vários outros sensores medem quantidades como umidade e velocidade e fornecem os
valores medidos como tensões analógicas. Para usar esses valores em um computador, essas tensões
devem ser convertidas em números digitais. Esta é a função de um conversor analógico para digital. Existem
vários métodos empregados nesta conversão, que você pode ter aprendido em seu curso básico de circuitos
digitais. Cada método tem seus méritos e deméritos.
Existem vários CIs padrão disponíveis como ADCs. Variam no número de bits de saída digital, no número
de entradas analógicas (multiplexadas) e na velocidade de conversão. Esses parâmetros terão que ser
verificados na folha de dados do CI antes de escolher um ADC específico para uma aplicação.

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

2. Erro total não ajustado 3. + /_ ½ LSB e + /_ 1 LSB

Fonte única 4. Baixa potência 5 VCC


15 mW
5. Tempo de conversão 100 µs

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

314 OS MICROPROCESSADORES x86

Relógio GND VCC


IN0 D0
EM 1 D1
EM 2 D2
IN3 D3
IN4 D4
ADC0808/0809
IN5 D5
IN6 D6
IN7 D7

Vref(+) EOC
VOCÊ ESTÁ

Vref(–)

SC ALE CB UMA

(LSB)

Figura 9.20 | Diagrama de pinos funcional do ADC 0808/0809

Tabela 9.4 | Lógica de Seleção de Canal


Canal analógico CBA
selecionado
IN0 0 0 0
EM 1 0 0 1

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

INTERFACE PERIFÉRICO ÿ I 315

RELÓGIO

WR (SC)

RD (OE)

MAS

ADDR

EOC

D0–D7
INICIAR CONVERSÃO

ENDEREÇO DA TRAVA

Figura 9.21 | Diagrama de tempo para o ADC 0808/0809

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

316 OS MICROPROCESSADORES x86

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

PC2 VOCÊ ESTÁ

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

03. 1 deve ser feito alto e depois baixo.

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.

ESSE BD? ;localização da memória para dados


CR EQU 0C6H convertidos ;endereço do registrador de
PA EQU 0C0H controle ;endereço da Porta A ;endereço da Porta B
PB EQU 0C2H
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 317

PC EQU 0C4H ;endereço da porta C ;palavra


MOV AL, 98H de controle em AL
OUT CR, AL ;envia para o registro de controle
MOV AL, 00 ;endereço correspondente a IN0
FORA PB, AL ;enviá-lo para a porta B
MOV AL, 00 ;Palavra de controle BSR para limpar ALE (PC0)
OUT CR, AL ;envia para o registrador de controle
MOV AL, 01 ;Palavra de controle BSR para configuração de ALE (PC0)
OUT CR, AL
MOV AL, 03 ;Palavra de controle BSR para configurar SC(PC1)
OUT CR, AL
ATRASO DE CHAMADA ;chamar um atraso
MOV AL, 00 ;Palavra de controle BSR para limpar ALE(PC0)
OUT CR, AL
MOV AL, 02 ;Palavra de controle BSR para limpar SC(PC1)
OUT CR, AL

AGN: EM AL, PC ;leia o conteúdo da Porta C


RLC ;gire para a esquerda para verificar se o PC7 está alto
JC AGN ;se carregar alto, continue a checagem
MOV AL, 07 ;se baixo, EOC tem. Carregar palavra para OE
OUT CR, AL
EM AL, PB ;lê os dados convertidos do PB
MOVA ISSO, AL ;guarda na memória
MOV AL, 06 ;Palavra de controle BSR para baixar OE(PC2)
OUT CR, AL ;envia para o registro de controle

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


MOV CX, N ;o valor de N pode ser decidido por

NXT: LOOP NXT ;referindo a folha de dados para ;atraso


CERTO necessário
ATRASO FINAL
FIM

9,9 | Interface com um conversor digital para analógico


Converter um número digital é uma aplicação importante em eletrônica – você deve ter aprendido os métodos
básicos dessa conversão. Aqui, usaremos um chip DAC e o conectaremos ao 8086 usando um 8255 como
interface. Um número digital enviado do processador é convertido em uma corrente/tensão analógica por esse
arranjo. Estão disponíveis DACs de diferentes resoluções – aqueles com entradas de 8, 10, 12 ou 16 bits –
quanto maior o número de bits, melhor a resolução.
Isso é compreensível porque um DAC de 8 bits fornece 28 ou 256 níveis de tensão na saída – da mesma
forma, os outros fornecem 210, 212 e 216 níveis de corrente discreta, respectivamente. Adicionando estes
valores de corrente dá a corrente resultante que é convertida em tensão por um conversor I para V (usando
Machine Translated by Google

318 OS MICROPROCESSADORES x86

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

CONTROLE, VLC 1 16 COMPENSAÇÃO

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

Figura 9.23 | Diagrama de pinos do DAC 0800

+5V
+5V

DAC0800 13 5K

V+
14 5,6 mil
PA0 D0
vref(+)
PA1 D1
PA2 D2
8 4 –
PA3 D3 FORA
2 +
EU

5 PA4 D4 PARA CRO


15
0,1uF
5 PA5 D5 vref(–)
Saída V = 0
PA6 D6
a 10V
PA7 D7 5K

1
4
V– COMP
GND
16
3
0,1uF

–12V

Figura 9.24 | Conexões entre o 8255 e o DAC


Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 319

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

i) Para 11000011, Io = Iref (1/2 + 1/4 + 0 + 0 + 0 + 0 + 1/128 + 1/256)


= 2 × (195/256)
= 1,52 mA
Vo = 5,6 × 1,52 = 8,52 V
ii) Para 00010111, Io = Iref (0 + 0 + 0 + 1/16 + 0 + 1/64 + 1/128 + 1/256)
= 2 (23/256)
= 0,1796875 mA
Vo = 5,6 × 0,1796
= 1,006 V
Em seguida, vamos gerar formas de onda de várias formas usando um DAC.

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.

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A

MOV AL, 80H ;palavra de controle para a porta A como saída


OUT CR, AL ;envia palavra para o registrador de controle
Machine Translated by Google

320 OS MICROPROCESSADORES x86

MOV AL, 0 ;AL = 0


REPEA: OUT PA, AL ;envia AL para a porta A
ATRASO DE CHAMADA ;chamar um atraso
INC AL ;aumenta AL
CMP AL, 0FFH ;comparar AL com FFH
JNZ REPEA ;se não for igual, incrementa
AGN: OUT PA, AL ;caso contrário diminuir
ATRASO DE CHAMADA ;chamar um atraso
DEZEMBRO ;diminuir AL
CMP AL, 0 ;compare AL com 0
JNZ AGN ;se não for 0, continua decrementando
JMP RAPEA ;se AL = 0, incrementa

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


MOV CX, 03FH ;valor de N para um pequeno atraso
COMO: LOOP COMO
CERTO

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.

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A

MOV AL, 80H ;palavra de controle para a porta A como saída


OUT CR, AL ;envia palavra para registrador de controle
STRT: MOV AL, 0 ;AL = 0
OUT PA, AL ;envia AL para a Porta A
ATRASO DE CHAMADA ;chamar um atraso
REPEA: ADICIONAR AL, 51 ;adicione 51 a AL
OUT PA, AL ;envia AL para a Porta A
ATRASO DE CHAMADA ;chamar um atraso
CMP AL, 255 ;verifica se Al = 255
JNZ REPEA ;se não, repita a adição de 51
JMP STRT ;se AL = 255, vai para INICIAR
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 321

T T

Atraso

Figura 9.25 | Forma de onda em escada gerada

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


MOV CX, 200 ;valor de N para 'Atraso' na Fig 9.25
AGN: LOOP AGN
CERTO

ATRASO ENDP ;fim do procedimento


FIM

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.

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A

MOV AL, 80H ;palavra de controle para a porta A como saída


OUT CR, AL ;envia palavra para registrador de controle
AGN: MOV AL, 0 ;AL = 0
COMEÇAR: OUT PA, AL ;envia AL para a Porta A
ATRASO DE CHAMADA ;chamar um atraso
INC AL ;aumenta AL
CMP AL, 0FFH ;comparar AL com FFH
INÍCIO JNZ ;se AL ÿ FFH, vai para iniciar
JMP AGN ;se AL = 0, vá para AGN para iniciar

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


Machine Translated by Google

322 OS MICROPROCESSADORES x86

MOV CX, 03FH


COMO AS: LOOP COMO
CERTO

ATRASO FINAL

9.10 | Interface de monitores de cristal líquido com o 8086


As telas de cristal líquido chamadas LCDs são muito populares por suas qualidades de baixa dissipação
de energia e facilidade de uso. O único problema normalmente encontrado é o problema do ângulo de
visão. A tela não é igualmente clara em todos os ângulos de visão. Agora, módulos LCD de muitas
especificações diferentes (principalmente diferentes no número de linhas, número de caracteres por linha e
assim por diante) estão disponíveis. Um módulo LCD possui registros de escrita nos quais o display pode
ser facilmente programado e controlado. Aqui, usaremos um LCD de 16 × 2 caracteres que se parece com
a Figura 9.26.

9.10.1 | Pinos do LCD


O LCD que selecionamos possui 16 pinos conforme mostrado na Tabela 9.5. Vemos que DB0 a DB7
correspondem aos pinos de dados. Os outros são os pinos para sinais de controle e fonte de alimentação.
VEE é um pino usado para ajustar o contraste da tela. Geralmente é conectado a um potenciômetro, para
que o contraste possa ser ajustado. Além disso, existem os pinos VCC e terra. Existem dois pinos para
ajuste da luz de fundo, se necessário. A luz de fundo significa iluminação extra atrás do painel LCD
(geralmente LEDs) para que a tela também seja visível no escuro.

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

. . . . . . . . . . . . . . . .

Figura 9.26 | Um módulo LCD 16 × 2


Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 323

Tabela 9.5 | Pinos do Módulo LCD 16 × 2


Não Símbolo Função

1 Vss Terra da fonte de alimentação (0 V)

2 Vcc Fonte de alimentação (5 V)

3 AGUA Fonte de alimentação para ajustar o contraste

4 RS Sinal de seleção de registro

5 R/W Leia o sinal de seleção de gravação

6 E
Ativar sinal

7 DB0 Linha de barramento de dados

8 DB1 Linha de barramento de dados

9 DB2 Linha de barramento de dados

10 DB3 Linha de barramento de dados

11 DB4 Linha de barramento de dados

12 DB5 Linha de barramento de dados

13 DB6 Linha de barramento de dados

14 DB7 Linha de barramento de dados

15 AVEE Tensão positiva para luz de fundo

16 K 0 V para luz de fundo

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

fornecidos na Tabela 9.6.

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,

conecte o pino 16 ao terra e o pino 15 ao Vcc através de um resistor de 100ÿ.


Machine Translated by Google

324 OS MICROPROCESSADORES x86

As ligações devem ser feitas da seguinte forma:

• VSS e R/W estão conectados ao terra.

• O VCC está conectado à alimentação de 5 V.

• VEE é conectado através de um potenciômetro de 10 K à fonte para ajuste de contraste.


• RS está conectado ao PC0 e E está conectado ao PC1.

• Os pinos 7-14 (DB0 a DB7) do módulo LCD estão conectados à porta A.

• Os pinos 15 e 16 do LCD são usados para ajuste da luz de fundo (não mostrado na Fig 9.27).

Tabela 9.6 | Códigos de comando do LCD

Código (hex) Comando

01 Limpar tela de exibição

02 Voltar para casa

04 Deslocar o cursor para a esquerda (diminuir o cursor)

05 Deslocar a exibição para a direita

06 Deslocar o cursor para a direita (cursor de incremento)

07 Deslocar a exibição para a esquerda

08 Exibição desligada, cursor desligado

0A Exibição ligada, cursor ligado

0C Visor ligado, cursor desligado

0E Visor ligado, cursor piscando

0F Exibição desligada, cursor piscando

10 Deslocar a posição do cursor para a esquerda

14 Deslocar a posição do cursor para a direita

18 Deslocar toda a tela para a esquerda

1C Deslocar a tela inteira para a direita

80* Força o cursor para o início da primeira linha

C0* Força o cursor para o início da segunda linha

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

Figura 9.27 | O LCD conectado ao 8255


Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 325

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.

PA EQU 0C0H ;endereço da Porta A


CR EQU 0C6H ;endereço do registro de controle

MOV AL, 80H ;controle a palavra para a porta A como saída


MOV CR, AL ;envia para o registrador de controle
MOV AL, 38H ;inicializa LCD, 2 linhas, matriz 5 x 7
COMANDO DE CHAMADA ;chama o procedimento COMMAMD
ATRASO DE CHAMADA ;chamar um atraso
MOV AL, 0EH ;comando para exibição, cursor sobre
COMANDO DE CHAMADA ;chama o procedimento COMMAMD
ATRASO DE CHAMADA ;chamar um atraso
MOV AL, 01 ;comando para limpar o LCD
COMANDO DE CHAMADA ;chama o procedimento COMMAMD
ATRASO DE CHAMADA ;chamar um atraso
MOV AL, 80H ;cursor na linha 1, posição 1

COMANDO DE CHAMADA ;chama o procedimento COMMAMD


ATRASO DE CHAMADA ;chamar um atraso
STRT: MOV AL, 'Y' ;mover para AL, o ASCII de 'Y'
DATA DE CHAMADA ;chamar o procedimento DAT
ATRASO DE CHAMADA ;chamar um atraso
MOV AL, 'A' ;mover para AL, o ASCII de 'A'
DATA DE CHAMADA ;chamar o procedimento DAT
ATRASO DE CHAMADA ;chamar um atraso

COMANDO PROC PRÓXIMO ;procedimento chamado COMMAND


OUT PA, AL ;envia dados em AL para a porta A
MOV AL, 0 ;palavra BSR para tornar PC0(RS) baixo
OUT CR, AL ;RS = 0 para registrador de comando
MOV AL, 03 ;palavra BSR para tornar o PC1(E) alto
OUT CR, AL ;isso é para fazer E = 1
ATRASO DE CHAMADA ;chamar um atraso
MOV AL, 02 ;palavra BSR para tornar E(PC1) baixo
OUT CR, AL ;isso é para fazer E = 0
CERTO
Machine Translated by Google

326 OS MICROPROCESSADORES x86

COMANDO ENDP ;encerrar o procedimento

AQUELE PROC PRÓXIMO ;procedimento chamado DAT


OUT PA, AL ;envia dados em AL para a porta A
MOV AL, 01 ;palavra BSR para tornar PC0(RS) alto
OUT CR, AL ;RS = 1 é para selecionar registro de dados
MOV AL, 03 ;palavra BSR para tornar o PC1(E) alto
OUT CR, AL ;isso é para fazer E = 1
ATRASO DE CHAMADA ;chamar um atraso
MOV AL, 02 ;palavra BSR para tornar E(PC1) baixo
OUT CR, AL ;isso é para fazer E = 0
CERTO

AQUELE ENDP

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


MOV CX, 0FFFH
AGN: LOOP AGN
CERTO

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

LEA BX, MESG ;aponta para os personagens


MOV CX, 5 ;CX = número de caracteres
REPETIR: MOV AL, [BX] ;mover para AL o personagem
DATA DE CHAMADA

CHAMADA DELAY_ROLL
INC BX
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 327

LOOP REPEA ;repete isso até CX = 0


BARRA JMP ;loop infinito para rotação contínua
-----------------
----------------
----
---

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.

9.11 | Interface de um motor de passo para o 8086


Introdução aos motores de passo Um motor de passo é um dispositivo eletromecânico
que converte pulsos elétricos em movimentos mecânicos discretos. Quando pulsos
elétricos são aplicados a ele, o eixo do motor gira em etapas e esse tipo de movimento dá ao motor
seu nome.

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

Figura 9.28 | Seção transversal de um motor de relutância variável (VR)


Machine Translated by Google

328 OS MICROPROCESSADORES x86

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.

A rotação do motor está relacionada com a sequência dos pulsos de entrada:

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.

9.11.1 | Tipos de Motor de Passo


Existem três tipos básicos de motores de passo. Eles são
Relutância variável

Í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

INTERFACE PERIFÉRICO ÿ I 329

NSNSN

Figura 9.29 | Um motor de passo de ímã permanente

N N

Figura 9.30 | Seção transversal de um motor de passo híbrido

9.11.2 | Motores de passo bifásicos


Existem dois arranjos básicos de enrolamento para as bobinas eletromagnéticas em um motor de passo
bifásico: bipolar e unipolar.

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

330 OS MICROPROCESSADORES x86

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.

9.11.3 | Conduzindo um Motor de Passo


9.11.3.1 | Full Step Drive (duas fases ligadas)
Este é o método usual para acionamento de passo completo do motor. Ambas as fases estão sempre
ligadas. O motor terá torque nominal total. Isso é obtido pela sequência de uns e zeros, conforme mostrado
na Tabela 9.7, que deve ser aplicada repetidamente. Invertendo a ordem em que a sequência é aplicada, a
rotação é no sentido anti-horário. Resumindo, para rotação no sentido horário, a sequência a ser aplicada
repetidamente é 09, 0CH, 06, 03 … Para rotação no sentido anti-horário, é 03, 06, 0CH, 09 …

(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

Figura 9.31 | um motor unipolar b Motor bipolar


Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I
331

9.11.3.2 | Unidade de onda


Neste método de acionamento, apenas uma única fase é ativada por vez. Ele tem o mesmo número de passos
que o drive de passo completo, mas o motor terá um torque significativamente menor que o nominal. Esta
sequência é 8, 4, 2, 1 para o sentido horário e 1, 2, 4, 8 para o sentido anti-horário.

9.11.3.3 | Meio passo


Ao meio passo, o inversor alterna entre duas fases ligadas e uma fase única. Isso aumenta a
resolução angular, mas o motor também tem menos torque na posição de meio passo (onde
apenas uma única fase está ligada). A vantagem do meio passo é que a eletrônica do drive não
precisa mudar para suportá-lo. O ângulo de passo é metade dos dois casos anteriores – assim,
a resolução de passo é aumentada. Para rotação no sentido anti-horário, a ordem da sequência
acima deve ser invertida.

Tabela 9.7 | Sequência de acionamento para um acionamento de passo completo com motor de passo

Sentido horário

Etapa nº UMA B UMA B


1 1001
2 1100
3 0110
4 0011

Tabela 9.8 | Sequência de condução para um acionamento de ondas de motor de passo

Sentido horário

Etapa nº UMA B UMA B


1 1000
2 0100
3 0010
4 0001

Tabela 9.9 | Sequência de condução para um meio passo de motor de passo

Sentido horário

Etapa nº UMA B UMA B


1 1001
2 1000
3 1100
4 0100
5 0110
6 0010
7 0011
8 0001
Machine Translated by Google

332 OS MICROPROCESSADORES x86

9.11.4 | Usando o 8255 para fazer a interface de um motor de passo

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.

CR EQU 0C6H ;endereço do registro de controle


PB EQU 0C2H ;endereço do Porto B

MOV AL, 80H ;palavra de controle para a porta B como saída


OUT CR, AL ;envia para o registrador de controle
MOV AL, 66H ;carrega sequência em AL
DE VOLTA: FORA PB, AL ;enviá-lo para a porta B
ROR AL, 1 ;gire para a direita uma vez
ATRASO DE CHAMADA ;chamar um atraso
JMP VOLTAR ;repete a sequência

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


MOV CX, 0FFFH
AGN: LOOP AGN
CERTO

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.

9.11.5 | Ângulo do passo

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

INTERFACE PERIFÉRICO ÿ I 333

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

GND 8 9 Comum grátis

diodos de roda

Figura 9.32 | Diagrama de pinos funcional do driver IC ULN2003

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

Figura 9.33 | Diagrama de conexão de um motor de passo usando o ULN 2003 IC

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

Para girar 900 no sentido horário, são necessários 50 passos.


Para girar 1800 no sentido anti-horário, são necessários 100 passos, e a sequência deve ser dada na
ordem inversa. Portanto, os dados 66H são deslocados para a esquerda neste caso.

CR EQU 0C6H ;endereço do registro de controle ;endereço


PB EQU 0C2H da Porta B
Machine Translated by Google

334 OS MICROPROCESSADORES x86

MOV AL, 80H ;palavra de controle para a porta B como saída


OUT CR, AL ;envia para o registro de controle
MOV CX, 50 ;CX = 50
MOV AL, 66H ;carrega sequência em AL
DE VOLTA: FORA PB, AL ;enviá-lo para a porta B
ROR AL, 1 ;gira a sequência uma vez, para a direita
ATRASO DE CHAMADA ;chamar um atraso
VOLTAR ;repete até CX = 0

MOV CX, 100 ;CX = 100


MOV AL, 66H ;carrega sequência em AL
VOLTAR1: SAÍDA PB, AL ;envia para AL
ROL AL, 1 ;gire-o uma vez, para a esquerda
ATRASO DE CHAMADA ;chamar um atraso
VOLTAR 1 ;repete até CX = 0

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


MOV BX, 0FFFH
AGN: DEC BX
JNZ AGN
CERTO

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

CR EQU 0C6H ;endereço do registro de controle


PB EQU 0C2H ;endereço do Porto B

SEQ DB 8, 4, 2, 1 ;armazena a sequência


MOV AL, 80H ;porta B para ser uma porta de saída ;envia
OUT CR, AL para o registrador de controle
RAP: MOV CX, 4 ;CX = 4
LEA BX, SEQ ;aponta BX para a posição de memória SEQ
INICIAR: MOV AL, [BX] ;carrega os valores da sequência para AL
FORA PB, AL ;envia para a porta B ;chama
ATRASO DE CHAMADA um atraso
INC BX ;incrementa o valor do ponteiro
INÍCIO DO LOOP ;repete até CX = 0
JMP RAP ;começar tudo de novo

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


MOV DX, 0FFFH
AGN: DEC DX
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 335

JNZ AGN
CERTO

ATRASO FINAL

9.11.6 | Outras questões relativas aos motores de passo

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

4,7 mil DICA 120


UMA

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

336 OS MICROPROCESSADORES x86

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

Figura 9.35 | Princípio de funcionamento de um optoacoplador

ILQ74
OPTPISOLATOR

1 16

2 15

3 14

4 13

5 12

6 11

7 10

8 9

Figura 9.36 | Um optoacoplador IC


Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 337

+5

+12 +12

470 470 470 470


Opto 10 ED 2003

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

Figura 9.37 | Optoacoplador usado em um circuito de acionamento de motor de passo

9.12 | Interface de teclado hexadecimal


No Capítulo 8, discutimos as idéias de fazer a interface de um teclado com o PC. Foi visto que microcontroladores
especializados são usados para lidar com todos os problemas associados à interface do teclado.
Assim, o processador principal do PC fica livre da tarefa de identificar a tecla pressionada. No entanto, ainda é
importante entender o mecanismo de como um pressionamento de tecla é detectado e como a tecla pressionada
é identificada. Para isso utilizamos um teclado hexadecimal, que possui 16 teclas com os caracteres de 0 a F.
Este teclado é interfaceado com o 8086 através das linhas de porta do 8255. O programa identifica a tecla que
foi pressionada e a exibe .

9.12.1 | Teclado hexadecimal

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.

9.12.2 | Detectando um pressionamento de tecla

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

338 OS MICROPROCESSADORES x86

VCC

3 210
R
PA0

8 7 654
2
PA1
5
5 B A9 8
PA2

F E DC
PA3

Porta A (Saída)

PB3 PB2 PB1 PB0


Porta B
8255
(Dentro)

Figura 9.38 | Teclado hexadecimal conectado a um 8255

9.12.3 | Identificando a chave


A próxima tarefa é identificar a tecla que foi pressionada. Para o caso da tecla '9' ser pressionada, olhar para
o número recebido da Porta B deixa claro que uma tecla na coluna 1 é a tecla pressionada. No entanto, não
temos nenhuma pista sobre a identidade dessa chave, pois não sabemos a linha na qual a chave reside.
Assim, identificar a linha desta chave é a solução para este problema.
Como vamos fazer isso?
A técnica é aterrar as linhas uma a uma e ler nas colunas, começando pela Linha 0. Se os dados lidos
das colunas forem 1111, é óbvio que esta linha em particular não contém a tecla que foi pressionada - se um
número menor que 1111 é recebido, a linha é identificada, pois sabemos qual linha está aterrada agora. O
uso dessas informações junto com as informações da coluna identifica a chave. Se a tecla '9' foi pressionada,
obtemos uma leitura de entrada da Porta B de 1101 somente quando a linha aterrada for a Linha 2. Assim,
identificamos que a tecla pressionada é aquela na junção da segunda linha e primeira coluna, que é '9'. Se
um mecanismo de exibição estiver disponível, podemos organizá-lo para exibir '9'.

Nota As linhas e colunas são numeradas de 0 a 3

9.12.4 | Key Debounce


A chave que estamos usando tem contatos mecânicos e é suscetível ao que é chamado de 'key jitter ou
bounce'. Ou seja, quando uma tecla é pressionada, a tecla se move para frente e para trás entre os contatos
por um certo tempo antes de se estabilizar. Para garantir que a chave se estabilize antes de lermos a chave,
permitimos um certo tempo para isso – e isso é chamado de tempo de debounce da chave. Pode variar de 10 ms
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 339

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.

Agora, as etapas estão listadas em ordem.


i) Mantenha as linhas aterradas e leia nas colunas. Se qualquer coluna der um '0', sabemos que uma tecla
pode ser pressionada. Aguarde um tempo correspondente ao tempo de debounce da tecla. Depois disso,
se a leitura da coluna ainda for 0, significa que há um pressionamento de tecla válido.
ii) Aterre uma linha de cada vez e leia nas colunas. Quando uma linha aterrada produz uma coluna
leitura, que não é '1111', a linha é identificada.
iii) O próximo trabalho é identificar a coluna da tecla que foi pressionada. Para isso, os dados lidos pela
Porta B são deslocados para a direita. Se uma coluna tiver a tecla pressionada, o bit de transporte será 0.
Caso contrário, ele é deslocado para a direita novamente. Dentro de 4 deslocamentos para a direita, o bit '0' será
detectado. Isso dará a posição da coluna.

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

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A
PB EQU 0C2H ;endereço do Porto B

MOV AL, 82H ;8255 palavra de


OUT CR, AL controle ;envia para registrador de controle

MOV AL, 0 ;AL = 0


OUT PA, AL ;envia zeros para todas as linhas
CAPA: EM AL, PB ;leia nas colunas
E AL, 0FH ;mascarar a mordida superior
CMP AL, 0FH ;comparar com 0FH
JZ CAPE ;se igual, sem chave, continue checando
ATRASO DE CHAMADA ;se tecla pressionada, espera debounce

EM AL, PB ;leia nas colunas


E AL, 0FH ;mascarar a mordida superior
CMP AL, 0FH ;comparar com 0FH
JZ CAPE ;se igual, sem chave, verifique novamente
;Em seguida, aterrar uma linha de cada vez
Machine Translated by Google

340 OS MICROPROCESSADORES x86

LINHA0: MOV AL, 0FEH ;envia '0' para Row0 sozinho


OUT PA, AL
EM AL, PB ;leia nas colunas
E AL, 0FH ;mascarar a mordida superior
CMP AL, 0FH ;comparar com 0FH
JZ LINHA1 ;nenhuma tecla pressionada na Linha0, verifique a Linha1
LEA SI, LINHA_0 ;diferente, SI para apontar para dados Row0
JMP COL_ID ;vai procurar a coluna

LINHA1: MOV AL, 0FDH ;envia '0' para Row1 sozinho


OUT PA, AL ;repete os passos
EM AL, PB
E AL, 0FH
CMP AL, 0FH
JZ LINHA2
LEA SI, LINHA_1
JMP COL_ID

LINHA2: MOV AL, 0FBH ;envia '0' para Row2 sozinho e


OUT PA, AL ;repete os passos
EM AL, PB
E AL, 0FH
CMP AL, 0FH
JZ LINHA3
LEA SI, LINHA_2
JMP COL_ID

LINHA3: MOV AL, 0F7H ;envia '0' para Row3 sozinho e


OUT PA, AL ;repete os passos
EM AL, PB
E AL, 0FH
CMP AL, 0FH
JZ CAPE
LEA SI, LINHA_3

COL_ID: SHR AL, 1 ;para identificar a coluna, desloque para a direita


JNC ENCONTRADO ;se não houver transporte, a coluna é encontrada
INC SIM ;caso contrário, aponta SI para a próxima linha
JMP COL_ID ;volta para encontrar a coluna

ENCONTRADO: MOV AL, [SIM] ;pega os dados apontados pelo SI para o AL


CHAVE DE MOVIMENTO, AL ;esta é a tecla pressionada. Armazenar em KEY

PROC DE ATRASO PRÓXIMO

MOV CX, 6000 ;atraso para debounce de tecla

AGN: LOOP AGN


CERTO

ATRASO FINAL
FIM
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 341

9.13 | Interface de Displays de LED Sabemos que

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.

9.13.1 | LED de sete segmentos


No entanto, as aplicações mais importantes dos LEDs são como displays alfanuméricos. Nesse caso, são
usados LEDs de sete segmentos, nos quais sete LEDs são dispostos como segmentos de um display
dispostos em uma forma particular que, quando acesos seletivamente, fornecem a exibição de caracteres
alfanuméricos (ver Fig 9.41). Ao iluminar todos os segmentos, temos '8' exibido. Podemos ter mais um
segmento neste display e é para o ponto decimal. Na Fig 9.41, há oito segmentos, incluindo o segmento
para o ponto decimal. Apesar disso, ainda designamos esses displays como displays de 'sete' segmentos.
Esses módulos de LED também podem ser usados na configuração do ânodo comum ou do cátodo
comum. Para acender um LED de exibição de sete segmentos do tipo catodo comum, certifique-se de
que o catodo esteja aterrado e dê um '1' para os segmentos que devem

+5

Figura 9.39 | Um único LED

(b)
A1 A2 A3
(uma) +5

R1 R2 R3
D1 D2 D3

D1 D2 D3

K1 K2 K3

Figura 9.40 | a LEDs de anodo comuns b LEDs de cátodo comum


Machine Translated by Google

342 OS MICROPROCESSADORES x86

uma

f b
g

c
e

d
dP

Figura 9.41 | Uma unidade de display LED de sete segmentos

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.

9.13.2 | Exibições Estáticas de Sete Segmentos

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.

9.13.3 | Exibição Dinâmica


Quando há um conjunto de unidades de exibição de dígitos, digamos 8 LEDs de sete segmentos
dispostos em forma de dígitos em uma linha, uma exibição contínua pode ser obtida acendendo apenas
um dígito de cada vez. No instante seguinte, este dígito é desligado e o próximo é aceso. Isso é feito de
forma contínua e cíclica dos dígitos 1 a 8 e repetido em uma taxa rápida. Devido à propriedade de
persistência da visão dos olhos, obtém-se uma ilusão de exibição contínua. Isso também é chamado de exibição mu
Os pontos importantes a serem observados aqui são:

i) O ânodo/cátodo comum de um dígito deve ser ativado para que um dígito esteja ativo.

ii) De cada vez, apenas os segmentos de um dígito estão


'ON'. iii) Após um atraso especificado, este dígito é desligado e os segmentos do próximo dígito são ligados.
A informação aqui apresentada é diferente da do caso anterior.
iv) Assim, para multiplexação de display, dígitos consecutivos devem ser ligados de forma cíclica,
e para cada dígito, a informação do segmento deve ser fornecida.
Machine Translated by Google

INTERFACE PERIFÉRICO ÿ I 343

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

Figura 9.43 | Segmentos do display e o byte de dados

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

344 OS MICROPROCESSADORES x86

Para a exibição de 8, os segmentos a serem iluminados são a, b, c, d, e, f, g.


Como estamos usando um tipo de exibição de cátodo comum, os dados para iluminar um segmento são '1'.
Portanto, os bits de D0 a D6 são '1'.
Assim, o código de sete segmentos para a exibição de 8 é 0111 1111, ou seja, 7 FH.

i) Da mesma forma para 'A' é 0111 0111 ou seja, 77 H.


ii) Para 'b' é 0111 1100 ou seja, 7 CH.

9.13.4 | Um display multiplexado dinâmico de oito dígitos


Na Fig 9.44, a conexão entre o LED, as linhas de porta e outros componentes extras são mostrados. A porta A é a
porta de acionamento de dígitos. Ele fornece a informação sobre qual dígito deve estar LIGADO em um determinado
momento. Isto é conseguido ligando um dos transistores de acionamento de dígitos Q1 a Q8. Estes são transistores
PNP e são ligados se um '0' for aplicado em suas bases. Este '0' vai para os emissores dos transistores, que estão
conectados aos cátodos de todos os LEDs do segmento.
De cada vez, a Porta A dá um '0' apenas em uma de suas linhas de porta. Para entender isso claramente, observe a
Fig 9.44. O dígito mais significativo (ou o dígito mais à esquerda do display) é ativado por um '0' em D7 da Porta A.
Assim, quando a Porta A emite a sequência binária 0111 1111, o dígito mais à esquerda é programado para ser
ligado, mas as informações do segmento também devem ser obtidas da Porta B. Se a Porta B fornecer os dados 77
H, o primeiro dígito exibirá 'A'. Este é o método para exibir um dígito.

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

INTERFACE PERIFÉRICO ÿ I 345

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.

3. Chame um atraso de, digamos, 1,5 ms.

4. Desligue este dígito e repita os passos 1 a 3.

5. Repita esta sequência para todos os oito dígitos.


6. Em seguida, comece novamente a partir do primeiro passo.

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.

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A
PB EQU 0C2H ;endereço do Porto B

TABELA DB 5FH,78H,78H,04,78H,3EH,5EH,7BH

MOV AL, 80H ;CW com portas A e B como saídas


OUT CR, AL ;envia para o registrador de controle

STRT: LEA SI, TABELA ;deixe SI apontar para os dados de exibição


MOV CX, 8 ;CX para conter o número de dígitos
MOV BL, 01111111 ;sequência de bits para o dígito mais à esquerda
AGN: MOV AL, BL ;copia para AL
OUT PA, AL ;enviá-lo para a porta A

MOV AL, [SIM] ;copia os dados do display para AL


FORA PB, AL ;enviá-lo para a porta B
ATRASO DE CHAMADA ;chamar um atraso
INC SIM ;ponteiro de incremento
ROR BL, 1 ;ativa o próximo dígito ;repete
LOOP AGN até CX = 0
JMP INÍCIO ;repete a sequência de exibição

PROC DE ATRASO PRÓXIMO ;laço de atraso


MOV DX, 300 ;calcula o valor do atraso
Machine Translated by Google

346 OS MICROPROCESSADORES x86

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.

CR EQU 0C6H ;endereço do registro de controle


PA EQU 0C0H ;endereço da Porta A
PB EQU 0C2H ;endereço do Porto B

DAT DB 3EH ;dados a serem exibidos –'U'

MOV AL, 80H ;CW para portas A e B como saídas


OUT CR, AL ;envia para o registrador de controle
STRT: MOV CX, 8 ;CX = 8, o número de dígitos
MOV BL, 01111111 ;sequência para um dígito estar 'ligado'
AGN: MOV AL, BL ;copia para AL
OUT PA, AL ;enviá-lo para a porta A
MOVA AL, QUE ;dados de 'U' são carregados em AL
FORA PB, AL ;envia para a Porta B como dados de segmento
ATRASO DE CHAMADA ;chamada demora
ROR BL, 1 ;gire BL para ligar o próximo dígito
LOOP AGN ;repete por 8 dígitos, até CX = 0
OK: JMP STRT ;repete a sequência de exibição

PROC DE ATRASO PRÓXIMO ;procedimento para um longo atraso


MOV DX, 30000
DE VOLTA: DEC DX
JNZ VOLTAR
CERTO

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

INTERFACE PERIFÉRICO ÿ I 347

Tabela 9.10 | Saída de exibição para exibição contínua de ABCDEFG

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.

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| O PPI tem três modos de operação.

| O modo 0 é o modo de E/S simples, enquanto os modos 1 e 2 são modos de handshaking.

| 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

348 OS MICROPROCESSADORES x86

PERGUNTAS

1. Qual é a característica especial da Porta C quando usada em a)


Modo 0 b) Modo 1

2. O que o termo handshake significa para você?

3. Qual é a importância do modo BSR do 8255?

4. Distinguir entre os protocolos SPP e EPP.

5. Como podemos operar um ADC no modo de interrupção?

6. Como a saída de corrente de um DAC é convertida em tensão?

7. Como uma onda senoidal pode ser gerada por um DAC?

8. O que significa um LCD retroiluminado?

9. Qual é a função do pino BUSY de um módulo LCD?

10. Como fazemos o display LCD se mover da esquerda para a direita?

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?

14. Por que os optoacopladores são populares em circuitos de motores de passo?

15. O que significa o ângulo de passo de um motor de passo?

16. Por que as telas dinâmicas são preferidas nas telas de vários dígitos?

17. Distinguir entre visores de ânodo comum e cátodo comum.

EXERCÍCIO

1. Projete a palavra de controle do 8255 com: a) todas as


portas como portas de entrada, b) Porta A e B como
entrada e porta C como saída.

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.

6. Escreva instruções para testar OBFB e IBFB para o problema anterior.

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.

9. Use um módulo LCD 16 × 2 e escreva programas para fazer o seguinte:


a) Exiba HELLO e WORLD em linhas diferentes e mova toda a exibição para frente e para trás. b) Escreva quatro strings em
diferentes linhas do LCD que se movem.
Machine Translated by Google

periférico
1 0 interface – ii

Neste capítulo, você aprenderá


| A arquitetura e os recursos de programação do | Como usar este chip em um circuito com um
o chip temporizador 8253/8254. teclado e uma tela.

| 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.

10.1 | O temporizador de intervalo programável 8253/8254


Até agora, sempre que queríamos criar atrasos, usamos a ideia de atraso de software em que o processador era mantido
em loop executando repetidamente um conjunto de instruções, criando assim um loop de atraso.
Esta ideia foi estendida para criar ondas quadradas de frequências requeridas.
No entanto, esta não é uma solução muito boa - primeiro, porque o processador é retido neste loop
incapaz de fazer qualquer outra coisa e segundo, os atrasos assim criados não são muito precisos.
O uso de hardware dedicado para gerar atrasos e gerar formas de onda de
frequências e larguras de pulso resolveu os problemas acima.

Imagem de abertura do capítulo: Um chip de timer.


Machine Translated by Google

350 OS MICROPROCESSADORES x86

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

Figura 10.1 | Diagrama de pinos de 8253/8254

Tabela 10.1 | Endereço do Registro de Controle e Contadores


CS A1 A0 Entidade selecionada
0 0 0 Contador 0

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

INTERFACE PERIFÉRICO - II 351

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

Figura 10.2 | Diagrama de bloco funcional de 8253/8254

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

352 OS MICROPROCESSADORES x86

10.1.2 | Programando o chip


Todas as operações são decididas pela palavra de controle carregada no registrador de controle. Para cada um
dos contadores, há um registrador de contagem com 16 bits de tamanho. Um número é escrito neste registrador
e armazenado no bloco do contador. O tamanho máximo desse número é FFFFH, ou seja, 16 bits, mas como o
registrador interno do contador tem apenas 8 bits, esse número deve ser escrito como dois pedaços de 8 bits.
A operação do contador ocorre criando um atraso ao decrementar esse número para 0 – a taxa em que isso
ocorre depende da frequência do clock de entrada. Portanto, esse número decide o fator pelo qual a frequência
de entrada é dividida para fornecer uma frequência de saída.
Suponha que o número carregado seja 3. Então, durante cada período de tempo de entrada 'T ', o número
diminui para 2, 1 e depois 0. Assim, ele cria um atraso para dividir a frequência de entrada por 3. Essa é a
maneira com qualquer número 'N ' carregado no registrador de um contador específico. O atraso máximo é
obtido carregando '0' como o número – ele diminuirá para 65.535 e depois voltará para 0. A Figura 10.3 dá uma
idéia do que constitui o hardware associado a um único

Barramento interno

Ao controle Status

Palavra Robusto

Registro

CRH CRL

Status

Registro

Ao controle

Lógica
ISTO

FUROS
OH TUDO
CLKN OUTN

Figura 10.3 | Arquitetura interna de um balcão


Machine Translated by Google

INTERFACE PERIFÉRICO - II 353

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.

10.1.3 | Palavra de controle


A Figura 10.4 mostra a palavra de controle e a definição de cada bit da palavra. D7 e D6 (SC1 e SC0)
são usados para selecionar o contador a ser usado. D5 e D4 (RL0 e RL1) apontam para 4 opções.
Uma opção é 'travar'. Isso será necessário apenas quando quisermos 'ler' o conteúdo do registro de
contagem. As outras três opções são para escrever um número 'N' no registrador de contagem.
Este número pode ter 8 ou 16 bits. Pode haver confusão sobre por que existem três maneiras de
carregar a contagem no contador. Uma possibilidade é que a contagem tenha dois bytes de tamanho.
Nesse caso, use RL1, RL0 = 11 na palavra de controle e depois carregue a contagem. Então carregue
o LSB primeiro, seguido pelo MSB. Mais tarde, se apenas o byte LSB precisar ser alterado, a palavra
de controle deverá ser alterada e recarregada com RL1 e RL0 como 01, ou como 10 se apenas o MSB
precisar ser alterado. Após configurar a palavra de controle desta forma, a contagem pode ser
carregada no registrador de contagem. D3 a D1 (M2 a M1), selecione o modo em que o contador deve ser usado.
O chip possui 6 modos, que serão explicados em detalhes em breve. D0 é o bit que informa ao contador
o formato da 'contagem'. Se for BCD na forma, este bit é definido como 1, se for binário,

D7 D6 D5 D4 D3 D2 D1 D0

Selecionar Ler/
Modo
Contador Carregar

SC1 SC0 RL1 RL0 M2 M1 M0 BCD

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

SC1 SC0 Contador


0 0 0
0-Contagem Binária
0 1 1
(16 bits)
1 0 2
1–BCD
11X
(4 NIBLES)

Figura 10.4 | Formato de palavra de controle do 8253 / 8254


Machine Translated by Google

354 OS MICROPROCESSADORES x86

é '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

A palavra de controle é escrita referindo-se à Fig 10.4 e é 37H

Solução

D7 D6 D5 D4 D3 D2 D1 D0
10110000

A palavra de controle neste caso é B0H

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

No circuito, vemos que as linhas de endereço A2 e A1 do 8086 estão conectadas a A1 e A0 do 8253. As


outras linhas de endereço (A7 a A3 e A1) são usadas para decodificação de endereço conforme mostrado.
Os endereços de várias entidades, dentro do chip, são os seguintes:

Entidades A7 A6 A5 A4 A3 A2 A1 A0 Endereço (Hex)

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

INTERFACE PERIFÉRICO - II 355

8
A2 A1 2
A1 A0 5
3

CS

A7
A6
A5
A4
ISTO
A3
A0

Figura 10.5 | Lógica de decodificação para o chip

Agora, vamos usar o chip temporizador em seus vários modos. Os diferentes modos são listados como:

Nº do modo Bits de modo Operação

M2 M1 M0

0 0 0 0 Interromper na contagem de terminais

1 0 0 1 Um tiro programável

2 X 1 0 Gerador de taxa

3 X 1 1 Gerador de ondas quadradas

4 1 0 0 Strobe acionado por software

5 1 0 1 Strobe acionado por hardware

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

Para uma frequência de entrada de 1,5 MHz, T = 1/ (1,5 × 10ÿ6) = 0,66 m s


Para obter uma frequência de saída de 1,5 KHz, o período de tempo = 0,66 ms
N é o número de ciclos de clock da frequência de entrada para obter um período de tempo de 0,66 ms para o sinal de
saída.
N = 0,66 ms/0,66 ms = 1000 ciclos.
Machine Translated by Google

356 OS MICROPROCESSADORES x86

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

MOV AL, 36H ;palavra de controle


OUT CR, AL ;envia palavra de controle para registrador de controle
MOV EIXO, 3E8H ;contagem de carga = 1000 no AX
OUT CNT0, AL ;envia o menor byte de contagem para o contador 0
MOV AL, AH ;mover o maior byte de contagem para AL
OUT CNT0, AL ;envia o maior byte de contagem para o contador 0
FIM

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

Figura 10.6 | Forma de onda de saída correspondente ao Exemplo 10.3


Machine Translated by Google

INTERFACE PERIFÉRICO - II 357

10.1.4 | Usando todos os contadores


Nota Existem três canais neste chip, ou seja, três contadores diferentes com clocks, portas e pinos de saída
individuais. Assim, três sinais diferentes podem ser obtidos do chip simultaneamente. Se, digamos, precisarmos
de três ondas quadradas de frequências diferentes, podemos programar todos os três contadores no modo 3.
Tente o seguinte programa.

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

CR EQU 0CEH ;endereço do registro de controle


CNT0 EQU 0C8H ;endereço do contador 0
CNT1 EQU 0CAH ;endereço do balcão 1
CNT2 EQU 0CCH ;endereço do balcão 2

MOV AL, 37H ;palavra de controle para usar o contador 0


OUT CR, AL ;envia palavra de controle para registrador de
MOV EIXO, 10H controle ;contagem de carga = 10 no AX
OUT CNT0, AL ;envia byte baixo de contagem para o contador 0
MOV AL, AH ;mover byte alto de contagem para AL
OUT CNT0,AL ;envia o byte alto da contagem para o contador 0

MOV AL, 77H ;palavra de controle para usar o contador 1


OUT CR, AL ;envia palavra de controle para registrador de
MOV EIXO, 100H controle ;contagem de carga = 100 no AX
OUT CNT1, AL ;envia o byte baixo de contagem para o contador 1
MOV AL, AH ;mover byte alto de contagem para AL
OUT CNT1, AL ;envia o byte alto de contagem para o contador 1

MOV AL, 0B7H ;palavra de controle para usar o contador 2


OUT CR, AL ;envia palavra de controle para registrador de
MOV EIXO, 1000H controle ;contagem de carga = 1000 no AX
OUT CNT2, AL ;envia byte baixo de contagem para o contador 2
MOV AL, AH ;mover byte alto de contagem para AL
OUT CNT2, AL ;envia o byte alto de contagem para o contador 2
FIM

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

358 OS MICROPROCESSADORES x86

é 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.

10.1.5 | Modo 0: Interrupção na contagem do terminal Pode

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

Cálculo para gerar um atraso de 10 ms


T = 10 ms/(0,66 ms) = 15151 = 382 FH
Consultando a Fig 10.4, escreva a palavra de controle para o modo 0.
CW é 00110000

CR EQU 0CEH ;endereço do registro de controle


CNT0 EQU 0C8H ;endereço do contador 0

MOV AL, 30H ;palavra de controle para o modo 0, contador 0


OUT CR, AL ;envia para o registro de controle
MOV AX, 382FH ;contagem de carga no AX
OUT CNT0, AL ;envia LSB de contagem para o contador 0
MOV AL, AH ;mover AH para AL
OUT CNT0, AL ;envia MSB da contagem s para o contador 0
FIM

A saída se tornará alta após 10 ms.


Este modo pode ser usado como contador de eventos e sinalizar a um processador quando o número de
eventos atingir um número pré-definido. Suponha que seja necessário ter um sinal quando 100 garrafas passaram
por uma esteira transportadora. Um sensor óptico pode detectar isso, gerar um pulso para cada garrafa, e a saída
do sensor é alimentada na entrada de clock do contador 0 no modo 0. Uma contagem de 64H é carregada no
registrador de contagem. Quando o contador desce até 0, o pino OUT do contador fica alto, e isso sinaliza o
evento de 100 garrafas passando pela esteira. Se o pino OUT estiver conectado ao pino INTR do 8086, a ação
apropriada pode ser programada na rotina de serviço de interrupção do processador.
Machine Translated by Google

INTERFACE PERIFÉRICO - II 359

CLK 8 8
SAÍDA 0 INT
Da óptica 2 0
Señor 5 8
3 6
PORTÃO

Figura 10.7 | Um exemplo de uma aplicação prática do modo 0

10.1.6 | Modo 1: Programe One Shot


Este modo também é chamado de one-shot reativado por hardware . Depois que os registros
de contagem são carregados, o GATE deve receber uma transição de L para H, que constitui o
gatilho para o one-shot. Uma vez que o trigger é obtido, o pino OUT fica baixo e permanece
baixo até N × T onde N é a contagem carregada no registrador de contagem e T é o período do
clock de entrada. Enquanto isso, se o GATE receber outra transição de L para H, a contagem é
recarregada e a contagem começa novamente. Essa capacidade de reativação é o que lhe
dá o nome de 'um disparo reativado'. Consulte a Fig 10.8a e 10.8b.

(uma)

PORTÃO

FORA

N×T

Figura 10.8a | Forma de onda de saída correspondente ao modo 1

(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

360 OS MICROPROCESSADORES x86

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

A palavra de controle é 0011 0010 = 32H

CR EQU 0CEH ;endereço do registro de controle


CNT0 EQU 0C8H ;endereço do contador 0

MOV AL, 32H ;control word pré-modo 1, contador 0


OUT CR, AL ;envia para o registro de controle
MOV AX, 12FH ;mover contagem para AX
OUT CNT0, AL ;envia LSB para o contador 0
MOV AL, AH ;mover MSB para AL
OUT CNT0, AL ;envia para o contador 0
FIM

PORTÃO

1 ms.
FORA

0,2 ms 0,2 ms 0,2 ms

Figura 10.9 | Forma de onda de saída do Exemplo 10.6

10.1.7 | Modo 2: Gerador de Taxa


Aqui, se GATE = 1 e uma contagem for carregada no registrador de contagem, a saída será alta pela duração N
× T e, em seguida, diminuirá por um período de um ciclo de clock. Assim, o período da forma de onda de saída
pode ser considerado (N + 1) T onde é alto para a duração N × T e baixo para um ciclo. A contagem é recarregada
automaticamente e o contador continua a produzir a forma de onda de saída. Este modo também é chamado de
divisão por N contador. Na Fig 10.10, WR corresponde ao tempo em que a contagem é escrita no contador.
Machine Translated by Google

INTERFACE PERIFÉRICO - II 361

FORA

T
N×T

WR

Figura 10.10 | Forma de onda de saída correspondente à operação do modo 2

Exemplo 10.7
CR EQU 0CEH ;endereço do registro de controle
CNT0 EQU 0C8H ;endereço do contador 0

MOV AL, 35H ;palavra de controle para contador 0, modo 2


OUT CR, AL ;envia para o registrador de controle ;carrega
MOV EIXO, 0005 a contagem N = 5 no AX ;envia LSB para o
OUT CNT0, AL contador 0
MOV AL, AH ;mover MSB para AL
OUT CNT0, AL ;envia MSB para o contador 0
FIM

Este programa gera um pulso baixo de um T em OUT 0, após um período de 5 ciclos T.

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.

CR EQU 0CEH ;endereço do registro de controle


CNT0 EQU 0C8H ;endereço do contador 0
CNT2 EQU 0CCH ;endereço do contador 2

MOV AL, 37H ;palavra de controle para usar o contador 0,modo 3


OUT CR, AL ;envia palavra de controle para registrador de controle ;carrega
MOV EIXO, 0150H contagem no AX
OUT CNT0, AL ;envia byte baixo de contagem para o contador 0
MOV AL, AH ;mover byte alto de contagem para AL
OUT CNT0, AL ;envia byte alto de contagem para o contador 0
MOV AL, 0B4H ;palavra de controle para usar o contador 2 no modo 2
OUT CR, AL ;envia palavra de controle para registrador de controle ;carrega
MOV AX, 0003 contagem no AX
Machine Translated by Google

362 OS MICROPROCESSADORES x86

OUT CNT2, AL ;envia byte baixo de contagem para o contador 2


MOV AL, AH ;mover byte alto de contagem para AL
OUT CNT2, AL ;envia o byte alto de contagem para o contador 2
FIM

SAÍDA 0

0,1 ms

SAÍDA 2

3 × T=0,3 ms. 0,1 0,1


EM. EM.

Figura 10.11 | Saídas OUT 0 e OUT 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.

10.1.8 | Modo 3: Gerador de onda quadrada


Este modo foi discutido anteriormente no Exemplo 10.3 e na Seção 10.1.4.

10.1.9 | Modo 4: Modo Acionado por Software


Neste modo, se GATE = 1, a saída será alta pela duração N × T e baixa por um período de clock. Em
seguida, ele vai alto novamente. A repetição da sequência só é possível após recarregar o registro de
contagem. Este modo é semelhante ao Modo 2, exceto que aqui o contador não é recarregável.

10.1.10 | Modo 5: Modo acionado por hardware


No modo anterior, a contagem iniciava quando o registro de contagem era carregado. No entanto, aqui a
contagem começa apenas quando uma transição de L para H é dada ao GATE. Na Figura 10.12, WR é o
momento em que a contagem é gravada no registrador de contagem.

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

INTERFACE PERIFÉRICO - II 363

10.1.11 | Lendo uma contagem


Em muitas aplicações, pode ser importante ler o conteúdo do registro de contagem. Isso pode ser feito
parando a contagem. Para parar a contagem, o método é tornar o pino GATE igual a 0, ou inibir o relógio.
No entanto, o melhor método é fazer a leitura 'on the fl y' que não causa nenhuma interferência no
funcionamento do circuito. Referindo-se à Fig 10.3 mostra que existe uma trava associada ao elemento
de contagem. Para ler um valor estável de um contador, o método é travar a contagem e depois ler o
conteúdo da trava. Consulte a Fig 10.4 que mostra o formato do registro de controle – RL1 e RL0 sendo
0 obtém a contagem a ser travada. Depois disso, o conteúdo pode ser lido. A seguir estão os passos para
ler a contagem do contador 0.
Este segmento de programa pode ser usado em qualquer lugar do programa uma vez iniciada a contagem, o que
significa que ele realiza a leitura 'on the fly'.

MOV AL, 000000000 ;palavra de controle para travamento do contador 0


OUT CR, AL ;envia para o registrador de controle
IN AL, CNT0 ;introduz o LSB do contador 0
MOV AH, AL ;mover para AH
IN AL, CNT0 ;introduz o MSB do contador 0
XCHG AH, AL ;troca o conteúdo de AH e AL
MOV COUNT, AX ; salva a contagem na memória

Agora a contagem atual está disponível no AX, que deve ser movida para COUNT, um local de memória.

10.2 | A Interface de Exibição do Teclado Programável – 8279


No Capítulo 9, você teve uma exposição às técnicas de interface de teclados, bem como telas para o
8086. O que deve ter sido notado é que quando uma tecla deve ser pressionada, o processador está
totalmente envolvido na verificação disso e, em seguida, na identificação do tecla que foi pressionada.
Da mesma forma, para exibir dados em displays de LED multiplexados, o processador está totalmente envolvido
nesse trabalho de atualização de dígitos individuais, envio de informações de segmento e assim por diante.
Gostaríamos de ter um chip periférico que cuide dessas atividades, de forma que o processador
tenha apenas que dar comandos para as ações. Um chip que assume a responsabilidade de gerenciar
essas funções é a interface de exibição do teclado 8279. Este chip tem duas partes – uma para fornecer
interface de exibição digitalizada para LED, incandescente e outras tecnologias de exibição populares em
formato alfanumérico, e a outra para interface com teclados ou uma série de sensores.

Discutiremos a interface de teclados e monitores separadamente e, em seguida, os usaremos em


conjunto. Nossa abordagem será discutir os recursos do chip, com a ajuda de um exemplo no qual o 8279
é interfaceado com um teclado e um display. A Figura 10.13 mostra o diagrama de blocos funcional do
chip. BD é usado para apagar o display durante a troca de dígitos ou por um comando de apagamento do
display. Discutiremos os pinos importantes quando os usarmos em circuitos práticos, à medida que
avançamos.

10.2.1 | Interface de exibição


Vamos considerar o uso do chip para fazer interface com um LED multiplexado de sete segmentos de 8
dígitos. Isso ajudará a entender o uso e os recursos do chip. Consulte a Figura 10.14. No entanto, não se
deixe intimidar pelo diagrama aparentemente complicado. Na verdade, é muito simples e fácil de entender.
Machine Translated by Google

364 OS MICROPROCESSADORES x86

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

Figura 10.13 | Diagrama de pinos funcional do 8279

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

INTERFACE PERIFÉRICO - II 365

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

RL0 RL0 CNTL


RL1 RL1 SHFT
RL2 RL2
RL3 RL3
RL4 RL4 12345678
RL5 RL5
RL6 RL6
RL7 RL7
SL2
SL1 330×8
SL0 Q16

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

Figura 10.14 | Parte da interface de exibição do 8279


Machine Translated by Google

366 OS MICROPROCESSADORES x86

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.

10.2.2 | Definição de segmento


As definições de segmento são mostradas na Fig 10.15. A tabela abaixo mostra a correspondência entre o
barramento de dados e os bits da porta de saída do 8279. Esta defi nição se deve apenas à forma como as
linhas A0 a A3 e B0 a B3 foram conectadas neste caso.

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

Figura 10.15 | Correspondência entre os segmentos e as linhas de barramento de dados


Machine Translated by Google

INTERFACE PERIFÉRICO - II 367

10.2.3 | Seção de Teclado


O chip tem a capacidade de ser usado com teclados e também com matrizes de sensores. No entanto, aqui vamos discutir apenas o
primeiro caso. Vamos considerar um teclado de matriz e lembrar como uma tecla pressionada é identificada (Seção 9.12). '0's são
enviados em uma dimensão da matriz e a outra dimensão é lida – as linhas que são lidas são chamadas de 'linhas de retorno (RL0 a
RL7 aqui).

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'

RL0 RL1 RL2 RL3 RL4 RL5 RL6 RL7

0 1 2 34 5 6 7

S0

8 9 UMA BC D E F A partir de

74LS138

S1
CNTL

CNTL SFT MUDANÇA

Figura 10.16 | Seção do teclado


Machine Translated by Google

368 OS MICROPROCESSADORES x86

00EEEXXX

VARREDURA RETORNA

(Indica a linha) (Indica a Coluna)

MUDANÇA

CNTRL

Figura 10.17 | Código da chave de retorno

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.

10.2.4 | Sistema com teclado e tela com interface

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.

CLK Th é conectado a partir do relógio do sistema para gerar o tempo.

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.

10.2.5 | Palavras de controle

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.

i) Configuração do teclado/modo de exibição

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 DD W KK
Machine Translated by Google

INTERFACE PERIFÉRICO - II 369

C
Mudança Teclado
o
Matriz
Ao controle
eu

dentro

(2×8)
m
8
n

s Linhas
Retornar

Linhas
S0 S1

Mudar CNTL RL0-7

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

Figura 10.18 | Conexões entre o 8279, um display de 8 dígitos e um teclado 2 × 8

Nesta palavra, DD significa display e KKK para teclado.


DD tem as seguintes opções: 0 0

Exibição de oito caracteres de 8 bits – entrada esquerda 0 1


Exibição esquerda
de dezesseis caracteres
1 0 Exibição dede 8 bits
oito – entrada
caracteres de 8 bits –
entrada direita 1 1 Exibição de dezesseis caracteres de 8 bits
– entrada direita

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

370 OS MICROPROCESSADORES x86

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.

KKK tem as seguintes variações

0 0 0 Teclado de digitalização codificado - Bloqueio de 2 teclas


0 0 1 Teclado de digitalização decodificado - Bloqueio de 2 teclas
0 1 0 Teclado de varredura codificada – N Key Rollover
0 1 1 Teclado de digitalização decodificado - N Key Rollover
1 0 0 Matriz do sensor de varredura codificada
1 0 1 Matriz do sensor de varredura decodificada

1 1 0 Entrada estroboscópica, Varredura de exibição codificada


1 1 1 Entrada estroboscópica, Varredura de exibição decodificada

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

0 UMA UMA B C UMA B C T3

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

INTERFACE PERIFÉRICO - II 371

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

Consulte a palavra de controle de configuração do modo teclado/display. A palavra de controle é

D7 D6 D5 D4 D3 D2 D1 D0

0 00 1 0 0 00

ou seja, 10H

ii) Relógio do Programa

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.

iii) Limpar exibição

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

0 X - A0-3 B0-3=00=(0000 0000)


0 0 - A0-3 B0-3=00=(0000 0000)
1 0 - A0-3 B0-3=20=(0010 0000)
1 1 - A0-3 B0-3=FF=(1111 1111)

Ativa a exibição clara quando CD=1.


As linhas da RAM do display são apagadas pelo
código definido por dois bits de CD inferiores.

Se CD=0, o conteúdo da RAM será exibido


Machine Translated by Google

372 OS MICROPROCESSADORES x86

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

iv) Gravar RAM de exibição

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

ii) sem incremento automático

Solução

Aqui, vamos selecionar o primeiro local na memória RAM do display.


i) Com AI = 1, a palavra de controle é 1001 0000 ou seja, 90H.
ii) Com AI = 0 (sem auto-incremento), a palavra de controle é 1000 0000 ou seja, 80H

v) Ler FIFO / Sensor RAM

D7 D6 D5 D4 D3 D2 D1 D0
0 1 0 AI XAAAA

Esta palavra de controle é para configurar o FIFO / SENSOR RAM


AI – Incremento Automático. Irrelevante para o modo de teclado digitalizado, mas usado no modo de
RAM do sensor.
AAA – Irrelevante para o modo de teclado digitalizado, mas usado no modo de RAM do sensor.
Machine Translated by Google

INTERFACE PERIFÉRICO - II 373

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.

DATR EQU 0C0H


CNTR EQU 0C2H

MOV AL, 00 ;palavra de controle para 8 dígitos, display de entrada à esquerda


OUT CNTR, AL ;envia para o registrador de controle
MOV AL, 3EH ;palavra para dividir a frequencia do clock por 30
OUT CNTR, AL ;envia para o registro de controle
MOV AL, 0CCH ;palavra de controle para limpar a tela
OUT CNTR, AL ;Envia para o registro de controle
MOV AL, 90H ;palavra para escrever a memória RAM do display com incremento automático
OUT CNTR, AL ;Envia para o registro de controle
MOV AL, 29H ;código de sete segmentos para exibir '5'
OUT DATR, AL ;Envia para registro de dados
MOV AL, 0FFH ;código de sete segmentos para não exibir
MOV CX, 07 ;7 LEDs do display a serem apagados
PRÓXIMO: OUT DATR, AL ;envia os dados para o registro de dados
LOOP PRÓXIMO ;repete por sete dígitos

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

374 OS MICROPROCESSADORES x86

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.

DATR EQU 0C0H


CNTR EQU 0C2H
TABELA DB 98H, 0FFH, 0FFH, 0FFH, 98H, 0FFH, 0FFH, 0FFH

STRT: LEA SI, TABELA ;deixe SI apontar para o endereço da tabela


MOV CX, 07 ;CX para atuar como
MOV AL, 10H contador ;palavra para 8 dígitos, display de entrada à direita
OUT CNTR, AL ;envia para o registro de controle
MOV AL, 3EH ;palavra para dividir a frequencia do clock por 30
OUT CNTR, AL ;envia para o registrador de controle ;palavra
MOV AL, 0CCH para limpar o display
OUT CNTR, AL ;envia para o registro de controle
MOV AL, 90H ;gravar para exibir a RAM com incremento automático
OUT CNTR, AL ;envia para o registro de controle
SEGUINTE: MOV AL, [SI] ;pega os dados da tabela para AL
OUT DATR, AL ;envia para o registro de dados
ATRASO DE CHAMADA ;chamar um atraso
INC SIM ;ponteiro de incremento
LOOP PRÓXIMO ;repete até CX = 0
JMP STRT ;começar tudo de novo

PROC DE ATRASO PRÓXIMO ;procedimento de atraso


MOV DX, 0AFFFH
AGN: DEC DX
JNZ AGN
CERTO

ATRASO FINAL

10.2.6 | Detectando um pressionamento de tecla

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

INTERFACE PERIFÉRICO - II 375

DU S/EOU F NNN

Nº de caracteres em FIFO

FIFO completo

Erro - Subexecução

Erro - superação

Fechamento do sensor/sinalizador de erro para

Múltiplos fechamentos

Exibir indisponível

Figura 10.20 | Formato da palavra de estado

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.

DATR EQU 0C0H


CNTR EQU 0C2H
ESSE BD? ;o código da chave deve estar aqui

LEA E, DAT ;deixe SI apontar para um local na memória


PRÓXIMO: EM CNTR, AL ;ler no registrador de status
TESTE AL, 01 ;verifica se D0 = 1
JZ PRÓXIMO ;se não, continue verificando
MOV AL, 40H ;caso contrário, escreva a palavra para ler FIFO
OUT CNTR, AL ;envia para o registrador de controle
EM AL, DATR ;ler a memória RAM FIFO
MOV [SI], AL ;envia o conteúdo para o local DAT
Machine Translated by Google

376 OS MICROPROCESSADORES x86

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.

DATR EQU 0C0H


CNTR EQU 0C2H
TABELA DB 0CH, 9FH, 4AH, 0BH, 99H, 29H, 28H, 8FH,
08, 09, 88H, 38H, 6CH, 1AH, 68H, 0E8H

LÁ, TABELA ;ponteiro para os sete códigos de segmento


MOV CX, 08
MOV AL, 0 ;contador ;palavra para display RAM, entrada direita
OUT CNTR, AL ;envia para o registro de controle
MOV AL, 3EH ;palavra para dividir a frequencia do clock por 30
OUT CNTR, AL ;envia para o registro de controle

MOV AL, 3EH ;palavra para dividir a frequencia do clock por 30


OUT CNTR, AL ;envia para o registro de controle
MOV AL, 0CCH ;palavra para limpar a tela
OUT CNTR, AL ;envia para o registro de controle
MOV AL, 90H ;palavra para escrever a memória RAM
OUT CNTR, AL ;envia para o registro de controle
MOV AL, 0FFH ;dados para apagar o display
AGN: OUT DATR, AL ;envia para o registro de dados
LOOP AGN ;repete por 8 dígitos
PRÓXIMO: EM AL, CNTR ;ler no registrador de status
TESTE AL, 07 ;teste se D0 = 1
JZ PRÓXIMO ;se não, continue testando
MOV AL, 40H ;caso contrário escreva a palavra para ler FIFO
OUT CNTR, AL ;envia para o registro de controle
EM AL, DATR ;leia no FIFO
E AL, 0FH ;mascarar o nibble superior do código da chave
Machine Translated by Google

INTERFACE PERIFÉRICO - II 377

MOV BL, AL ;copie para BL


MOV BH, 0 ;BH = 0
ADICIONAR SI, BX ;adiciona BX ao SI
MOV AL, [SIM] ;pegue o código de exibição correspondente ;envie-
OUT DATR, AL o para o registro de dados ;continue para mais
JMP PRÓXIMO chaves

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.

10.3 | O Controlador de Interrupção Programável (PIC) 8259 10.3.1 | Introdução

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.

10.3.2 | 8259 – Características

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

378 OS MICROPROCESSADORES x86

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

Figura 10.21 | Conexões básicas entre um PIC 8259 e o 8086

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.

10.3.3 | Diagrama de bloco


O Controlador de interrupção programável Intel 8259A lida com até oito interrupções de prioridade vetorial para a
CPU. Ele pode cascatear até 64 interrupções de prioridade vetorial sem circuitos adicionais. Ele é embalado em um
DIP de 28 pinos, usa tecnologia NMOS e requer uma única alimentação de 5 V. O circuito é estático, não requer
entrada de clock. O 8259 A foi projetado para minimizar o software e a sobrecarga em tempo real no tratamento de
interrupções de prioridade multinível. Possui vários modos, permitindo a otimização para uma variedade de requisitos
do sistema.
O diagrama de blocos da Fig 10.23 mostra as diferentes partes funcionais do chip. Possui 8 linhas de solicitação
de interrupção IR0 a IR7, que são linhas de entradas assíncronas. Uma solicitação de interrupção é executada
elevando uma entrada IR (baixa para alta) e mantendo-a alta até que seja reconhecida (Modo Acionado por Borda)
ou apenas por um nível alto em uma entrada IR (Modo Acionado por Nível).

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

INTERFACE PERIFÉRICO - II 379

VCC GND

D0–D7

RD

WR

CS Interromper entradas

A0 8259 IR0–IR7

INT

ENQUANTO

Interface em cascata
CAS0–CAS2

SP / EN

Figura 10.22 | Diagrama de bloco funcional do PIC

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

Figura 10.23 | Diagrama de blocos interno de um controlador de interrupção programável (PIC)


Machine Translated by Google

380 OS MICROPROCESSADORES x86

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).

10.3.4 | Sequência de interrupção para um sistema baseado em 8086

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

: de Máscara de Interrupção IMR


Registro
: de solicitação de interrupção IRR
Registro
:
Resolvedor de prioridade de relações públicas

: em serviço ISR
Registro

Figura 10.24 | Sequência de interrupção e os registros envolvidos


Machine Translated by Google

INTERFACE PERIFÉRICO - II 381

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.

7. Isso completa o ciclo de interrupção.

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.

10.3.5 | Usando o 8259


O chip deve ser programado para nosso uso, e a seqüência de programação começa com a escrita das palavras de
controle necessárias no registrador de controle. Existem dois tipos de palavras de controle:

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.

10.3.6 | Palavras de comando de inicialização (ICWs)


Observe que há apenas uma linha de endereço, ou seja, A0 para se comunicar com o chip (consulte a Tabela 10.2).
Assim, as palavras de controle de inicialização são selecionadas usando este pino, e é óbvio que o ICW1 usa um
endereço de porta diferente das outras três palavras de controle de inicialização. Veja a Fig 10.25 para o fluxograma
de inicialização.

10.3.7 | Sequência de inicialização


10.3.7.1 | ICW1 (Palavra de Comando de Inicialização1)
Para inicialização, sempre o ICW1 deve ser enviado primeiro. Sempre que um comando é emitido com A0 = 0 e D4
= 1, isso é interpretado como Palavra de Comando de Inicialização 1 (ICW1). ICW1 inicia a sequência de
inicialização.
Esta palavra de controle carrega a informação necessária para distinguir entre ICW2, ICW3 e ICW4. O importante é
que todas essas palavras podem não ser necessárias.

Tabela 10.2 | Valor de A0 para os Diferentes ICWs

CS A0 ICW

0 0 ICW1

0 1 ICW2

ICW3

ICW4
Machine Translated by Google

382 OS MICROPROCESSADORES x86

ICW1

ICW2

NÃO (ÚNICO-1) Em cascata


Modo ?

SIM (SNGL = 0)

ICW3

NÃO (IC4-1) IS ICW4


Precisava ?

SIM (IC4-1)

ICW4

Pronto para aceitar


Solicitações de interrupção

Figura 10.25 | Fluxograma mostrando a sequência de inicialização para o PIC

D0 indica se o ICW4 é necessário.


D1 indica se o sistema está operando em modo escravo ou mestre. Se D = 1, é um modo escravo e,
portanto, o ICW3 não é necessário.
D2 = 0 sempre para o processador x86.
D3 seleciona as opções de disparo de borda ou nível para as linhas de interrupção IR0 a IR7.
D4 é alto sempre no ICW1 e D5 a D7 é baixo para processadores x86.

10.3.7.2 | ICW2 (Palavra de Comando de Inicialização2)


Essa palavra nos permite decidir o tipo de números a serem associados às linhas de entrada de interrupção
de IR0 a IR7 (veja a Figura 10.25).
Esta palavra é enviada com A0 = 1. Os bits D2 a D0 variam de 000 a 111 e, juntamente com os bits
superiores D7 a D3, decidem os números de tipo das interrupções (IR0 a IR7). Assim, temos que escrever
os bits D7 a D0. A Figura 10.27 mostra como isso é feito.
Machine Translated by Google

INTERFACE PERIFÉRICO - II 383

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

Sempre 0 para o x86

1=nível de trigonometria.
entrada 0=trig de borda. entrada

Sempre 0 para o x86

ICW2

D7 D6 D5 D4 D3 D2 D1 D0
T7 T6 T5 T4 T3 T2 T1 T0

T7– T0 é a interrupção atribuída a IR0 do 8259

Figura 10.26 | Formato das palavras de comando de inicialização 1 e 2

Conteúdo do byte de vetor de interrupção


para o modo de sistema 8086

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

Figura 10.27 | O método de decidir os números do tipo de interrupção para cada IR


Machine Translated by Google

384 OS MICROPROCESSADORES x86

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.

10.3.7.3 | ICW3 (Palavra de Controle de Inicialização3)


Esta palavra de controle é necessária somente quando os dois ou mais 8259s estão em cascata. Um único
8259 pode ser conectado a 8 chips escravos, dando assim a possibilidade de até 64 interrupções de
hardware. Nos modos em cascata, existem palavras ICW3 separadas para o mestre e o escravo. Para o
mestre, esta palavra especifica qual entrada IR possui um escravo conectado e outro ICW3 informa ao
escravo qual entrada IR do mestre está conectada a ele. Veja a Fig. 10.27.

10.3.7.4 | Palavra de Comando de Inicialização 4 (ICW4)


D0 indica se o processador é 8080/85 (D0 = 0) ou x86 (D0 = 1).
D1 especifica se um AEOI (fim automático de interrupção) será usado (D1 = 1) ou se comandos
EOI devem ser deliberadamente inseridos no final de uma rotina de serviço de interrupção (D1 = 0).
D2 e D3 especificam as opções possíveis quando o barramento de dados possui transceptores
bidirecionais ( Seção 6.1.4.2) e quando não possui.
D4 indica o uso do modo especial totalmente aninhado (D4 = 1). Este modo deve ser usado quando o
chip atua como mestre.
D5 a D7 são sempre '0' nesta palavra de controle.

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

INTERFACE PERIFÉRICO - II 385

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

10.3.8 | Palavras de Comando Operacional


Agora que sabemos como inicializar o chip, o próximo passo será entender seus diferentes modos de
operação. Para isso, é necessário utilizar as palavras de controle denominadas 'Palavras de Comando
Operacionais'. Discutiremos os modos e recursos do chip passo a passo, juntamente com as palavras
de comando operacionais que são usadas para esses modos. Os OCWs são enviados com A0 = 1
para OCW1 e A0 = 0 para OCW1 e OCW2. Consulte a Tabela 10.3.

10.3.8.1 | OCW 1 (Palavra de Comando Operacional 1)


Esta palavra é usada para mascarar qualquer um dos pedidos de interrupção IR0–IR1. Para mascaramento, o bit específico
é '1'. Consulte a Figura 10.28. Observe que esta palavra tem a estrutura de máscara de interrupção. Para conhecer a corrente

Tabela 10.3 | Valor de A0 para os diferentes OCWs

CS A0 OCW
0 0 OCW2
0 1 OCW3
OCW1
Machine Translated by Google

386 OS MICROPROCESSADORES x86

ICW3 (dispositivo mestre)

D7 D6 D5 D4 D3 D2 D1 D0

S7 S6 S5 S4 S3 S2 S1 S0

1=A entrada IR tem um escravo

0=entrada IR não tem escravo

ICW3 (Dispositivo Escravo)

D7 D6 D5 D4 D3 D2 D1 D0

0 0 0 0 0 ID2 ID1 ID0

ID ESCRAVO 1

01234567
01010101
00110011
00001111

ICW4

D7 D6 D5 D4 D3 D2 D1 D0

0 0 0 SFNM BUF MS AEOI PM

1 = para x86

1 = especificação. totalmente 1 = EOI automático


modo aninhado 0=normal EOI
0 = não sp. totalmente
modo aninhado

0 x modo sem buffer


1 0 escravo em modo buffer
1 1 mestre do modo de buffer

Figura 10.28 | ICW4 e ICW3


Machine Translated by Google

INTERFACE PERIFÉRICO - II 387

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

O status do IMR deve ser lido, leia o status de OCW1. A instrução é,

EM AL, 0C2H ;C2H é o endereço que usamos no Exemplo 10.19


e é o mesmo de
ICW2 (com A0 = 1); bit de
MOV AL, 01 máscara para IR0 é definido
MOV BL, AL
SAÍDA 0C2H, AL ;enviar para OCW1

10.3.8.2 | OCW2 (Palavra de Controle Operacional2)


Esta palavra é usada para atribuir prioridades aos pedidos de interrupção. Há uma prioridade padrão atribuída na
inicialização do chip. Isso pode ser alterado dinamicamente pelos padrões de bits do OCW2. Consulte a Fig 10.29 para os
padrões de bits para os vários esquemas de atribuição de prioridade. Além disso, vamos dar uma olhada nas várias opções de prioridad
acessível.

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

388 OS MICROPROCESSADORES x86

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

001 Comando EOI não específico


011 Comando EOI específico Nível IR a ser atuado
101 Girar no comando EOI não específico
100 01 2 3 456 7
Gire no modo EOI automático (definido)
000 01 0 1 010 1
Girar no modo EOI automático (limpo)
00 1 1 001 1
111 Girar no comando EOI específico
110 00 0 0 111 1
Definir comando de prioridade
010 Nenhuma operação

OCW 3
D7 D6 D5 D4 D3 D2 D1 D0
0 ESMM SMM 0 1 P RR ARROZ

Comando de leitura de registro


0 1 0 1
Modo de máscara especial
0 11 0
01 0 1

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

Figura 10.29 | Palavras de controle operacional 1 a 3


Machine Translated by Google

INTERFACE PERIFÉRICO - II 389

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

D7 a D5 = 111, devido ao uso do modo 'rotação específica'


D2 a D0 = 101, porque IR5 é a prioridade mais baixa.

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.

10.3.8.3 | OCW3 (Palavra de Controle Operacional 3)


Esta palavra pode ser lida para obter o status do registro em serviço e do registro de solicitação de
interrupção. Também é usado para habilitar alguns recursos de alto nível do chip.

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

390 OS MICROPROCESSADORES x86

Solução

EM AL, 0C2H ;para ler IMR, LEIA OCW1


MOV AL, 6AH ;escreve OCW3 para ler TIR
EM AL, 0C0H ;ler TIR
MOV BL, AL ;salva TIR em BL
MOV AL, 69H ;escreve OCW3 para ler ISR
EM AL, 0C0H ;ler ISR
MOV CL, AL ;salve no CL

Nota O 8259 é um chip complexo e para mais detalhes, a folha de dados do chip deve ser consultada.

10.4 | Modo Cascata


O 8259 pode ser facilmente interconectado em um sistema de um mestre com até oito escravos para lidar com
até 64 níveis de prioridade. O mestre controla os escravos através do barramento em cascata de 3 linhas. O
barramento em cascata atua como seleção de chip para os escravos durante a sequência INTA.
Em uma configuração em cascata, as saídas de interrupção do escravo são conectadas às entradas de
solicitação de interrupção do mestre. Quando uma linha de solicitação do escravo é ativada e posteriormente
reconhecida, o mestre habilitará o escravo correspondente a liberar o número do tipo correspondente ao
manipulador de interrupção do dispositivo.
As linhas de barramento em cascata são normalmente baixas e conterão o código de endereço do
escravo da borda de fuga do primeiro pulso INTA até a borda de fuga do terceiro pulso. Cada 8259 no
sistema deve seguir uma sequência de inicialização separada e pode ser programado para funcionar em
um modo diferente. Um comando EOI deve ser emitido duas vezes: uma vez para o mestre e uma vez
para o escravo correspondente. É necessário um decodificador de endereço para ativar a entrada Chip
Select CS de cada 8259. As linhas em cascata do Master 8259 são ativadas apenas para entradas
escravas, entradas não escravas deixam a linha em cascata inativa (baixa). A Figura 10.30 mostra três 8259s em cas

10.4.1 | Controladores de interrupção programáveis no PC


Na Tabela 8.2, foi vista uma lista de algumas das interrupções padrão do PC. Algumas delas são
interrupções de software e outras são interrupções de hardware. As interrupções de hardware são
roteadas através de um 8259 e cada uma é indicada como um IRQ (Interrupt Request). No IBM PC e
no PC-XT original, havia apenas um chip 8259 e, portanto, apenas oito linhas de IRQ. No entanto, os
usuários logo precisaram de mais dispositivos para serem controlados por interrupção e, portanto, 7
IRQs adicionais foram adicionados ao PC. Isso envolve anexar outro 8259 ao existente. A compatibilidade
sempre causa problemas, pois a nova configuração ainda precisava ser compatível com hardware e software anti
A nova configuração é mostrada na Fig 10.31.
A CPU possui apenas uma linha de interrupção, portanto, o segundo controlador teve que ser conectado ao
primeiro controlador, em uma configuração mestre/escravo. O IRQ2 foi selecionado para isso. Usando IRQ2 para o
segundo controlador, nenhum outro dispositivo poderia usar IRQ2. O que aconteceu com todos esses dispositivos
usando IRQ2? Nada, a linha de solicitação de interrupção encontrada no barramento, foi simplesmente desviada
para a entrada IRQ 9. Como nenhum dispositivo ainda usava o segundo PIC ou IRQ9, isso poderia ser feito.
Conforme mostrado na Fig. 10.31, IRQ0 a IRQ7 são as linhas de interrupção do mestre 8259, enquanto
IRQ8 a IRQ15 são as linhas de interrupção do escravo 8259. Os nomes reais dos pinos em um 8259 são IR0 a
IR7. IRQ0 a IRQ15 são os nomes das linhas de barramento ISA para
Machine Translated by Google

INTERFACE PERIFÉRICO - II 391

Barramento de Endereço (16)

Barramento de Controle

EM EQ

Barramento de dados (8)

CS A0 D0-7 ENQUANTO INT CS A 0 D0-7 ENQUANTO INT CS A 0 D0-7 ENQUANTO INT

CAS 0 CAS 0 CAS 0

8259A CAS 1 8259A CAS 1 CAS 1 8259A

ESCRAVO A CAS 2 ESCRAVO B CAS 2 CAS 2 MESTRE

SP/EN7 65 43 2 1 0 SP/EN7 65 43 2 1 0 SP/EN7 M7 M5


M6M4 M3 M2 M1 M0

Vcc
GND GND
76

7 6543210 765 4 3210 5 4 32 1 0

Solicitações de interrupção

Figura 10.30 | Conexão em cascata de três PICs

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

392 OS MICROPROCESSADORES x86

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

CAS0 CAS1 CAS2

CAS0 CAS1 CAS2

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

(ESCRAVO) IR7 IRQ 15

Figura 10.31 | PICs usados no PC-AT

Slave 8259 (somente PC/AT e posterior)


• IRQ8 – relógio em tempo real (RTC) •

IRQ9 – sem atribuição comum • IRQ10


– sem atribuição comum • IRQ11 – sem
atribuição comum • IRQ12 – Controlador
de mouse Intel 8042 PS / 2 • IRQ13 – coprocessador

matemático • IRQ14 – controlador de disco rígido 1 •


IRQ15 – controlador de disco rígido 2
Machine Translated by Google

INTERFACE PERIFÉRICO - II 393

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.

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| São necessárias várias palavras de controle para operar este chip.

| O terceiro chip de interface discutido neste capítulo é o controlador de interrupção programável


8259.

| 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.

| Um número de palavras de comando de inicialização e um número de palavras de comando operacional são


necessário para usar este chip.

| No PC atual, dois PICs são usados para lidar com interrupções de hardware padrão.

PERGUNTAS

1. De que forma o 8253 é diferente do 8254?

2. Em que modo as ondas quadradas simétricas podem ser obtidas do 8253?

3. O que significa ler uma contagem 'on the fly' e como isso é feito?

4. Explique o uso do modo 1 do chip temporizador.

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?

8. Diferencie entre o display de entrada esquerdo e direito.

9. Que informação contém um 'código de chave'?

10. Qual é o papel do decodificador 74LS138 na figura 10-17?

11. Explique resumidamente como o 8259 canaliza uma solicitação de interrupção de um periférico para o 8086.
Machine Translated by Google

394 OS MICROPROCESSADORES x86

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?

14. Como as prioridades de interrupção podem ser alteradas?

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.

2. Usando quaisquer dois modos do chip, gere ondas quadradas assimétricas.

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.

5. Consultando a Fig 10.14, escreva um programa para exibir ABCD no visor.

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.

10. Escreva instruções para ler o conteúdo do ISR e IRR.


Machine Translated by Google

periférico
1 1 interface–iii

Neste capítulo, você aprenderá


| Os princípios envolvidos na comunicação serial | Os modos e programação do 8251.
cátions.
| O conceito de acesso direto à memória.
| A terminologia e os padrões de serial | A necessidade e funções de um controlador DMA em
comunicações.
um sistema de computador.
| Pinos e conexões RS-232. | Diferentes tipos e modos de DMA.
| O uso do USART 8251 como interface | Como usar o controlador DMA IC 8237.
aos computadores.

11.1 | Princípios de comunicação serial


Transferir dados é o que queremos dizer quando usamos a palavra 'comunicação'. Os dados devem ser
enviados da origem para o destino, sendo necessário que os formatos de origem e destino sejam semelhantes,
para garantir a compatibilidade entre eles.
Vimos essa transferência de dados em muitos contextos e, em todos esses casos, vários bits são enviados
juntos, ou seja, 8 bits, 16 bits ou 32 bits. Isso é 'comunicação paralela'. Todos os bits são enviados e recebidos
juntos. A transferência de dados entre registradores em um processador é feita dessa maneira. Isso é bom
desde que a origem e o destino estejam próximos, mas quando eles são colocados fisicamente distantes, como,
digamos, dois computadores em dois prédios diferentes, muitos problemas surgem. Se estivermos enviando 8
bits, seriam necessários oito fios longos, e o problema se agrava à medida que o tamanho do bit dos dados
aumenta. Para contornar este e outros problemas relacionados, a 'comunicação serial' é escolhida de preferência
à comunicação paralela que acabamos de discutir. A comunicação serial é quando enviamos dados digitais um
bit de cada vez, um após o outro. Assim, 8 bits precisam de 8 vezes o tempo necessário, em comparação com
o caso anterior (assumindo a mesma taxa de envio), mas a vantagem direta é que apenas um fio físico é
necessário para a transmissão. Esta é uma vantagem muito grande quando se lida com tamanhos de palavras
de dados maiores, mas junto com isso, chega um novo conjunto de questões, que precisam ser tratadas de forma eficaz.
Primeiro, vamos discutir os vários termos que podem ser encontrados durante o aprendizado da
comunicação serial.

11.2 | Comunicação Simplex, Half Duplex e Full Duplex


Uma Conexão Simplex é uma conexão na qual os dados fluem em apenas uma direção, do transmissor para
o receptor. Este tipo de conexão é útil se os dados não precisarem fluir

Imagem de abertura do capítulo: Max 232.


Machine Translated by Google

396 OS MICROPROCESSADORES x86

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.

11.2.1 | Comunicações Síncronas vs Assíncronas


Agora, vamos supor que temos um bloco de bytes a ser transmitido e que o transmissor e o receptor estão conectados
por uma linha serial. A transferência de dados seriais depende de um tempo preciso para diferenciar os bits no fluxo
de dados. Esse tempo pode ser tratado de duas maneiras: de forma assíncrona ou síncrona. Na comunicação
assíncrona, o escopo do tempo é um único byte no máximo. Nas comunicações síncronas, o escopo de
tempo compreende um ou mais blocos de bytes. Em ambos os casos, o transmissor e o receptor devem conhecer
o estado um do outro. Na transmissão síncrona, as informações de sincronização são enviadas entre a transmissão
de cada bloco de dados. O tamanho deste 'bloco' depende do sistema. Mesmo quando os dados reais não estão
sendo enviados, um fluxo constante de bits permite que cada dispositivo (transmissor ou receptor) conheça o estado
do outro a qualquer momento. Ou seja, cada caractere enviado é um dado real ou um caractere ocioso. As
comunicações síncronas permitem taxas de transferência de dados mais rápidas do que os métodos assíncronos,
pois não são necessários bits adicionais para marcar o início e o fim de cada byte de dados, mas apenas entre os
grandes blocos.

11.2.2 | Comunicações assíncronas


Na transmissão assíncrona, o início e o fim de cada byte de dados devem ser identificados pelos bits de início e fim.
Os bits de início indicam quando o byte de dados está prestes a começar e os bits de parada sinalizam quando ele
termina. O requisito de enviar esses bits adicionais faz com que a comunicação assíncrona seja um pouco mais lenta
do que o tipo síncrono.
Uma linha assíncrona que está ociosa é identificada com um valor de 1 (também chamado de estado de marca).
Ao usar esse valor para indicar que nenhum dado está sendo enviado no momento, os dispositivos podem distinguir
entre um estado ocioso e uma linha desconectada. Quando um caractere está prestes a ser transmitido, um bit de
início é enviado. Um bit inicial tem um valor de 0 (também chamado de estado de espaço). Assim, quando a linha
muda de um valor de 1 para um valor de 0, o receptor é alertado de que um caractere de dados está prestes a ser enviado.
A comunicação assíncrona é o padrão predominante na indústria de computadores pessoais, tanto porque é mais
fácil de implementar quanto porque tem a vantagem única de que os bytes podem ser enviados sempre que estiverem
prontos, em vez de esperar pelo acúmulo de blocos de dados.
Discutiremos esse modo de comunicação com mais detalhes. Quando o transmissor pretende enviar um byte,

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

INTERFACAÇÃO PERIFÉRICA - III 397

Paridade Pare Parado


Começar
8 bits Pedaço Bits
Parado
Pedaço

Enviado

Primeiro Enviado
D7
D0 Último

Pedaço

Tempo

Quadro de Personagem

Figura 11.1 | Um quadro de caracteres assíncrono típico

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.3 | Taxa de transmissão


Existem dois termos de uso comum, relativos à transmissão. Um é bits por segundo. Isso é o que vimos em
nossa discussão acima. Se o bps for especificado para ser 1200, significa que 1200 bits são enviados por
segundo.
Há um outro termo que é comumente usado em comunicações seriais, que é a taxa de transmissão.
Muitas pessoas usam essas palavras de forma intercambiável, o que não é correto, mas para entender a
diferença, precisamos discutir o equipamento chamado 'modem'. Para o caso de transmissão serial direta de
dados de um computador para outro em forma binária simples, a taxa de transmissão e os bps são os mesmos.

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

398 OS MICROPROCESSADORES x86

Modem Comunicação Modem


Computador Computador
Rede

Figura 11.2 | Um sistema de comunicação de computador para computador usando um modem

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).

11.2.5 | Baud Rate vs Bps A


diferença entre os dois é complicada e entrelaçada. Eles são dependentes e inter-relacionados.
No entanto, a explicação mais simples é que uma taxa de bits é o número de bits de dados
transmitidos por segundo. A taxa de transmissão é a medida do número de vezes por segundo que
um sinal em um canal de comunicação muda por segundo.
As taxas de bits medem o número de bits de dados (ou seja, 0's e 1's) transmitidos em um segundo em um canal de
comunicação. Um número de 2.400 bits por segundo significa que 2.400 zeros ou uns podem ser transmitidos em um
segundo, daí a abreviação bps.
Uma taxa de transmissão, por definição, significa o número de vezes que um sinal em um canal de comunicação
muda de estado ou varia. Por exemplo, uma taxa de transmissão de 2400 significa que o canal pode mudar de estado até
2400 vezes por segundo. O termo 'alterar estado' significa que pode mudar de 0 a 1 ou de 1 a 0 até X (neste caso, 2400)
vezes por segundo. Também se refere ao estado real da conexão, como tensão, frequência ou nível de fase.

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:

bps = bauds por segundo × o número de bits por baud

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.

11.2.6 | Padrões RS-232


Temos falado sobre o envio de dados como bits como '1' ou '0'. De acordo com os padrões TTL, esses níveis correspondem
a 5 V e 0 volts. No entanto, durante a transmissão em distâncias curtas (sem modem), digamos, de uma sala para outra,
os sinais de nível TTL serão facilmente corrompidos pelo ruído.

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

INTERFACAÇÃO PERIFÉRICA - III 399

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.

11.2.7 | Conversores de Nível RS-232


Quase todos os dispositivos digitais que usamos requerem níveis lógicos TTL ou CMOS. Dois Conversores
de Nível RS-232 comuns são o Driver RS-232 1488 e o Receptor RS-232 1489. Cada pacote contém 4
inversores de um tipo, Drivers ou Receivers. Veja a Fig 11.3 que mostra como e onde esses conversores
são usados, para conectar dois computadores próximos, usando um cabo RS-232. Um CI melhor para o
mesmo propósito é o MAX232 que pode ser usado para conversão em ambas as direções (veja a Fig
11.4).

11.2.8 | Conectores RS-232


As portas seriais na maioria dos computadores usam um subconjunto do padrão RS-232. O padrão
RS-232 completo especifica um conector D de 25 pinos, dos quais 22 pinos são usados. A maioria desses
pinos não é necessária para comunicações normais de PC e, de fato, a maioria dos novos PCs está
equipada com conectores tipo D macho com apenas 9 pinos. A Figura 11.5 mostra os conectores DB-25
e DB-9 e as Tabelas 11.1 e 11.2 descrevem as funções dos pinos desses conectores.

11.2.9 | Dispositivos DCE e DTE


Os dois termos que são comumente vistos na literatura de comunicação serial são DTE e DCE.
DTE significa Data Terminal Equipment e DCE significa Data Communications Equipment. Esses termos
são usados para indicar a pinagem dos conectores em um dispositivo e a direção dos sinais nos pinos. O
computador e os terminais que enviam e recebem dados são dispositivos DTE, enquanto outros
dispositivos como o modem que transferem dados geralmente são dispositivos DCE.
Para evitar confusão, lembre-se de que um DTE típico é um PC e um DCE típico é um modem.

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

Figura 11.3 | Comunicação serial usando cabo RS 232 e drivers/receptores de linha


Machine Translated by Google

400 OS MICROPROCESSADORES x86

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

Para CMOS ou TTL 9 8


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

INTERFACAÇÃO PERIFÉRICA - III 401

Tabela 11.1 | Funções dos pinos do conector DB-25


Número do pino Descrição Número do pino

1 Terra de proteção 13 Secundário claro para enviar

2 Dados transmitidos (T × D) 14 Dados secundários transmitidos

3 Dados recebidos (R × D) 15 Temporização do elemento de sinal de transmissão

4 Solicitação de envio (RTS) 16 Dados secundários recebidos

5 Limpar para enviar (CTS) 17 Receber temporização do elemento de sinal

6 Conjunto de dados pronto (DSR) 18 Não atribuído

7 Campo de sinal 19 Solicitação secundária para enviar

8 Detecção de portadora de dados (DCD) 20 Pronto para terminal de dados (DTR)

9 pino de teste de dados 21 Detector de qualidade de sinal

10 pino de teste de dados 22 Indicador de toque

11 Não atribuído 23 Seleção de taxa de sinal de dados

12 Detecção de portador de dados secundário 24 Temporização do elemento de sinal de transmissão

25 Não atribuído

Tabela 11.2 | Funções dos pinos do conector DB-9


Número do pino Descrição

1 Detecção de portadora de dados (DCD)

2 Dados recebidos (R × D)

3 Dados transmitidos (T × D)

4 Pronto para terminal de dados (DTR)

5 Terra do sinal (GND)

6 Conjunto de dados pronto (DSR)

7 Solicitação de envio (RTS)

8 Limpar para enviar (CTS)

9 Indicador de toque (RI)

DTE DCE
DCD

DSR

DTR

RTS

CTS

DT RD

RD DT

Figura 11.6 | Conexão típica DTE-DCE


Machine Translated by Google

402 OS MICROPROCESSADORES x86

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

Figura 11.7 | Conexão DTE–DTE usando uma conexão de modem nulo

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.

11.2.10 | Aperto de mão no protocolo RS232C


Vários sinais parecem estar envolvidos no protocolo RS232C, alguns dos quais são sinais de controle. Eles
são usados para handshake e nos permitem ver a sequência em que esses sinais ocorrem.
Suponha que um equipamento DTE (por exemplo, uma porta COM de um PC) e um equipamento DCE
(porta serial de um modem) devam realizar a transferência de dados. Os sinais de handshake envolvidos
nesta transferência de dados são os seguintes. Consulte a Fig 11.6 para entender a direção dos sinais.

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

INTERFACAÇÃO PERIFÉRICA - III 403

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.

11.3 | A interface de comunicação serial programável


Já que tivemos uma visão geral das comunicações seriais, vamos nos aprofundar um pouco mais. Sabemos que
dentro do processador e entre o processador e a memória da maioria dos dispositivos de E/S, os dados são
transferidos em paralelo. Portanto, se precisarmos tirá-lo de tal sistema em forma serial, é óbvio que é necessária
uma conversão paralela para serial. Da mesma forma, se os dados seriais são recebidos de uma linha serial,
eles precisam ser convertidos para o formato paralelo antes que o processador possa processá-los. Outro ponto
é que todas as regras e protocolos de comunicação serial devem ser garantidos antes de tentarmos enviar e
receber dados seriais. Todas estas questões terão de ser tratadas por um hardware dedicado e existem vários
CIs especializados disponíveis para o efeito. Listando alguns, temos:
8250 - Transmissor Receptor Assíncrono Universal (UART)
8251 – Transmissor Receptor Assíncrono Síncrono Universal (USART)
16550 - Transmissor Receptor Assíncrono Universal (UART)

Agora, vamos tentar entender os recursos do USART 8251.

11.3.1 | Receptor Universal Assíncrono/Síncrono/


Transmissor – USART 8251
O 8251 USART foi projetado para ser compatível diretamente com os processadores x86, bem como com os
demais processadores da família Intel. Ele atende a transmissão síncrona e assíncrona.
Ele pode aceitar dados do processador em forma paralela e convertê-los em um fluxo serial contínuo para
transmissão. Simultaneamente, ele também pode receber fluxos de dados seriais e convertê-los para o formato
paralelo para uso do processador. Ele sinaliza ao processador sempre que estiver pronto para aceitar um novo
caractere para transmissão e também sempre que tiver recebido um caractere para a CPU.
Ele insere e exclui os bits de enquadramento conforme necessário no modo de comunicação em que está
definido. Com efeito, as complexidades dos protocolos de comunicação que estão sendo usados não são sentidas
pelo programador além da dificuldade de escrever em registros de comando. Além disso, permite que a CPU leia
seu status completo a qualquer momento.
Machine Translated by Google

404 OS MICROPROCESSADORES x86

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

Figura 11.9 | Diagrama de pinos da USART

11.3.2 | Diagrama de Bloco Funcional


Vamos examinar o diagrama de bloco funcional do chip.

11.3.2.1 | Data Bus Buff er É o


bloco ao qual está conectado o barramento de dados (três estados bidirecional e 8 bits) do processador.
É através do barramento de dados que as palavras de controle e as palavras de status e os dados são
enviados do processador para o chip e vice-versa.

11.3.2.2 | Transmitter Buff er Este

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'.

11.3.2.3 | Controle do Transmissor


Este bloco gerencia todas as atividades associadas à transmissão. Ele aceita e emite os sinais
necessários para isso. Os sinais são:

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

INTERFACAÇÃO PERIFÉRICA - III 405

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

Figura 11.10 | Diagrama de bloco interno do 8251

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.

11.3.2.4 | Buffer de recepção


O receptor aceita dados seriais, converte essa entrada serial para o formato paralelo, verifica se
há dados exclusivos da técnica de comunicação e envia um caractere 'montado' para o processador.
Os dados seriais são tomados como entrada no pino R × D e são cronometrados na borda ascendente do R × C.
Machine Translated by Google

406 OS MICROPROCESSADORES x86

11.3.2.5 | Controle do Receptor


Este bloco funcional gerencia todas as atividades relacionadas ao receptor. Antes de começar a receber caracteres
seriais na linha R × D, um '1' válido deve primeiro ser detectado após uma reinicialização do chip master. Uma vez que
isto é obtido, uma busca por um valor baixo válido (Start bit) é habilitada. Isso ocorre apenas no modo assíncrono, e
isso é feito apenas uma vez para cada reinicialização do mestre. Os sinais associados ao controle do receptor são:

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.

11.3.2.6 | Bloco de Controle R/W


Neste bloco, há o read RD, write WR, chip select CS, reset e C/ D. Apenas o último pino precisa de explicação.

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

Registro de modo, comando


0 1
e status

11.3.2.7 | Bloco de controle de modem


Os pinos deste bloco realizam a função de interface com um modem e são os sinais de controle/status nele utilizados.
O 8251 possui um conjunto de entradas e saídas de controle que podem ser utilizadas para simplificar a interface com
qualquer modem. No entanto, esses sinais são de uso geral por natureza e podem ser usados para outras funções
além do controle do modem. Consulte a Seção 11.2.10 para saber como esses sinais são importantes na comunicação

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

INTERFACAÇÃO PERIFÉRICA - III 407

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.

11.3.3 | Como este chip funciona


Como qualquer outro chip de interface, o chip funciona de acordo com a forma como o programamos. Um conjunto de palavras
de controle deve ser enviado a ele para suportar o modo de comunicação em que ele deve operar.
Uma vez que o chip é programado para uso, ele está pronto para transmissão ou recepção. Para transmissão, a saída T × RDY
é elevada para informar à CPU que está pronta para transmitir o caractere que a CPU envia. Ao receber esta afirmação, a CPU
escreve um caractere no 8251 e então o pino T × RDY é resetado.

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.

11.3.4 | Programando o 8251


Antes de iniciar a transmissão ou recepção de dados, o 8251 deve receber um conjunto de palavras de controle. Isso deve ser
feito após um reset externo ou interno. As palavras de controle são divididas em dois formatos.

i) Palavra de controle de modo

ii) Palavra de comando

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.

11.3.5 | Modo Assíncrono


Vamos começar escrevendo as palavras de controle. A Figura 11.11 mostra o formato da palavra de modo.
Machine Translated by Google

408 OS MICROPROCESSADORES x86

D7 D6 D5 D4 D3 D2 D1 D0

S2 S1 PE PEN L2 L1 B2 B1

Fator de taxa de transmissão

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

Número de bits de parada

0 1 0 1

0 0 1 1

2/11
1 bit inválido 2 bits
bits

(Afeta apenas Tx. Rx nunca


requer mais de um bit de parada)

Figura 11.11 | Palavra de controle de modo

11.3.5.1 | Formato de instrução de modo


A palavra de modo, como mostrado, fixa a taxa de transmissão, o número de caracteres e os bits de parada
para transmissão. Lembre-se que quando a linha está ociosa, está no estado de marca ('1'). Um bit inicial é
sempre baixo. Isso deve ser seguido pelos bits de dados e, em seguida, os bits de parada. A inserção de bits
de início e fim junto com um caractere é chamada de 'enquadramento'. A taxa de transmissão é uma fração da
frequência de clock (T × C e R × C estão ligados para um link) e o fator pode ser 1, 16 ou 64. Se T × C = 9600
Hz, a taxa de transmissão é 9600 bps para um fator de 1 e 9600/16 = 600 para um fator de 16. Se D1 D0 = 00,
significa 'operação síncrona'. Para usar o chip no modo assíncrono, esses bits devem ter valores diferentes de
00, que também fixam o fator de taxa de transmissão.
O comprimento do caractere pode ser de 5, 6, 7 ou 8 bits e não inclui os bits de enquadramento ou bits
de paridade. Se o número de caracteres for menor que 8, os bits de barramento de dados menos significativos
conterão os dados; bits não utilizados não se importam ao escrever dados no 8251, e serão zeros ao ler.
Quando a paridade está habilitada, ela não é considerada como um dos bits de dados e o bit de paridade não
pode ser lido no barramento de dados. Os dois bits superiores especificam o número de bits de parada. As
Figuras 11.12 e 11.13 mostram claramente os formatos de transmissão e recepção. Deve ficar claro que um
caractere é enquadrado e enviado. Na recepção, os bits de enquadramento são removidos e apenas o 'caracter'
é considerado como o byte recebido.
Machine Translated by Google

INTERFACAÇÃO PERIFÉRICA - III 409

Gerado

D0–D1 D× Por 8251

Saída do transmissor

Começar
Bits de dados Paridade Pare
Pedaço Pedaço
Bits
Marcação T×D

Não aparece no barramento de


dados
D0–D1 D×

Entrada do Receptor

Começar Paridade
R×D Bits de dados Pare
Pedaço
Pedaço Bits

Programado

Comprimento do caractere

Figura 11.12 | O caractere enquadrado nos pinos T × D e R × D

Formato de transmissão

Byte de CPU

Caractere de dados

Saída de dados seriais montados (T×D)

Começar Paridade Pare


Caractere de dados
Pedaço Pedaço Bits

Formato de recebimento

Entrada de dados seriais (R×D)

Começar Paridade Pare


Caractere de dados
Pedaço Pedaço Bits

Byte de CPU

Caractere de dados

Figura 11.13 | Formatos de transmissão e recepção


Machine Translated by Google

410 OS MICROPROCESSADORES x86

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

A palavra de controle do modo é definida com referência à Fig. 11.11.

D7 D6 D5 D4 D3 D2 D1 D0
0 1 0 1 1 11 0
ou seja, 5EH

D7 D6 = 01 para 1 bit de parada


D5 D4 = 01, paridade ímpar habilitada
D3 D2 = 11, caractere de 8 bits D1 D0
= 10 fator de taxa de transmissão de 16x.

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.

11.3.5.2 | Formato de instrução de comando


A Figura 11.14 mostra o formato de instrução de comando.

Exemplo 11.2 Para

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

11.3.5.3 | Status Word O


8251 possui uma status word que nos permite ler o status do dispositivo durante sua operação.
Isso pode ser lido como e quando necessário e usado para realizar transmissão e recepção no
modo polled.

D7 D6 D5 D4 D3 D2 D1 D0
DSR SYNDET FE OE PE T × VAZIO R × RDY T × RDY

Vamos examinar os bits de status importantes:

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

INTERFACAÇÃO PERIFÉRICA - III 411

D7 D6 D5 D4 D3 D2 D1 D0

EH E RTS É SBRK R×E DTR T×EN

Ativar transmissão
1=Ativar
0=Desativar

Terminal de dados pronto


'alto' forçará o DTR
saída para zero

Ativar recebimento
1=Ativar
0=Desativar

Enviar caractere de pausa


1=Forças T×D 'baixas'
0=Operação normal

Redefinição de erro

1=Redefinir sinalizadores de erro


PE, OE, FE

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

Entre no modo de caça*


1=Ativar pesquisa para sincronização
Personagem

*(Não tem efeito em


modo assíncrono)

Figura 11.14 | Formato de instrução de comando

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.

PE (Erro de Paridade) Este bit é definido quando há um erro de paridade.

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

412 OS MICROPROCESSADORES x86

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.

11.3. 6 | Programando o 8251


Agora que temos uma ideia dos aspectos importantes do chip, podemos programar o chip para transmissão e
recepção.

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

A palavra de controle de modo usada é mostrada aqui. A paridade está desabilitada.

D7 D6 D5 D4 D3 D2 D1 D0

01 001110

ou seja, 4 EH

D7 D6 = 01 para 1 bit de parada


D5 D4 = 00 paridade desabilitada
D3 D2 = 11, caractere de 8 bits
D1 D0 = 10 fator de taxa de transmissão de 1/16

TRANS DB 'S' ;o caractere a ser transmitido ;espaço para caractere


RECD DB? recebido

DATR EQU 0C0H


CSR EQU 0C2H

MOV AL, 4EH ;modo


OUT CSR, AL word ;envia para o registrador de controle/status
MOV AL, 37H ;palavra de comando
OUT CSR, AL ;envia para o registro de controle/status
MOV AL, TRANS ;mover personagem para AL
OUT DATR, AL ;envia para o registro de dados

EM AL, DATR ;mover dados recebidos para AL


MOV RECD, AL ;guarda na memória
FIM
Machine Translated by Google

INTERFACAÇÃO PERIFÉRICA - III 413

CTS

RTS
8

2 RXD

5 T×D

1
T×C

R×C

Relógio

Figura 11.15 | Modo de retorno

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

DATR EQU 0C0H


CSR EQU 0C2H

TRANS DB 'INDIAN' ;local para string de caracteres

LEA BX, TRANS ;aponta BX para string de caracteres


MOV CX, 06 ;CX = o número de caracteres
MOV AL, 4EH ;modo palavra
OUT CSR, AL ;envia para o registro de controle
MOV AL, 33H ;palavra de comando para habilitar Tx
OUT CSR, AL ;envia para o registrador de controle ;leia no
REPEA: IN AL, CSR registrador de status
E AL, 01 ;teste se D0 é 1. ou seja, Tx está pronto?
É ESTUPRADO ;se não for '1', continue testando
NXT: MOV AL, [BX] ;caso contrário pega o caractere em AL ;envia
OUT DATR, AL para o registrador de dados
INC BX ;ponteiro de incremento
LOOP NXT ;continua até CX = 0
FIM
Machine Translated by Google

414 OS MICROPROCESSADORES x86

PROGRAMA DO RECEPTOR

DATR EQU 0C0H


CSR EQU 0C2H

RECD DB 6 DUP(0) ;localização dos dados recebidos

LEA SI, RECD ;aponta SI para string de caracteres


MOV CX, 06 ;CX = o número de caracteres ;modo palavra
MOV AL, 4EH
OUT CSR, AL ;envia para o registro de controle
MOV AL, 36H ;palavra de comando para habilitar o receptor
OUT CSR, AL ;envia para o registrador de controle ;ler no
REPEA: IN AL, CSR registrador de status ;teste se D1 é 1. ou
E AL, 02 seja, Rx está pronto?

É ESTUPRADO ;se não for '1' continue testando


NXT: EM AL, DATR ;pega o personagem recebido no Al
MOV [SI], AL ;movê-lo para a memória
INC SIM ;ponteiro de incremento
LOOP NXT ;continua até CX = 0
FIM

Os pontos de destaque dos programas são:


i) A palavra de controle de modo para o transmissor e o receptor é a mesma. A RSE é o
control /status registrador e DATR é o registrador de dados.
ii) As palavras de comando habilitam a transmissão ou recepção e fazem com que o pino RTS fique baixo.
É suficiente habilitar apenas o transmissor no programa do transmissor e o receptor no programa do
receptor. Assim, a palavra de comando para o transmissor é 33H e para o receptor é 36H.

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.

11.4 | Reinicialização interna ao ligar


Quando a energia é ligada pela primeira vez, espera-se que o 8251 chegue ao estado de reinicialização, mas às
vezes isso não acontece. Em vez disso, pode aparecer no modo, caractere de sincronização ou formato de
comando. Para operação normal, precisamos que seja 'reset', então enviamos a palavra de modo e depois a
palavra de comando. Para garantir que isso seja feito, podemos colocá-lo no 'formato de instrução de comando
e, a partir daí, causar um 'reset interno'. Isso é feito executando a sequência de inicialização do pior caso (modo
de sincronização com dois caracteres de sincronização). Carregando três 00s nas configurações do registrador de controle
Machine Translated by Google

INTERFACAÇÃO PERIFÉRICA - III 415

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

MOV AL, 00 ;AL = 00


OUT CSR, AL ;envia AL para o CSR
OUT CSR, AL ;envia AL para o CSR
OUT CSR, AL ;envia AL para o CSR
MOV AL, 01000000B ;palavra de comando com D6 = 1
OUT CSR, AL ;envia para o CSR para reset interno

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 no PC está obsoleta?

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.

11,5 | Acesso direto à memória


A transferência de dados entre periféricos e memória é uma atividade frequente em qualquer sistema de computador.
Existem três métodos pelos quais isso pode ser feito – vimos dois desses métodos – polling e transferência de
dados baseada em interrupção. O polling é inaceitável, exceto em sistemas muito pequenos, porque mantém o
processador em um loop de espera. A transferência de dados baseada em interrupção é boa porque somente
quando a transferência de dados é necessária, o processador é acionado para isso.
Agora, existe um terceiro método de transferência de dados que é o 'acesso direto à memória'. Uma breve
introdução a isso foi dada na Seção 6.3.2. A palavra 'direto' significa que os dados podem ser transferidos entre
um periférico e a memória sem a intervenção do processador – uma conexão direta é estabelecida entre esses
dois (um fonte e outro destino). Consulte a Fig 6.19. Como o processador está efetivamente isolado dessa função
de transferência de dados, ele fica livre para realizar outras atividades de processamento, mas apenas as
atividades que não exigem o uso do barramento do sistema (que agora está sendo usado para DMA). Além disso,
como o processador fica sem acesso ao barramento do sistema, esse tipo de transferência de dados é justificável
apenas para a transferência de grandes blocos de dados. Assim, o DMA é usado para transferir grandes blocos
de dados de/para memória e periféricos. A Figura 6.19 é redesenhada aqui para explicar o funcionamento do
DMA.
HOLD e HLDA são dois pinos do processador. Sempre que um dispositivo deseja que uma operação de
DMA seja iniciada, ele faz uma solicitação no pino HOLD do processador. Como o diagrama de tempo indica,
HOLD é amostrado no meio de uma borda de clock. Então o processador completa o ciclo de barramento atual
(não o ciclo de instrução atual) e entra no estado de espera após enviar um
Machine Translated by Google

416 OS MICROPROCESSADORES x86

T4 ou T1 Ciclos DMA

CLK

AGUARDE

HLDA

Execução Execução
Estado de retenção
Suspenso Currículos

Figura 11.16 | Tempos de ciclo de DMA

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.

11.5.1 | Controlador DMA


Vamos rever o conceito de DMA. A ideia é transferir dados em um dos seguintes
casos.

i) da memória para um periférico


ii) de um periférico para a memória
iii) de memória para memória (um caso especial)
É óbvio que existe a necessidade de um controlador que forneça informações à CPU sobre os endereços de
origem e destino e também o número de bytes a serem transferidos. Assim, as operações de DMA requerem o
que é chamado de controlador de DMA.
Os controladores DMA variam quanto ao tipo de transferências DMA e ao número de canais DMA que eles
suportam. Existem dois tipos de transferências DMA, a saber, transferências DMA fl yby e transferências DMA
de busca e depósito. Há também três modos de transferência comuns – modos de transferência simples, em
bloco e sob demanda. Esses tipos e modos de transferência DMA são descritos nos parágrafos a seguir.

11.5.2 | DMA sobrevoo


O tipo de transferência de DMA mais rápido é conhecido como transferência de ciclo único, endereço único ou
fl yby. Em uma transferência fl yby DMA, uma única operação de barramento é usada para realizar a
transferência, com os dados sendo lidos da origem e gravados no destino simultaneamente.
Na operação fl yby, o dispositivo que solicita o serviço afirma uma solicitação de DMA na linha de solicitação
de canal apropriada do controlador de DMA. O controlador DMA responde ganhando o controle do barramento
do sistema da CPU e, em seguida, emitindo o endereço de memória pré-programado. Simultaneamente, o
controlador DMA envia um sinal de reconhecimento DMA para o dispositivo solicitante. Este sinal alerta o
dispositivo solicitante para conduzir os dados para o barramento de dados do sistema ou para travar os dados
do barramento do sistema, dependendo da direção da transferência. Em outras palavras, um vôo
Machine Translated by Google

INTERFACAÇÃO PERIFÉRICA - III 417

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)

Dados (dispositivo de E/0) Dados

Figura 11.17 | Tempo associado à operação fl yby DMA (gravação 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.

11.5.3 | Buscar e depositar DMA


O segundo tipo de transferência DMA é conhecido como transferência DMA de ciclo duplo, endereço duplo, fluxo ou
busca e depósito. Como esses nomes implicam, esse tipo de transferência envolve dois ciclos de memória ou E/S.
Os dados que estão sendo transferidos são lidos primeiro do dispositivo de E/S ou da memória em um registro de
dados temporário interno ao controlador DMA. Os dados são então gravados na memória ou no dispositivo de E/S
no próximo ciclo. Embora ineficiente porque o controlador DMA realiza dois ciclos e, portanto, retém o barramento do
sistema por mais tempo, esse tipo de transferência é útil para dispositivos de interface com diferentes tamanhos de
barramento de dados. Por exemplo, um controlador DMA pode executar duas operações de leitura de 16 bits de um
local, seguidas de uma operação de gravação de 32 bits para outro local. Um controlador DMA que suporta esse tipo
de transferência possui dois registradores de endereço por canal (endereço de origem e endereço de destino) e
registradores de tamanho de barramento, além da contagem de transferência e registradores de controle usuais. Ao
contrário da operação fl yby, este tipo de transferência DMA é adequado para transferências de memória para
memória e de E/S. A Fig 11.18 mostra o tempo associado a isso.

11.5.4 | Modos de transferência DMA


Além dos tipos de transferência DMA, os controladores DMA possuem um ou mais modos de transferência DMA.
Único, bloco e demanda são os modos de transferência mais comuns.

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

418 OS MICROPROCESSADORES x86

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

Dados Dados Dados

Figura 11.18 | Tempo para buscar e depositar DMA

Trava de endereço

Endereço
Barramento de endereços

C Barramento de dados

P Barramento de dados Memória

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

Figura 11.19 | Conceito de DMA

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

INTERFACAÇÃO PERIFÉRICA - III 419

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.

11.5.5 | Recursos do controlador DMA


Em um sistema, pode haver vários dispositivos de E/S que precisam de ação DMA. Cada um deles terá que
ser suportado pelo controlador de DMA, que deve ter um número de 'canais', cada um atendendo a um
dispositivo solicitante de DMA. Para cada canal no controlador DMA, certos componentes são replicados no
controlador, enquanto outros são comuns a todos os canais.
Lembre-se de que apenas uma operação DMA é possível no sistema em um determinado momento.
Agora veja a Fig. 11.20. Pode haver n canais no controlador DMA que permitem que o canal atualmente
ativo seja designado como canal 'N'. Para transferências DMA, o endereço inicial na memória e o número de
bytes a serem transferidos devem ser especificados. Para cada canal, o controlador DMA salva o endereço e
a contagem programados nos registradores da base e mantém cópias das informações no endereço atual e
nos registradores de contagem atual, conforme mostrado na figura.
Cada canal DMA é habilitado e desabilitado através de um registro de máscara DMA. Quando o DMA é
iniciado escrevendo nos registradores base e habilitando o canal DMA, os registradores atuais são carregados
dos registradores base. Com cada transferência DMA, o valor no registrador de endereço atual é direcionado
para o barramento de endereço e o registrador de endereço atual é incrementado automaticamente. O registro
de contagem atual determina o número de transferências restantes e é decrementado automaticamente após
cada transferência. Quando o valor no registrador de contagem atual vai para 0, um sinal de contagem
terminal (TC) é gerado, o que significa a conclusão da sequência de transferência DMA.

11.6 | O Controlador DMA – 8237


Agora que discutimos as operações de DMA em geral, vamos ver os recursos do chip controlador de DMA
multimodo 8237A da Intel, que possui todos os recursos mencionados acima.
Este é um chip de 40 pinos com quatro canais para transferência de dados, cada um dos quais atende
a um dispositivo. Para cada canal, existem dois sinais, DREQ (DMA Request) e DACK (DMA Acknowledge).
A primeira é uma solicitação de um dispositivo periférico solicitando facilidade de DMA, e a segunda é a
resposta do controlador informando ao dispositivo que sua solicitação foi aceita e confirmada. Do controlador
DMA para o processador, há apenas um sinal HOLD e HLDA, o que significa que pelo menos quatro
dispositivos podem solicitar serviços DMA, mas apenas um deles receberá o serviço e isso é decidido pelo
controlador DMA, de acordo com as prioridades da forma são programados no chip. No entanto, cada canal
deve ser inicializado separadamente para o endereço base e a contagem de bytes a serem transferidos. Feito
isso, uma palavra de controle habilitará e controlará os canais. Veja o diagrama de blocos funcional do chip
8237 na Fig 11.21.
Machine Translated by Google

420 OS MICROPROCESSADORES x86

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

CANAL DMA 'N'


B

dentro

O PNEU s

Árbitro DMA DRQN

Bus Req. Concessão de ônibus

CPU

Figura 11.20 | Um diagrama de blocos geral de um controlador DMA

11.6.1 | Programando o Controlador 8237 DMA Assim como


qualquer outro chip de interface, este chip também é programado escrevendo palavras adequadas em
seus registradores internos. Vamos ver como isso é feito. Tenha em mente que existem quatro canais,
que precisam de certas informações para serem fornecidas a eles. Existem dois registradores associados a
cada canal:
i) Cadastro de endereço base. ii)

Registo base de contagem de palavras.


Machine Translated by Google

INTERFACAÇÃO PERIFÉRICA - III 421

Vcc Vss

Microprocessador Aperto de mão DMA


Interface Sinais
A0–A3
A4–A7 DRE Q0
DB0–DB7 DRE Q1
DRE Q2
ADSTB
DRE Q3
AEN
MEMRD
GROSSO 0
MEMBRO GROSSO 1
8237A GROSSO 2
IORD ESPESSURA 3

IOWR

HRQ
PRONTO
HLDA
REDEFINIR

CLK EOP

CS

Figura 11.21 | Diagrama de bloco funcional do chip 8237

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

422 OS MICROPROCESSADORES x86

Tabela 11.3 | Endereços dos Registros dos Quatro Canais

Nome do registro do canal Operação A3 A2 A1 A0 Endereço (Hex)


0 Endereço básico Escreva 0 0 0 0 C0
Morada atual Ler 0 0 0 0 C0
Contagem básica Escreva 0001 C1
Contagem atual Ler 0001 C1
1 Endereço básico Escreva 0 0 1 0 C2
Morada atual Ler 0 0 1 0 C2
Contagem básica Escreva 001 1 C3
Contagem atual Ler 001 1 C3
2 Endereço básico Escreva 0 1 0 0 C4
Morada atual Ler 0 1 0 0 C4
Contagem básica Escreva 0 1 0 1 C5
Contagem atual Ler 0 1 0 1 C5
3 Endereço básico Escreva 01 1 0 C6
Morada atual Ler 01 1 0 C6
Contagem básica Escreva 01 1 1 C7
Contagem atual Ler 01 1 1 C7

A0 A0

A1 A1
8
A2 A2 2

A3 A3 3
7

A4
A5
CS
A6
A7

Figura 11.22 | Decodificação de endereço

11.6.2 | Diagrama de Blocos Funcionais

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

INTERFACAÇÃO PERIFÉRICA - III 423

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.

MOV AL, 30H ;mover o LSB do endereço base para AL


SAÍDA 0C2H, AL ;envia para o registrador de endereço base
MOV AL, 32H ;move o MSB do endereço base para AL
SAÍDA 0C2H, AL ;envia para o registrador de endereço base
MOV AX, 4096 ;mover a contagem de bytes para AX
SAÍDA 0C3H, AL ;envia LSB de contagem para o registrador de contagem
MOV AL, AH ;mover MSB de contagem para AL
SAÍDA 0C3H, AL ;envia MSB de contagem para o registrador de contagem

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.

11.6.3 | Endereços de memória acima de 64 KB No

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.

Agora, vamos revisar totalmente a operação do barramento de endereços.

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

424 OS MICROPROCESSADORES x86

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

Figura 11.23 | Geração de endereço para operação DMA

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

INTERFACAÇÃO PERIFÉRICA - III 425

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.

11.6.4 | Inicialização e Programação do 8237


Continuando com a idéia de programar o chip 8237, vejamos os registradores que ele possui para
comando, status e modos. Como projetamos a lógica do CS como na Figura 11.22, os endereços desses
registradores são os da Tabela 11.4.

Registro de Comando/Status O registro de comando é o registro usado para controlar a operação do


chip DMA. Para isso, o registro deve ser escrito. O mesmo registrador é usado como registrador de status
quando seu conteúdo é lido. Primeiro, vamos ver o formato do registrador de comando.

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,

iii) prioridade rotativa,


iv) gravação tardia,

v) DREQ e DACK ativo alto,

Solução

Consulte o formato da palavra de comando na Fig 11.24.

D7 D6 D5 D4 D3 D2 D1 D0
10 011000

A palavra de comando é 98H.

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

Tabela 11.4 | Endereços de Registros Internos

Nome do registro A3 A2 A1 A0 Endereço (hex)


Status/Registro de Comando 1000 C8

Solicitar Cadastro 1001 C9

Registro de Bit de Máscara Única 1010 ESTE

Registro de modo 101 1 CB

Limpar ponteiro de bytes 1 100 CC

Master Clear/Registro Temperário 1 101 CD

Limpar registro de máscara 1 1 10 ISTO

Cadastro de Máscaras 1 1 1 1 FC
Machine Translated by Google

426 OS MICROPROCESSADORES x86

D7 D6 D5 D4 D3 D2 D1 D0

0–Memória'-'para'-'desativar memória
1–Ativar memória'-'para'-'memória

0–Desativação de retenção de endereço do canal 0

1–Habilitar retenção de endereço do canal 0

X–Se bit D0'='0

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

0–Seleção de gravação tardia


1– Seleção de gravação estendida
X–Se bit 3'='1

0–DREQ sensor ativo alto


1– DREQ sensor ativo baixo

0–DACK sentido ativo baixo


1–DACK sensor ativo alto

Figura 11.24 | Status do registro de comando

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.

11,7 | DMA e IBM-PC


No IBM-PC original, apenas um chip 8237 foi usado e seus quatro canais foram alocados para os seguintes
dispositivos:

i) Canal 0 para atualizar a DRAM:

ii) Canal 1 não utilizado, mas permitido para qualquer aplicação de E/S.
Machine Translated by Google

INTERFACAÇÃO PERIFÉRICA - III 427

D7 D6 D5 D4 D3 D2 D1 D0

1–O canal 0 atingiu o TC

1–O canal 1 atingiu o TC

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

Figura 11.25 | Formato de registro de status

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'

0–Desativação de inicialização automática


1–Ativar inicialização automática

0 – Seleção de incremento de endereço


1– Seleção de decremento de endereço

00– Seleção do modo de demanda


01–Seleção de modo único
10–Seleção do modo de bloqueio
11–Seleção do modo cascata

Figura 11.26 | Formato de registro de modo

iii) Canal 2 para controlador de disquete.


iv) Canal 3 para controlador de disco rígido.

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

428 OS MICROPROCESSADORES x86

11.7.1 | DMA e PC-AT


Com o advento do barramento ISA para computadores do tipo PC-AT, dois controladores DMA passaram a ser utilizados.
Dois controladores Intel 8237-DMA foram conectados em cascata e cada chip tinha quatro canais. A alocação de canais foi
a seguinte:

0 DRAM Atualizar (obsoleto),


1 Hardware do usuário,
2 controlador de disquete,
3 Disco rígido (obsoleto)
4 Cascata do controlador XT DMA,
5 Disco rígido (somente PS/2), hardware de usuário para todos os outros,
6 Hardware do usuário,
7 Hardware do usuário.

11,8 | Computadores baseados em PCI


O desenvolvimento mais recente em PCs é o barramento PCI. Este barramento tem uma filosofia diferente em relação ao
barramento ISA. No que diz respeito ao DMA, o cenário é o seguinte.
Uma arquitetura PCI não possui controlador DMA central, ao contrário do ISA. Em vez disso, qualquer componente
PCI pode solicitar o controle do barramento (tornar-se o mestre do barramento) e solicitar leitura e gravação da memória do
sistema. Mais precisamente, um componente PCI solicita a propriedade do barramento do controlador de barramento PCI
(geralmente a ponte sul em um design de PC moderno), que arbitrará se vários dispositivos solicitarem a propriedade do
barramento simultaneamente, pois só pode haver um mestre de barramento por vez. Quando o componente recebe a
propriedade, ele emitirá comandos normais de leitura e escrita no barramento PCI, que serão reivindicados pelo controlador
do barramento e encaminhados ao controlador de memória usando um esquema específico para cada chipset.

PONTOS-CHAVE DESTE CAPÍTULO

| A comunicação serial é o método preferido de transmissão de dados em longas distâncias.

| 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.

| Os modems são usados para conectar computadores a um meio de transmissão analógico.

| 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.

| Dois termos comumente usados em comunicações seriais são DTE e DCE.

| Há vários sinais de handshake no protocolo RS-232.

| Existem muitos chips usados como interfaces de comunicação serial, mas o chip discutido aqui é o
USART 8251.

| Este chip atende a comunicações síncronas e síncronas.


Machine Translated by Google

INTERFACAÇÃO PERIFÉRICA - III 429

| O método de programação deste chip é escrever em modo e palavras de comando.

| O acesso direto à memória é uma atividade de alta prioridade em qualquer sistema de computador.

| Flyby DMA é muito mais eficiente do que buscar e depositar DMA.

| 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

1. Distinguir entre comunicações simplex e duplex.

2. Compare os méritos e deméritos das comunicações assíncronas com a serial síncrona


comunicações.

3. O que é RS-232C?

4. Explique como a taxa de transmissão e os bps podem ser diferentes.

5. Onde é usado o chip MAX 232 e para que finalidade?

6. Para que serve uma conexão de modem nulo?

7. Quantas linhas são necessárias para haver comunicação serial entre dois computadores?

8. Explique as funções dos pinos T × RDY e R × RDY do 8251.

9. O que acontece com os bits de início e parada no ponto de recebimento?

10. Como a taxa de transmissão é decidida ao usar o 8251?

11. Por que o DMA é considerado uma atividade de alta prioridade?

12. Quais são os recursos esperados de um controlador DMA?

13. O que significa a palavra 'Contagem de Terminais'?

14. Quando o DMA de memória para memória é necessário? Mencione um caso específico.

15. Por que se diz que o fl yby DMA é muito eficiente?

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.

3. Escreva instruções para ler as seguintes condições:


a) T × RDY
b) T × VAZIO
Machine Translated by Google

430 OS MICROPROCESSADORES x86

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.

5. Para o 8237, crie uma palavra de comando para as seguintes condições:


a) periférico à transferência de memória,
b) tempo normal,
c) DREQ ativo baixo,
d) DACK ativo alto,
e) prioridades fixas.
Machine Translated by Google

semicondutor

1 2 dispositivos de memória

Neste capítulo, você aprenderá


| Os conceitos associados a semicondutores | A razão pela qual a SDRAM é considerada superior
memória. à DRAM.
| A arquitetura interna da SRAM. | Os diferentes tipos de memória programável.
| O princípio de funcionamento da memória | A necessidade de ter cache em um sistema.
DRAM. | As diferentes técnicas de mapeamento de cache utilizadas.
| Os sinais de controle associados à DRAM. | A estrutura de cache dos processadores x86.

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

Imagem de abertura do capítulo: Um chip EPROM.


Machine Translated by Google

432 OS MICROPROCESSADORES x86

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.)

12.1 | Memória de semicondutor


No entanto, primeiro, vamos discutir alguns aspectos gerais das memórias de semicondutores. Os dados são
armazenados na memória e geralmente são definidos como 'orientados a byte' (na maioria dos casos). Isso
significa que um endereço corresponde a um byte de memória. Assim, quando um endereço é acessado, um
byte é lido ou escrito nele.
Ler e escrever leva um certo tempo e isso é chamado de 'tempo de acesso à memória'. Para leitura, este
é o intervalo de tempo desde o instante em que o endereço é colocado nos pinos de endereço até o momento
em que os dados estão disponíveis nos pinos de dados. Uma definição semelhante também se aplica ao tempo
de acesso de gravação. O tempo de acesso de qualquer dispositivo de memória depende da tecnologia envolvida.
Outro termo frequentemente encontrado pode ser 'tempo de ciclo de memória'. Este é o intervalo de tempo entre
dois acessos consecutivos à memória. Esses termos serão usados com frequência ao longo deste capítulo.
Agora, vamos discutir os diferentes tipos de RAM.

12.1.1 | RAM Estática (SRAM)


Este é o tipo de RAM em que os dados são mantidos até que a energia seja removida. Cada célula contém um
'0' ou um '1'. O circuito para uma célula de memória SRAM individual compreende tipicamente quatro transistores
configurados como dois inversores de acoplamento cruzado. Neste formato o circuito funciona como um fl ip fl
op com dois estados estáveis, um lógico 0 ou um 1. Além dos quatro transistores na célula de memória básica,
são necessários mais dois transistores para controlar o acesso à célula de memória durante as operações de
leitura e escrita. Isso faz um total de seis transistores, fazendo o que é chamado de célula de memória de 6 T.
Às vezes, mais transistores são usados para fornecer células de memória de 8 T ou 10 T.
Esses transistores adicionais são usados para funções como a implementação de portas adicionais em um
registrador.
A Figura 12.1 mostra um chip SRAM típico que possui N linhas de endereço, M linhas de dados e sinais
de controle para leitura e escrita. Somente quando a linha CS (Seleção de Chip) for ativada o chip se tornará
utilizável (selecionado ou habilitado). Para leitura e escrita, o processador gerou

A0
D0

BATER

DM-1

AN-1

NÓS CS VOCÊ ESTÁ

MEMBRO MEMRD
SELECIONAR

Figura 12.1 | Pinos de um chip SRAM típico


Machine Translated by Google

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 433

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

12.1.2 | Ciclo de leitura de memória

As etapas em um ciclo de leitura de SRAM são as listadas:

i) Coloque o endereço do byte a ser lido, no barramento de endereços.

ii) Certifique-se de que o chip esteja ativado, tornando o CS baixo.

iii) Ative o pino OE . Isso garante que os dados sejam lidos.

iv) Os dados necessários aparecem então no barramento de dados.

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).

12.1.3 | Ciclo de gravação de memória

Um ciclo de gravação também tem um tempo semelhante. Os passos na escrita são:

i) Coloque o endereço do byte a ser lido, no barramento de endereços.

ii) Certifique-se de que o chip esteja ativado, tornando o CS baixo.

iii) Coloque os dados a serem escritos no barramento de dados.

iv) Ative a linha WR . Só então os dados são considerados válidos.

Os dados são então escritos no local endereçado.

tRC

Endereço Endereço válido

CS

VOCÊ ESTÁ

Saída de dados Dados válidos

tAA

Figura 12.2 | Ciclo de leitura de uma SRAM típica


Machine Translated by Google

434 OS MICROPROCESSADORES x86

Endereço

CS

Dados Dados Dados válidos

WR

Dados Dados

configurar em espera

Figura 12.3 | Ciclo de gravação de uma SRAM típica

Ler lógica

Endereço

Memória

Variedade
VOCÊ ESTÁ
Dados

CS Lógica

WR

Coluna

Decodificador

Lógica de Gravação

Figura 12.4 | Arquitetura interna de um chip SRAM típico

12.1.4 | Arquitetura interna de um chip SRAM Como as

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

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 435

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.

Quais são os méritos e deméritos da SRAM?

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.

12.2 | RAM dinâmica


Outra RAM muito popular é a 'RAM dinâmica'. Ele é designado como dinâmico porque seu conteúdo não permanece
inalterado ou estático como na SRAM e, portanto, é necessária uma 'atualização' frequente.
Para entender esse ponto, vamos ver o que está contido em uma célula DRAM típica (Fig. 12.5). Uma célula de
memória DRAM consiste, como mostrado, em um transistor de efeito de campo único (FET) e um capacitor.
É a quantidade de carga armazenada no capacitor que decide se a célula armazena um '1' ou um '0'. Um dos
problemas com esse arranjo é que os capacitores não mantêm sua carga indefinidamente, pois a carga em um
capacitor 'vaza' e precisa ser reabastecida. Essa ação de repor a carga perdida é feita 'refrescando' a célula em
intervalos regulares. Os dados são detectados e gravados e isso garante que qualquer vazamento seja superado e os
dados sejam restabelecidos. As duas linhas, a Word Line e a Bit Line são conectadas como mostrado, de modo que o
bit necessário dentro da memória possa ser selecionado para ser lido ou escrito.

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.

12.2.1 | Ciclo de leitura de DRAM


Vejamos as etapas envolvidas em uma leitura de memória típica de um chip DRAM. Lembre-se de que um
processador ao endereçar a memória envia o endereço completo em seus pinos de endereço. Entre o

Linha de palavras

Gnd

Figura 12.5 | Célula DRAM típica


Machine Translated by Google

436 OS MICROPROCESSADORES x86

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.

Vejamos as etapas em um ciclo de leitura típico de DRAM. Consulte o diagrama interno de um


chip DRAM (Fig 12.7) e o diagrama de tempo na Fig 12.8.

i) O endereço de linha é colocado nas linhas e dado tempo suficiente para estabilizar e ser
travado.

ii) O sinal Row Address Strobe RAS é então ativado.

iii) O Decodificador de Endereço de Linha seleciona a linha apropriada.

iv) Em seguida, o endereço da coluna é colocado nas mesmas linhas de endereço e permitido estabilizar e
ser travado.

v) O sinal Strobe CAS de Endereço de Coluna é então ativado.

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

Figura 12.6 | Controlador de memória para uma DRAM


Machine Translated by Google

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 437

Barramento de endereços Barramento de dados

CAS

Trava de endereço da coluna

Decodificador de endereço de coluna

Endereço Endereço
MEMÓRIA
da linha da linha
VARIEDADE
Robusto Dcdr
RAS

Sentir e Atualizar

Amplificadores

Figura 12.7 | Arquitetura interna de um chip DRAM

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

Figura 12.8 | Ciclo de leitura típico de DRAM


Machine Translated by Google

438 OS MICROPROCESSADORES x86

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

Figura 12.9 | Sinais e componentes de um chip DRAM típico


Machine Translated by Google

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 439

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:

i) Usando o CAS antes da atualização do RAS (CBR)


ii) Atualização automática

12.2.3 | Modo de página rápida DRAMS


As DRAMs que discutimos na Seção 12.2.1 são chamadas de DRAMs de modo padrão e sua característica é que
elas requerem dois componentes de acesso – acesso por linha e acesso por coluna. Colocar os endereços um após
o outro, ou seja, ter que multiplexar os endereços das linhas e colunas nos mesmos pinos, obviamente dobra os
tempos de acesso.
Nas DRAMs de modo de página rápida, a ideia usada é que, como o acesso aos dados é sequencial por
natureza, os endereços de linha e coluna precisam ser fornecidos apenas uma vez. Depois disso, o endereço da
linha é mantido o mesmo, pois é o endereço da mesma página (uma página é definida como todas as células de
memória que possuem um endereço de linha comum) e o endereço da coluna sozinho é alterado, até que o final da
página é atingido. Assim, o tempo para colocar o endereço de linha para cada ciclo de leitura é eliminado e a
velocidade de acesso é aumentada.

12.2.4 | EDORAM (Extended Data Out RAM)


Em 1995, um novo tipo de memória chamado Extended Data Out (EDO) RAM tornou-se disponível para sistemas
Pentium. EDO, uma forma modificada de FPM, às vezes também é chamado de modo Hyper Page. A memória EDO
consiste em chips especialmente fabricados que permitem uma cronometragem entre acessos sucessivos. A EDO
DRAM é semelhante à DRAM do modo de página rápida com o recurso adicional de que um novo ciclo de acesso
pode ser iniciado enquanto mantém ativa a saída de dados do ciclo anterior. Os drivers de saída de dados não
são desabilitados quando o CAS fica alto na EDO DRAM, permitindo que os dados do ciclo de leitura atual
estejam presentes nas saídas enquanto o próximo ciclo de leitura começa, resultando em um tempo de ciclo
mais rápido.
A frase anterior precisa de um pouco mais de explicação para ser compreendida. Verifique a Fig 12.8 que
mostra o tempo do ciclo de leitura. Leia também novamente a frase (na Seção 12.2.1) que diz

* JEDEC (Conselho Conjunto de Engenharia de Dispositivos Elétrons)


A JEDEC Solid State Technology Association, anteriormente conhecida como Joint Electron Device Engineering Council(s)
( JEDEC), é o órgão de padronização de engenharia de semicondutores da Electronic Industries Alliance (EIA), uma associação
comercial que representa todas as áreas da indústria eletrônica nos Estados Unidos. Estados.
A JEDEC tem mais de 300 membros, incluindo algumas das maiores empresas de informática do mundo.
Machine Translated by Google

440 OS MICROPROCESSADORES x86

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.

12.3 | DRAM síncrona (SDRAM)


Você deve ter notado a palavra 'assíncrono' quando falamos sobre o ciclo de tempo de leitura da DRAM.
Isso significa que o tempo de acesso não está relacionado ao relógio do sistema. Por volta de 1996, um
novo tipo de DRAM começou a avançar na área de memória e essa inovação tecnológica em DRAMs é
chamada de Synchronous DRAM. Para este tipo de DRAM, os acessos são sincronizados com o relógio do
sistema e SDRAM é atualmente 'a' RAM que é usada como memória primária (principal) em sistemas de
computador. Agora, vamos ver o que a SDRAM tem a oferecer em termos de melhorias em relação à DRAM
assíncrona. Tecnologicamente, eles são semelhantes, mas a SDRAM incorporou alguns novos recursos e
modos de operação. Vamos tentar entender cada uma dessas características.

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

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 441

Conjunto B Conjunto A

000003 000002 000001 000000


000007 000006 000005 000004
00000B 00000A 000009 000008

SER SER SER SER

D31 D24 D23 D16 D15 D8 D7 D0

Figura 12.10 | Bancos de memória intercalados

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

442 OS MICROPROCESSADORES x86

T0 T1 T2 T3 T4 T5

CLK

COMANDO LER NOP NOP NOP LER NOP

BANCO
MORADA COL n

DÚVIDA DÚVIDA DÚVIDA DÚVIDA


DQ n n+1 n+2 n+3

CL = 2

Figura 12.11 | Ciclo de 'leitura' de DRAM com um comprimento de rajada de 4

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).

Por que a latência do CAS é importante?


A tinta desta maneira. Um fator que ignoramos durante todas as nossas discussões sobre memória e processadores superiores
da família x86 é a diferença de velocidade entre a CPU e a memória.
Geralmente, a CPU funciona em altas velocidades, enquanto a memória é mais lenta. As SDRAMs típicas têm tempos de
acesso de 50 ns ou menos, mas as velocidades de clock da CPU tendem a ser mais altas.
Portanto, quando uma CPU emite um comando de leitura, pode ter que esperar para obter os dados. No caso normal, o
pino READY da CPU coordena isso, fazendo com que a CPU emita ciclos de espera dentro de seus ciclos de leitura (ou
gravação).
Ao usar SDRAM, existe uma maneira de usá-la de forma que a CPU não precise esperar – em vez disso, a SDRAM
emite comandos NOP em seu ciclo de leitura/gravação. Isso significa que a 'latência' da SDRAM pode ser conhecida e definida
no registro de modo (como um número de ciclos de clock) da SDRAM. Como o processador sabe quanto tempo irá decorrer
antes que os dados apareçam no barramento de dados, ele pode se voltar para outros trabalhos em vez de apenas esperar
ociosamente. Para obter mais detalhes sobre este e outros recursos de SDRAMs, consulte as folhas de dados de SDRAMs.

12.3.1 | DRAMS síncrono vs assíncrono


Vamos concluir dizendo que em termos de tecnologia básica e princípio de operação de uma célula de memória DRAM básica,
ambos os tipos são iguais, mas a SDRAM pontua mais alto apenas por causa da maneira como é usada. Como a DRAM
assíncrona não compartilha nenhum tipo de
Machine Translated by Google

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 443

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:

• Strobe de endereço de linha (RAS)


• Strobe de Endereço de Coluna (CAS)

• 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 | ROM (Memória Somente Leitura)


Este é um termo muito usado e sabemos que significa 'Read Only Memory'. Por ser 'fi rmware', uma ROM não
perde seu conteúdo quando a energia é desligada. ROM é um tipo de memória 'programável'. Possui fusíveis
internos que, quando queimados, criam um padrão de bits permanente e, portanto, podem ser lidos sempre que
necessário. No entanto, se for uma ROM OTP (programável uma vez), seu conteúdo nunca poderá ser alterado
novamente. Esta declaração implica que existem outros tipos de ROM em que os dados podem ser reescritos.
Isso é EPROM.
Machine Translated by Google

444 OS MICROPROCESSADORES x86

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.

12,5 | Memória cache


Cache é uma palavra que você pode ter ouvido em vários contextos, não necessariamente neste livro sozinho.
Agora que discutimos várias memórias de semicondutores e seus méritos e deméritos relativos, este é o
momento certo para introduzir o conceito de 'memória cache' ou 'cache' como é
Machine Translated by Google

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 445

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

Figura 12.12 | Cache na hierarquia de memória


Machine Translated by Google

446 OS MICROPROCESSADORES x86

Tabela 12.1 | Comparação entre SRAM e DRAM


Característica RAM Dinâmica (DRAM) RAM Estática (SRAM)

Circuito de armazenamento Capacitor Virar para cima

Velocidade de transferência Mais lento que o processador O mesmo que CPU

Latência Alto Baixo

Densidade Alto Baixo

Consumo de energia Baixo Alto


Custo Barato Caro

Tabela 12.2 | Comparação de velocidade entre diferentes componentes de memória

Velocidade do componente de memória (aproximadamente) *

Registros na CPU 5 ns

Cache 10 ns

Memória principal 100 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.

12.5.1 | Local de Referência


Agora que está claro o que pretendemos alcançar no projeto de um sistema de memória típico, o próximo passo é quantificar os
objetivos e encontrar maneiras de alcançá-los. O objetivo de um sistema de memória eficaz é que o tempo de acesso efetivo
que o processador vê seja muito próximo ao do componente de memória mais rápido do sistema, ou seja, o tempo de acesso do
cache. Todos os acessos que o processador faz à cache satisfazem este objetivo. No entanto, às vezes, os dados requeridos
pelo processador não estão disponíveis no cache e, então, o fator de velocidade é afetado. No entanto, isso deve ocorrer apenas
para uma porcentagem muito pequena de acessos. É assim que se pode almejar uma figura próxima do ideal. A consecução
desse objetivo depende de muitos fatores: a arquitetura do processador, as propriedades comportamentais dos programas que
estão sendo executados e o tamanho e organização do cache.

Os caches funcionam com base no princípio da 'localidade de referência' do comportamento do programa.


Isso significa que quando a CPU acessa um local de memória, todas as informações necessárias estarão em locais sequenciais
dentro e ao redor desse local. Isso é chamado de 'localidade espacial'. Há também algo chamado 'localidade temporal' – isso
implica que é altamente provável que a CPU acesse os mesmos locais repetidamente. O que tudo isso significa? Isso significa
simplesmente que existem alguns programas que são usados com muita frequência e, obviamente, as informações para esses
programas estarão em locais de memória contíguos. Toda a ideia de 'cache' é baseada nos princípios acima mencionados.
Portanto, é dever do 'sistema de gerenciamento de memória' usar esse princípio para garantir uma alta porcentagem de acertos
de cache.

12.5.2 | Organização de cache


Já está acordado que a memória cache é feita de SRAM. Com base nos requisitos de acessibilidade e desempenho, o tamanho
do cache de um sistema também deve ser decidido. Mais o
Machine Translated by Google

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 447

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.

12.6 | Técnicas de mapeamento


Existem três importantes técnicas de mapeamento de uso comum e veremos as características mais
importantes de cada uma delas.

12.6.1 | Mapeamento direto

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:

(Endereço do bloco de memória principal) MOD (Número de blocos em cache)


Então MMB-128 é mapeado para CB-0 como 128 mod (64) = 0
MMB-221 é mapeado para CB-29 como 221 mod (64) = 29

12.6.2 | Mapeamento Totalmente Associativo

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

448 OS MICROPROCESSADORES x86

CACHE MEMÓRIA PRINCIPAL

CB - 0 MMB - 0

CB - 1 MMB-1

CB - 2 MMB-2

CB - 3 MMB-3

CB - 63 MMB - 63

MMB - 64

MMB-511

Figura 12. 13 | Mapeamento direto

Memória principal

MMB-0
Memória cache
MMB-1
CB - 0
MMB-2
CB - 1

CB - 2

CB - 3

CB - m
MMB - n

Figura 12.14 | Mapeamento totalmente associativo

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

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 449

12.6.3 | Definir mapeamento associativo


Se um bloco na memória principal pode ser colocado em um conjunto restrito de posições na cache, diz-se que a cache é
definida como associativa. Um conjunto é um grupo de blocos no cache. Um bloco de memória principal é mapeado primeiro em
um conjunto e, em seguida, o bloco pode ser colocado em qualquer lugar desse conjunto.
A Figura 12.15 mostra a técnica de mapeamento de cache associativo de conjunto de 2 vias. Neste, o cache é dividido
em conjuntos. Para associatividade de 2 vias, cada conjunto possui dois blocos de cache . Considere o caso de 64 blocos de
cache e, portanto, 32 conjuntos no cache. Os conjuntos são numerados como Conjunto 0 a Conjunto 31.

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.

(Endereço do bloco) MOD (Número de conjuntos em cache)


MMB 32 é 25 mod (32) = 0. Pode ser mapeado para qualquer bloco de cache do Conjunto 0.
MMB 125 é 125 mod (32) = 29. Pode ser mapeado para qualquer bloco de cache do Conjunto 29.

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'

CACHE MEMÓRIA PRINCIPAL

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

Figura 12.15 | Mapeamento associativo de conjunto de duas vias


Machine Translated by Google

450 OS MICROPROCESSADORES x86

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.

Este bloco será copiado para o CB-15.

b) Totalmente associativo.

Este bloco MMB pode ser copiado para qualquer bloco de cache.

c) Associativo de conjuntos de quatro vias.

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.

(ii) MMB – 5029

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 bloco de cache.

iii) Associativo de conjuntos de quatro vias.

5029 contra (512) = 421.

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

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 451

À 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.

12.6.4 | Políticas de gravação de cache

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.

12.6.5 | Políticas de substituição de cache

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.

12,7 | Cache e a família x86


Atualmente, a palavra 'cache' é de uso comum no contexto de PCs. No entanto, nem sempre foi assim. Os primeiros PCs não
tinham cache. O primeiro cache foi usado para '386 PCs. Esse cache foi colocado na placa-mãe, mas o processador ('386)
oferecia suporte para sua operação, e havia um controlador de cache na placa. A quantidade de cache disponível variava
dependendo do modelo da placa-mãe e os valores típicos naquela época eram 64 KB e 128 KB.

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

452 OS MICROPROCESSADORES x86

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

Cache L1 D Núcleo da CPU

Figura 12.16 | Caches para um processador x86 atual


Machine Translated by Google

DISPOSITIVOS DE MEMÓRIA SEMICONDUTOR 453

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| A leitura e escrita em uma SRAM é feita de forma assíncrona.

| Uma célula DRAM típica para um bit requer apenas um transistor e um capacitor.

| Como a carga em um capacitor tende a vazar, as DRAMs precisam ser atualizadas.

| 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.

| A NVRAM é usada para armazenar as configurações e a hora do sistema em um PC.

| Um 'cache' é um tipo de SRAM colocado entre a memória principal e o processador.

| O cache é onde se espera que os dados de trabalho e o código sejam encontrados.

| 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.

| O mapeamento direto é o tipo de mapeamento mais simples e econômico.

| O mapeamento totalmente associativo é muito eficiente, mas complexo.

| A maioria dos sistemas usa mapeamento direto ou mapeamento associativo de 2 ou 4 vias.

| Os processadores x86 atuais possuem cache L1, L2 e até L3.

PERGUNTAS
1. Liste os pinos de um chip SRAM típico com suas funções.

2. De quantos dispositivos ativos uma SRAM de um bit precisa?

3. Defina 'tempo de ciclo de leitura' para uma SRAM.

4. Por que os endereços são divididos em linhas e colunas em um chip SRAM?

5. Por que as DRAMs exigem atualização?

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?

8. Compare DRAM FPM com DRAM EDO.

9. Qual é o dispositivo de memória atual usado como memória principal em PCs?

10. O que se entende por latência do CAS?

11. O que significa transferência de dados em 'modo de rajada'?

12. Qual é a tecnologia usada para cache?


Machine Translated by Google

454 OS MICROPROCESSADORES x86

13. O que se entende por 'técnicas de mapeamento' com referência a caches?

14. Quanto de cache um sistema deve ter?

15. Por que o mapeamento totalmente associativo não é comumente usado?

16. Qual é a penalidade por um erro de cache?

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.

5. O que significam as seguintes classificações de SDRAM? a)


PC66, b) PC100, c) PC133

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?

8. Encontre a quantidade de cache disponível no 80486 e P-4 e P-6.


Machine Translated by Google

multiprocessador
1 3 configurações

Neste capítulo, você aprenderá


| Os princípios e problemas do multiprocessamento. | O uso do árbitro de barramento 8289 para arbitragem
de barramento.
| Os diferentes tipos de sistemas de multiprocessamento.
| A relevância do formato IEEE 754 para
| A maneira como o 8086 lida com o multiprocessamento.
números.
| Como o 8086 opera em uma configuração de coprocessador.
| Conversão do formato de número IEEE 754
para números decimais e vice-versa.
| Como o 8086 funciona em conjunto com um processador
| A arquitetura da aritmética 8087
de E/S.
coprocessador.
| Os esquemas de arbitragem de barramento usados em sistemas
fracamente acoplados. | Para escrever programas usando instruções 8087.

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

Caso de abertura do capítulo: Um chip ADC.


Machine Translated by Google

456 OS MICROPROCESSADORES x86

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.

13.1 | Sistemas Multiprocessadores


Antes de entrar nos detalhes dos sistemas multiprocessadores baseados em 8086, vamos revisar vários tipos de
sistemas multiprocessadores em geral. Em termos gerais, elas podem ser classificadas como configurações de
multiprocessamento fortemente (intimamente) acopladas e fracamente acopladas.

13.1.1 | Sistemas fortemente acoplados


Sistemas de multiprocessamento fortemente acoplados são um grupo de processadores que são dependentes uns dos
outros (até certo ponto). O endereço, dados e linhas de controle dos processadores são conectados em paralelo e
chamados de barramento local. Eles compartilham os mesmos recursos como memória e E/S por meio de um barramento
de sistema compartilhado comum. Para tais sistemas, a comunicação entre processadores é fornecida por meio de
recursos compartilhados – um processador envia uma mensagem para a memória compartilhada que os outros
processadores podem usar, e também todos os processadores podem usar os serviços de E/S comum e assim por
diante. Em alguns casos em que os processadores são mais dependentes uns dos outros, existe também a possibilidade
de enviar mensagens de um processador para o outro através de pinos especiais do processador.

Processador 1 Processador 2 Processador 3

Ônibus local

Barramento do sistema

Ao controle

Barramento do sistema

Compartilhado Compartilhado

E/S Memória

Figura 13.1 | Sistema multiprocessador fortemente acoplado


Machine Translated by Google

CONFIGURAÇÕES DE MULTIPROCESSADOR 457

Em processamento

Módulo

Local

Memória Global
Ônibus
local
Ônibus Ônibus

Interface Processador Interface Memória

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

Figura 13.2 | Sistema multiprocessador fracamente acoplado

13.1.2 | Sistemas fracamente acoplados


As configurações fracamente acopladas são relativamente grandes. Eles podem ter uma série de sistemas
modulares independentes, cada um com fontes locais e existência independente, enquanto estão conectados a
módulos semelhantes ou diferentes através de um barramento global, através do qual a memória global e as E/
S podem ser acessadas. Cada um dos módulos pode ser sistemas multiprocessadores fortemente acoplados ou
apenas sistemas de um único processador, ou mesmo apenas um processador tendo acesso apenas a recursos
globais. Esses módulos podem ser instalados em um único gabinete ou podem estar distantes entre si. A Figura
13.2 mostra um sistema fracamente acoplado com três módulos de processamento. Os detalhes de um processamento
módulo foi elaborado.

13.2 | Multiprocessamento usando 8086


Na Seção 6.4, discutimos o modo máximo do processador 8086 que fornece capacidade de multiprocessamento
para o processador. Nesse modo, as funções de certos pinos são alteradas de modo a fornecer ao processador
a capacidade de lidar com os problemas básicos de multiprocessamento, um dos quais lida com problemas de
barramento. A questão pode ser elaborada e especificada como 'bus
arbitragem' e 'exclusão mútua'.
A arbitragem de barramento trata de encontrar uma solução para a prioridade na qual o processador ou
módulo de processamento deve ter acesso ao barramento, no caso de um conflito. Isso é resolvido pelos pinos
lógicos de solicitação/concessão ( RQ / GT ) do 8086. Esse pino pode ser suficiente em configurações fortemente
acopladas, mas em sistemas maiores, geralmente é necessário um IC árbitro de barramento. Para exclusão
mútua, o processador possui um pino LOCK , bem como uma instrução LOCK que impede que outros mestres
de barramento peguem o barramento do mestre atual.
Machine Translated by Google

458 OS MICROPROCESSADORES x86

Agora vamos discutir, em detalhes, o multiprocessamento baseado no processador 8086. A arquitetura da


família Intel 8086 permite a inclusão de processadores nas configurações de acoplamento rígido ou acoplamento
flexível. No entanto, a arquitetura direta suporta dois tipos de processadores – processadores independentes e
coprocessadores. A primeira classe tem 8086/8088 e 8089 (designado como processador de E/S) como seus
membros e esses processadores podem funcionar de forma bastante independente um do outro. Este último, ou
seja, o coprocessador é diferente no sentido de que suas instruções são escritas no fluxo de instruções escritas
para o 'host' ou processador mestre, geralmente um 8086. O coprocessador monitora esse fluxo de instruções,
reconhece certas instruções como suas próprias, as executa e retorna o resultado ao processador host ou o salva
em sua memória comum. O coprocessador, com efeito, estende o conjunto de instruções do processador host. O
coprocessador aritmético 8087 é aquele que foi especialmente projetado para fazer interface e interagir diretamente
com o 8086. Vamos primeiro discutir o 8086 e o 8087 em uma 'configuração de coprocessador'.

Leia atentamente o tópico 'modo máximo' (Seção 6.4) antes de tentar entender o seguinte.

13.2.1 | O 8086 em uma configuração de coprocessador


O chip 8087 também designado como 'coprocessador aritmético', 'processador de ponto flutuante' e 'processador
de dados numéricos' é especialmente projetado para operações aritméticas complicadas.
Isso significa que os cálculos aritméticos não podem ser feitos pelo 8086? Sabemos que pode, mas tem um
tamanho de dados limitado e instruções apenas para as operações aritméticas básicas. No entanto, alguns
aplicativos exigem funções matemáticas extremamente rápidas e complexas que não são fornecidas por um
processador de uso geral. Funções como raiz quadrada, exponenciação, seno, cosseno e logaritmos não estão
disponíveis diretamente em um processador de uso geral. As rotinas de software necessárias para implementar
essas funções tendem a ser lentas e pouco precisas. Tipos de dados inteiros e suas operações aritméticas (somar,
subtrair, multiplicar e dividir) que estão disponíveis diretamente em processadores de uso geral, ainda podem não
atender às necessidades de precisão, velocidade e facilidade de uso.
Fornecer matemática complexa rápida e precisa pode ser bastante complicado, exigindo grandes áreas de silício
em circuitos integrados. Tentar incorporar tudo isso em um processador de uso geral é um fardo, porque a maioria
dos aplicativos de uso geral não precisa de cálculos tão complexos. Para tais recursos, ter um processador de
dados numéricos especial é a melhor solução – fácil de usar e com alto nível de suporte em hardware e software.

O 8087 é um coprocessador de dados numéricos capaz de realizar funções matemáticas complexas


enquanto o processador host (a CPU principal) executa tarefas mais gerais. O fato de o 8087 ser um coprocessador,
significa que ele é capaz de operar em paralelo com a CPU host, o que melhora muito o poder de processamento
do sistema.
Agora que entendemos que esse coprocessador opera em paralelo com o processador principal ou host
(como o 8086 é chamado aqui), vejamos como os dois processadores interagem e se comunicam entre si.

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

CONFIGURAÇÕES DE MULTIPROCESSADOR 459

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

Figura 13.3 | Atividades sincronizadas do 8086 e do 8087


Machine Translated by Google

460 OS MICROPROCESSADORES x86

Tabela 13.1 | Decodificação do status da fila


QS1 QS0 Operação de fila
0 0 Nenhuma instrução da fila
0 1 Primeiro byte da fila
1 0 Liberar a fila, devido a uma instrução de desvio
1 1 Byte subsequente da fila

13.2.2 | Conexões entre os dois processadores


Você foi informado de que o coprocessador monitora as instruções que estão sendo buscadas pelo processador
host. Como faz isso? A busca de instruções é monitorada através do barramento de dados e das linhas de
status do ciclo do barramento 8086 S0–S2 , enquanto a execução das instruções é monitorada através das
linhas de status da fila QS0 e QS1. O 8087 rastreia a execução de instruções do 8086 mantendo uma fila de
instruções interna que é idêntica à fila de instruções do processador. Cada vez que o processador host executa
uma busca de instrução, o 8087 trava a instrução em sua própria fila em paralelo com o host. Cada vez que o
processador remove o primeiro byte de uma instrução da fila, o 8087 remove o byte no topo da fila do 8087 e
verifica se o byte possui um prefixo ESCAPE. Se tiver, o 8087 decodifica os seguintes bytes em paralelo com
o processador, para determinar qual instrução numérica os bytes representam. Se o primeiro byte da instrução
não for um prefixo ESCAPE, o 8087 o descarta junto com os bytes subseqüentes. A Tabela 13.1 nos diz o que
as linhas de status da fila indicam.

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.

O 'barramento local' na figura pertence ao endereço/dados multiplexados e pinos de controle do


processador. Os componentes da interface de barramento são as travas, os transceptores e o controlador de
barramento usados no sistema de modo máximo. Consulte as Figs 6.6 a 6.8 e Fig 6.25 para detalhes completos.
Como eles foram discutidos em detalhes anteriormente (Seção 6.1), aqui eles são agrupados em um bloco,
para tornar a figura simples e fácil de entender. O barramento do sistema consiste no barramento de endereços
de multiplexação e buffer A0–A19, o barramento de dados em buffer D0–D15 e o barramento de controle que
consiste nos sinais da saída do controlador de barramento IC, interrupção
Machine Translated by Google

CONFIGURAÇÕES DE MULTIPROCESSADOR 461

linhas, mantenha linhas e assim por diante. Discutiremos os recursos importantes do coprocessador 8087 na Seção 13.5.1.

13.2.3 | Co-processamento aritmético ao longo dos anos


O que discutimos até agora foi o caso do 8086 e seu coprocessador aritmético compatível. Ao longo dos anos, muitas
mudanças ocorreram. O 8086 não é mais um processador de alto perfil e muitas gerações de processadores mais
complexos e computacionalmente intensivos foram projetados pela Intel. Apesar de tudo isso, o processamento aritmético
ou operações complexas de ponto flutuante ainda são consideradas um trabalho especializado. Assim como o 8087 foi
feito para ser diretamente compatível com o 8086, os processadores superiores da Intel possuem coprocessadores
aritméticos compatíveis, conforme mostrado na Tabela 13.2. No entanto, a tendência atual é ter o coprocessador embutido
no chip do processador de uso geral.

INT DENTRO

PRONTO
8259
REDEFINIR
FOTO
CLK 8086

IRN
RQ1/GT1

QS0 TESTE QS1

Ônibus

Interface

Componentes
8284A Multi-mestre

Relógio QS0 QS1 OCUPADO Barramento do sistema

Gerador
RQ0/GT0

REDEFINIR REDEFINIR

8087
CLK CLK

PRONTO PRONTO

INT

Figura 13.4 | 8086 e 8087 em uma configuração de coprocessador

Tabela 13.2 | Processadores x86 e coprocessadores compatíveis


Processador de host Coprocessador compatível
8086/8088 8087

80186/80188 80187

80286 80287

80386 80387

80486 embutido

Pentium embutido
Machine Translated by Google

462 OS MICROPROCESSADORES x86

13.3 | O 8086 e o 8089 em uma configuração fortemente acoplada


O 8086 suporta diretamente o multiprocessamento também com processadores chamados 'processadores independentes'.
Um desses processadores é o processador de E/S 8089. É um processador especialmente projetado pela Intel para lidar
com processamento de entrada/saída incluindo DMA (Ref. Seção 11.5). Este processador é independente no sentido de
que não é direcionado ou dependente do processador host. Em uma configuração 'local', o endereço dos processadores,
as linhas de dados e de sinal de controle são vinculados. A única forma de comunicação entre os dois é por mensagens
armazenadas em seu espaço de memória compartilhada.
O processador host configura uma mensagem na memória e solicita ao IOP (processador de E/S) que lide com a tarefa de
E/S conforme indicado na mensagem. A mensagem é, na verdade, o programa que o IOP deve executar. Como o host
chama a atenção do IOP? Ele envia uma instrução OUT – o IOP é tratado como um dispositivo de E/S com um endereço
específico (conforme projetado por um circuito de decodificação de endereço). O pulso de seleção do decodificador de
endereço é enviado para o pino CA (Channel Attention) do IOP e, portanto, é despertado do sono. Em seguida, o IOP
assume a tarefa atribuída, completa-a e notifica esse fato ao host definindo um bit de status no espaço de memória
compartilhada ou gerando uma interrupção.

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

CONFIGURAÇÕES DE MULTIPROCESSADOR 463

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.

13.3.1 | Processador Intel I/O 8089


O processador de E/S Intel 8089 está contido em um pacote de circuito integrado de 40 pinos. Dentro do
8089 existem duas unidades independentes chamadas canais. Cada canal combina as características gerais
de uma unidade processadora com as de um controlador de acesso direto à memória (DMA). O 8089 foi
projetado para funcionar como um IOP em um sistema de microcomputador onde o microprocessador Intel
8086 é usado como CPU. A CPU 8086 inicia uma operação de E/S construindo uma mensagem na memória
que descreve a função a ser executada. O IOP 8089 lê a mensagem da memória, realiza a operação e
notifica a CPU quando ela termina.
Possui 50 instruções básicas que podem operar em bits individuais, em bytes ou em palavras de 16 bits.
O IOP pode executar programas de maneira semelhante a uma CPU, exceto que o conjunto de instruções é
escolhido especificamente para fornecer processamento eficiente de entrada-saída. O conjunto de instruções
inclui instruções gerais de transferência de dados, operações aritméticas e lógicas básicas, operações de
desvio condicionais e incondicionais e recursos de chamada e retorno de sub-rotinas. O conjunto também
inclui instruções especiais para iniciar transferências DMA e emitir um pedido de interrupção para a CPU. Ele
fornece transferência de dados eficiente entre quaisquer dois componentes conectados ao barramento do
sistema, como E/S para memória, memória para memória ou E/S para E/S. A declaração anterior faz com
que pareça ter capacidade de DMA. Ele tem capacidade de DMA, mas como também tem capacidade de
execução de instruções, às vezes é chamado de 'controlador de DMA inteligente'.
O esquema de comunicação entre os dois processadores consiste em seções de programa chamadas
'blocos', que são armazenadas na memória como mostrado na Figura 13.6. Cada bloco contém informações
de controle e parâmetros, bem como um ponteiro de endereço para seu bloco sucessor. O endereço do bloco
de controle é passado para cada canal IOP durante a inicialização. O sinalizador de ocupado indica se o IOP
está ocupado ou pronto para realizar uma nova operação de E/S. O CCW (palavra de comando do canal) é
especificado pela UCP para indicar o tipo de operação requerida do IOP. O CCW no 8089 não tem o mesmo
significado que a palavra de comando em um chip de interface. O CCW aqui é mais como uma instrução de
E/S que especifica uma operação para o IOP, como iniciar a operação, suspender a operação, retomar a
operação e interromper o programa de E/S. O bloco de parâmetros contém dados variáveis que o programa
IOP deve usar na execução de sua tarefa. O bloco de tarefas contém o programa real a ser executado no IOP.

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'

Bloco de controle Bloco de Parâmetros Bloco de Tarefas

CCW ocupado Endereço TB

Endereço PB Endereço de memória 8089


Contagem de bytes PIO

Endereço do dispositivo Programa

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

464 OS MICROPROCESSADORES x86

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.

13.4 | Configurações fracamente acopladas e arbitragem de ônibus


No caso dos dois tipos de sistemas fortemente acoplados que acabamos de discutir, fica claro que o barramento do
sistema é um recurso escasso que deve ser compartilhado e multiplexado no tempo, pois apenas um mestre pode
usá-lo a qualquer momento. No 8086, 8087 e 8089 foram disponibilizados pinos especiais para solicitação e concessão
do barramento. Agora, vamos examinar o caso de sistemas multiprocessadores fracamente acoplados (Fig 13.2).
Vemos que pode haver vários módulos de processamento em tal sistema.
Cada um desses módulos pode ter seus próprios recursos privados, mas isso não é obrigatório. Também pode haver
módulos cujos recursos sejam apenas os recursos globais (memória e E/S).
De qualquer forma, um ou mais dos módulos de processamento precisarão do barramento do sistema em algum
momento ou outro, e as chances de conflito são muito altas. Para resolver este problema, deve haver algum tipo de
esquema de arbitragem de barramento para qualquer sistema. Vamos descobrir quais esquemas estão disponíveis e
usados – os méritos e deméritos de cada um, como eles são implementados, tendências atuais e assim por diante.

13.4.1 | Esquemas de Arbitragem de Ônibus


Para qualquer sistema, o esquema de arbitragem projetado para ser usado deve equilibrar dois fatores.

i) Prioridade: O módulo de prioridade mais alta deve ser atendido primeiro.

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

CONFIGURAÇÕES DE MULTIPROCESSADOR 465

Mestre 1 Mestre 2 Mestre N

Ônibus Ônibus Ônibus

Árbitro Árbitro Árbitro

Concessão de ônibus
Central
Árbitro

Solicitação de ônibus

Ônibus ocupado

Figura 13.7a | Esquema Daisy Chaining de arbitragem de ônibus

Mestre 1 Mestre 2 Mestre N

Ônibus Ônibus Ônibus

Árbitro Árbitro Árbitro


REQ-1

GRANT-1

REQ-2

Central
GRANT-2
Árbitro

REQ-N

GRANT-N

Ônibus ocupado

Figura 13.7b | Esquema de arbitragem paralela de arbitragem de ônibus

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.

13.4.3 | Esquema de Arbitragem Paralela Este

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

466 OS MICROPROCESSADORES x86

Mestre 1 Mestre 2 Mestre N


Arbitragem
Número Ônibus Ônibus Ônibus

Árbitro Árbitro Árbitro

Central
Árbitro

Solicitação de ônibus

Ônibus ocupado

Figura 13.7c | Arbitragem distribuída por auto-seleção

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.

13.4.4 | Arbitragem Distribuída por Auto Seleção


Este é um tipo de esquema de votação. Consulte a Fig. 13.7c. Cada módulo tem um número de arbitragem com uma
prioridade associada. Quando vários módulos solicitam o barramento, aquele com o maior número de arbitragem
recebe o barramento. Quando surgirem conflitos de ônibus, serão resolvidos em favor do módulo com o maior número
de arbitragem. Junto com uma solicitação, um módulo também dará a conhecer seu número de arbitragem aos
demais. Cada dispositivo solicitante comparará esse número com seu próprio número e aquele com o número mais
alto vence. Este esquema deve permitir a realocação dinâmica de números de arbitragem para torná-lo um esquema
verdadeiramente justo.

13,5 | Arbitragem de barramento usando o IC de árbitro de barramento 8289

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

CONFIGURAÇÕES DE MULTIPROCESSADOR 467

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

Figura 13.8 | Diagrama de bloco interno do árbitro de barramento 8289

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.

13.5.1 | Usando o Bus Arbiter em um Sistema de Multiprocessamento


Para cada módulo de um sistema, haverá um chip árbitro de barramento através do qual este módulo pode acessar o 'bus do
sistema' (lembre-se que pode haver um barramento privado e recursos privados para cada módulo, mas não estamos falando
disso) .Quando o módulo em particular está usando o barramento do sistema, suas linhas de endereço, linhas de dados estão
ativas. Caso contrário, eles devem ser tri-estabelecidos. Isso deve ser assegurado pelo árbitro de ônibus.

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

468 OS MICROPROCESSADORES x86

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.

13.5.2 | Arbitragem de Barramento Entre Diferentes Módulos de Processamento Em geral,

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)

CLK AEN1 8289


Ônibus Multi-Mestre
Árbitro Barramento de Controle
M
ANYRQST
PRONTO DENTRO

CLK IOB VCC


eu
CLK
RESB
SO-S2 T
8086
AEN EU

CPU
S0

AD0–AD15 S1 M

A16–A19 S2 ESTADO (S0, S1, S2) AEN UMA

8288 S

ÔNIBUS T

Controlador Multi-Mestre E

ANYRQST Barramento de Comando do Sistema R

CLK
MAS IOB S

A DT/R S

VOCÊ ESTÁ G M

Endereço Multi-Mestre

Robusto Barramento de Endereço do Sistema B


74LS373 DENTRO

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

CONFIGURAÇÕES DE MULTIPROCESSADOR 469

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.

13.5.3 | Usando o Bus Arbiter em Vários Esquemas de Arbitragem


Como pode haver muitos mestres de barramento em um barramento de sistema multimestre, alguns meios de resolver a
prioridade entre mestres de barramento que solicitam o barramento simultaneamente devem ser fornecidos. Discutimos esses
métodos, em geral. Onde entra o árbitro de ônibus nessa imagem?
O 8289 Bus Arbiter suporta essas técnicas de resolução. Todas as técnicas são baseadas em um conceito de prioridade
que em um determinado momento um mestre de barramento terá prioridade sobre todos os demais.
Existem disposições para o uso de técnicas de resolução de prioridade paralela, técnicas de resolução de prioridade serial e
técnicas de prioridade rotativa.

13.5.4 | Implementação do Esquema de Arbitragem Paralela


A técnica de resolução de prioridade paralela usa uma linha de solicitação de barramento separada BREQ para cada árbitro
no barramento do sistema multimestre (consulte a Fig. 13.10). Cada linha BREQ entra em um codificador de prioridade que
gera o endereço binário da linha BREQ de maior prioridade que está ativa.
O endereço binário é decodificado por um decodificador para selecionar a linha BPRN (Bus Priority In) correspondente a ser
devolvida ao árbitro solicitante de prioridade mais alta. A prioridade de recebimento do árbitro (BPRN true) então permite que
seu mestre de barramento associado entre no barramento do sistema multimestre assim que ele estiver disponível (quando o
barramento não estiver mais ocupado). Quando um árbitro de barramento ganha prioridade sobre outro árbitro, ele não pode
capturar o barramento imediatamente, mas deve esperar até que a transação do barramento atual seja concluída. Ao concluir
sua transação, o mestre de barramento atual reconhece que não tem mais prioridade e entrega o barramento liberando BUSY.
BUSY é uma linha de sinal 'OU com fio' ativa baixa que vai para cada árbitro de barramento no barramento do sistema.
Quando BUSY fica inativo (alto), o árbitro que atualmente tem prioridade de barramento (BPRN true) então captura o
barramento e puxa BUSY para baixo para manter outros árbitros fora do barramento. Veja o diagrama de tempo de forma de
onda, na Fig 13.11.

Nota Todas as transações do barramento do sistema multimestre são sincronizadas com o clock do barramento BCLK .

13.5.5 | Esquema Daisy Chaining Usando 8289


A técnica de resolução de prioridade serial elimina a necessidade do arranjo codificador-decodificador de prioridade
encadeando os árbitros de barramento e conectando a saída BPRO (Bus Priority Out) do árbitro de barramento de maior
prioridade ao BPRN da próxima prioridade mais baixa (consulte a Fig 13.12 ). O número de árbitros que podem ser encadeados
no esquema de resolução de prioridade serial é uma função do BCLK e do atraso de propagação de árbitro para árbitro.
Normalmente, em 10MHz, apenas 3 árbitros podem ser encadeados.

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

470 OS MICROPROCESSADORES x86

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

Figura 13.10 | Implementando o esquema de arbitragem paralela usando um 8289

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

1. O árbitro de barramento de prioridade mais alta solicita o barramento do sistema Multi-Master.


2. Obtém prioridade.
3. O árbitro do barramento de menor prioridade libera BUSY.
4. O árbitro de barramento de prioridade mais alta então adquire o barramento e puxa BUSY para baixo.

13.5.6 | Para muitos


Você deve ter notado a palavra 'multibus' em alguns dos diagramas relacionados ao multiprocessamento.
Este é um barramento padrão definido pela Intel e é um barramento multimaster, o que significa que atende
a vários processadores ou possui capacidade de multiprocessamento. A arquitetura do sistema multibus foi
desenvolvida em 1975 pela Intel Corporation para tornar os microprocessadores mais fáceis de usar. O
multibus original continha três qualidades que o tornaram muito popular nos tempos antigos de desenvolvimento
de computadores. A primeira dessas qualidades é sua padronização. A especificação multibus (IEEE 796) é
precisa o suficiente para que placas multibus de diferentes fornecedores sejam totalmente compatíveis. A
segunda qualidade é o multiprocessamento — a capacidade de ter várias placas de CPU em um sistema.
Essa capacidade é a base para o processamento distribuído e permite que um projeto complexo seja construído a partir
Machine Translated by Google

CONFIGURAÇÕES DE MULTIPROCESSADOR 471

BPRN
Ônibus

Árbitro BPRO
1

BPRN
Ônibus

Árbitro
BPRO
2

BPRN

Ônibus

Árbitro BPRO
3

BPRN

Ônibus

Árbitro BPRO
4

CBRQ OCUPADO

Figura 13.12 | Esquema de encadeamento usando o 8289

módulos. A terceira qualidade é a generalidade multibus. Podia acomodar muitos microprocessadores


diferentes e tornou-se muito popular para vários usos industriais.
O Multibus especificou quatro barramentos, chamados de barramento de sistema multibus, barramento
de expansão de E/S (iSBX), barramento de execução (iLBX) e barramento de E/S multicanal. O barramento
do sistema multibus foi adotado como IEEE 796, e o barramento iSBX foi adotado como IEEE P959. Multibus
é popular em sistemas industriais e, embora seja um ônibus bastante antigo, ainda é de uso comum. No início
dos anos 80, a Intel criou o Multibus II, que mais tarde foi adotado como IEEE-STD 1296. A verdadeira força
do Multibus II parece ser seu potencial para o design sofisticado de multiprocessadores. Nenhum outro
barramento oferece tanta capacidade para operação síncrona fortemente acoplada de muitos processadores
e muitos dispositivos compartilhados.

13.6 | O Coprocessador Aritmético 8087


Um processador aritmético também é designado como processador de dados numéricos, processador ou
unidade de ponto flutuante, coprocessador matemático e assim por diante. Você viu como um coprocessador
aritmético é conectado a um 8086 em um sistema de multiprocessamento fortemente acoplado. Você também
sabe que para cada membro da família x86, a Intel desenvolveu um processador aritmético compatível
(consulte a Tabela 13.2). Ao longo de alguns anos, o processamento aritmético tornou-se muito rápido. Por
exemplo, a unidade aritmética no chip do Pentium é muitas vezes mais rápida que a do 80486.
Ao falar sobre esses coprocessadores, a notação correta é 80x87, que inclui toda a família de
processadores aritméticos da Intel. No entanto, para facilitar o entendimento, vamos discutir o coprocessador
básico – 8087, que é representativo de toda a família. Ele tem todas as instruções para a maioria dos cálculos
aritméticos complexos que normalmente são necessários. Para ter uma ideia de por que as unidades especiais
de processamento de ponto flutuante são necessárias, dê uma olhada na Tabela 13.3. Ele mostra a
comparação do tempo necessário usando um processador aritmético especializado e um 8086
Machine Translated by Google

472 OS MICROPROCESSADORES x86

Tabela 13.3 | Comparação da velocidade de execução entre emulação 8086 e 8086 – 8087
sistema de coprocessamento

Tempos de execução para instruções numéricas 8086/8087 selecionadas


e emulação 8086 correspondente
Instrução de ponto flutuante Tempo de execução aproximado (ms)
8086/8087 8086 Emulação
(Relógio 8 MHz)
Adicionar / Subtrair 10,6 1000

Multiplicar (precisão simples) 11,9 1000

Multiplicar (precisão estendida) 16,9 1312

Dividir 24,4 2000

Comparar 5.6 812

Carga (precisão dupla) 6.3 1062

Armazenar (precisão dupla) 13.1 750

Raiz quadrada 22,5 12250

Tangente 56,3 8125

Exponenciação 62,5 10687

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.

13.6.1 | Aritmética computacional


Existem várias maneiras de representar números reais em computadores. Na computação, uma representação
de número de ponto fixo é um tipo de dado real para um número que tem um número fixo de dígitos após o
ponto decimal (ou binário ou hexadecimal). Por exemplo, um ponto fixo com 4 dígitos após o ponto decimal
poderia ser usado para armazenar números como 1,3467, 281243,4356 e 0,1000, mas arredondaria 1,0301678
para 1,0302 e 0,0000678 para 0,0001. No entanto, muito poucas linguagens de computador incluem suporte
integrado para valores de ponto fixo, porque para a maioria das aplicações, as representações de ponto flutuante
são melhores, mais rápidas e mais precisas. As representações de ponto flutuante são mais fl exíveis do que as
representações de ponto fixo, porque podem lidar com uma faixa dinâmica mais ampla. As representações de
ponto flutuante também são um pouco mais fáceis de usar, porque não exigem que os programadores
especifiquem o número de dígitos após o ponto decimal.
Machine Translated by Google

CONFIGURAÇÕES DE MULTIPROCESSADOR 473

13.6.2 | Representação de Número de Ponto Flutuante


Os números de ponto flutuante são representados com três componentes – o sinal, o expoente polarizado e a
mantissa. Para elaborar, vamos considerar alguns exemplos.
Os números 6789 e 0,006789 também podem ser representados como:
6789 = 6,789 × 103 = 67,89 × 102 e assim por diante.
0,0006789 = 6,789 × 10ÿ4 = 67,89 × 10ÿ5 e assim por diante.

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.

13.6.3 | Precisão simples


32 bits são usados para esta representação, um bit para o sinal ('0' para mais e '1' para menos), 8 bits para o
expoente 'polarizado' e 23 bits para a parte fracionária da mantissa. Apenas os bits após a vírgula da mantissa
são especificados, pois devido à normalização, sabe-se que existe um '1' à esquerda da vírgula. Consulte a Figura
13.13.

32 bits

S E M

Bit de sinal
Enviesado
Mantissa de 23 bits
Exponencial (8 bits)

Figura 13.13 | Representação de precisão única

Tabela 13.4

Formatos Sinal Expoente 8 Fração Tendência

Precisão única 1 [31] [30–23] 23 [22–00] 127

Dupla precisão 1 [63] 11 [62–52] 52 [51–00] 1023


Machine Translated by Google

474 OS MICROPROCESSADORES x86

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.

0 00111100 111100------------------------------------------------- --0

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.

13.6.4 | Dupla precisão


Conforme mostrado na Figura 13.14, nesta, são usados 64 bits, um para o sinal, 11 bits para o expoente
polarizado e 52 bits para a parte fracionária da mantissa. A polarização para o expoente é 1023(3FFH).

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.

i) Converta o número decimal para a forma binária


ii) Realize a normalização no número.

iii) Calcule o expoente.


iv) Adicione a polarização ao expoente.
v) Coloque o sinal, o expoente polarizado e a parte fracionária da mantissa nas posições apropriadas. A
parte da mantissa também é chamada de 'significado'.

64 bits

SE M

Bit de sinal
Enviesado Mantissa de 52 bits

Exponencial (11 bits)

Figura 13.14 | Representação de precisão dupla


Machine Translated by Google

CONFIGURAÇÕES DE MULTIPROCESSADOR 475

Exemplo 13.1
Execute a conversão dos seguintes números decimais, conforme especificado.
i) 230,25 em real curto e

ii) -6765,1875 em reais longos


iii) 85,27 em reais curtos

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

Isso deve ser colocado em 32 bits, que é

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.

iii) O real curto corresponde ao formato de precisão simples.


Número: 85,27
Bit de sinal: 0
Representação binária: 1010101.01000101000111101
A representação binária de 0,27 não terminará e pode ser continuada. No entanto, devido à precisão limitada,
temos que limitá-la para caber no formato numérico fornecido.
Forma normalizada: 1.01010101000101000111101 × 26
Expoente tendencioso: 6 + 127 = 133 = 10000101
Machine Translated by Google

476 OS MICROPROCESSADORES x86

O formato de precisão única é:

0 1000 0101 0101 0101 0001 0100 0111 101

Isso deve ser colocado em 32 bits, que é:


0100 0010 1010 1010 1000 1010 0011 1101
4 2 AA 8 A 3D

ou seja, 42AA 8A3D

Agora, consideraremos o ato de converter do formato IEEE para um número decimal. Os passos são:

i) Separe o número em sinal, expoente polarizado e mantissa.


ii) Remova a polarização do expoente.
iii) Escreva o número no formato normalizado
iv) Converter para um formato binário desnormalizado.
v) Converta o acima para o formato decimal.

Exemplo 13.2
Converta o número real curto 42E64000H para um formato decimal.

Solução

Número em Hex: 43664000 H

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

v) Na forma não normalizada, é 11100110.01


vi) Converter para a forma decimal, ou seja, 230,25

Assim, a conversão feita neste exemplo verificou a conversão feita no Exemplo 13.1.

13.6.5 | Valores Especiais


O padrão IEEE especificou alguns valores especiais, que podem aparecer no decorrer dos cálculos e
precisam de atenção especial. Vamos tentar decifrar alguns dos termos relacionados.

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

CONFIGURAÇÕES DE MULTIPROCESSADOR 477

Tabela 13.5 | Operações Especiais Definidas pelo Formato IEEE

Operação n Resultado

÷ ± Infinito ± 0

Infinito × ± Infinito ± Infinito ±


± diferente de zero ÷ 0 Infinito

Infinito + Infinito Infinito


±0÷±0 NaN

Infinito ÿ Infinito ± NaN

Infinito ÷ ± Infinito ± NaN

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.

13.6.6 | Características do 8087

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

478 OS MICROPROCESSADORES x86

Tabela 13.6 | Representações numéricas usadas pelo 8087


Formatos de dados Precisão do intervalo Precisão Diretiva Número total de
bits

Palavra inteira 104 16 bits DW 16

Inteiro curto 109 32 bits DD 32

Inteiro longo 1018 64 bits DQ 64

BCD embalado 1018 18 dígitos TD 80

Curto real 10+/_38 24 bits DD/REAL4 32

Longo real 10+/_308 53 bits DQ/REAL8 64

Temporário real 10+/-4932 64 bits DT/REAL10 80

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.

13.6.7 | Registros de 8087


Começaremos com a estrutura de registradores do processador. A Figura 13.15 mostra os registradores de controle e
status, bem como o ponteiro de instrução e ponteiro de dados. O 8087 também possui um conjunto de oito registradores
de 80 bits, que funcionam como registradores de uso geral. Quaisquer dados que devem ser usados para computação
são convertidos para o formato real temporário e, em seguida, esses registros são usados no processo de computação. A
razão pela qual este é chamado de 'formato temporário' é que os resultados intermediários são representados neste
formato de 80 bits e apenas o resultado final será truncado ou arredondado, quando tiver que ser armazenado na memória.

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

CONFIGURAÇÕES DE MULTIPROCESSADOR 479

Campo de dados de 80 bits


Campo de etiqueta

79 78 64 63 0

Sinal Expoente Significante 1 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

Figura 13.15 | Estrutura de registro do 8087

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.

13.6.8 | Programando o 8087


13.6.8.1 | Modos de endereçamento
Os dados que são usados pelo coprocessador podem estar na memória ou em qualquer registrador do conjunto de registradores.
Os modos de endereçamento determinam que a origem e o destino podem ser ambos os registradores, ou um dos registradores.
Machine Translated by Google

CONFIGURAÇÕES DE MULTIPROCESSADOR 479

Campo de dados de 80 bits


Campo de etiqueta

79 78 64 63 0

Sinal Expoente Significante 1 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

Figura 13.15 | Estrutura de registro do 8087

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.

13.6.8 | Programando o 8087


13.6.8.1 | Modos de endereçamento
Os dados que são usados pelo coprocessador podem estar na memória ou em qualquer registrador do conjunto de registradores.
Os modos de endereçamento determinam que a origem e o destino podem ser ambos os registradores, ou um dos registradores.
Machine Translated by Google

480 OS MICROPROCESSADORES x86

(uma) (b)
ST (0) NUM 1 ST (0)

Conjunto de registradores vazio Depois de carregar NUM 1

(c) (d)
NUM 2 ST (0) NUM 3 ST (0)

NUM 1 ST (1) NUM 2 ST (1)

NUM 1 ST (2)

Depois de carregar NUM 2 Depois de carregar NUM 3

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

Figura 13.17 | Interpretações de palavras de tags

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.

13.6.8.2 | Formato de instrução


Todos os mnemônicos de instrução começam com a letra F. Portanto, FADD indica adição e FMUL representa
multiplicação e assim por diante.
Agora vamos ver alguns deles. Começaremos com as instruções de transferência de dados que
consistem apenas em instruções de 'carregar e armazenar'. Carregar corresponde a levar dados da memória para um
Machine Translated by Google

CONFIGURAÇÕES DE MULTIPROCESSADOR 481

registro. Como os dados podem estar na forma de inteiro, ponto flutuante ou BCD, a operação de carregamento
tem três variações:

i) fonte FLD ii)


fonte FILD iii) fonte
FBLD A primeira

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).

FLD NUM1 ;carrega em ST (0) os dados reais na posição de memória NUM1


FLD ST(2) ;carrega em ST(0) os dados em ST(2)
FILD NUM2 ;carrega em ST(0) os dados inteiros na posição de memória NUM2

Para armazenar, existem instruções semelhantes:

Destino FST ;armazenar em distinção


FIST destino ;armazena no destino após converter para inteiro
Destino FBST ;armazena no destino após converter para 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

482 OS MICROPROCESSADORES x86

Exemplo 13.3b

13BD:0017 9B ESPERAR

13BD:0018 DBE3 FIM


13BD:001A 9B ESPERAR

13BD:001B DB060000 CAMPO DWORD PTR [0000]


13BD:001F 9B ESPERAR

13BD:0020 DB060400 CAMPO DWORD PTR [0004]


13BD:0024 9B ESPERAR

13BD:0025 D8C1 FADD ST, ST(1)


13BD:0027 9B ESPERAR

13BD:0028 DB160800 PUNHO DWORD PTR [0008]


13BD:002C B44C MOV AH, 4C
-

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
-------------------------------------------------- --------------------------------------------

---------------------------

O Exemplo 13.3c mostra o conteúdo da memória após a adição.

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

CONFIGURAÇÕES DE MULTIPROCESSADOR 483

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

Microsoft (R) Macro Assembler Versão 6.14.8444

.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.

PONTOS-CHAVE DESTE CAPÍTULO

| Quando um sistema contém mais de um processador, ele é chamado de sistema multiprocessado.

| Tais sistemas são amplamente classificados como sistemas fortemente acoplados e fracamente acoplados.

| O 8086 tem vários recursos embutidos para suportar multiprocessamento.

| O processador deve estar no modo máximo, quando os recursos de multiprocessamento devem ser
ativado.
Machine Translated by Google

484 OS MICROPROCESSADORES x86

| Quando o 8086 é usado junto com o processador aritmético 8087, ele é chamado de coprocessador
configuração.

| O 8086 e o 8087 trabalham em estreita cooperação na configuração do coprocessador.

| 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.

| Para operações de ponto flutuante, o IEEE definiu um formato e padrões.

| 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

1. Distinguir entre sistemas multiprocessadores fracamente acoplados e fortemente acoplados.

2. Como é feita a comunicação entre os módulos de processamento de um sistema fortemente acoplado?

3. Nomeie os recursos que o 8086 possui para multiprocessamento.

4. Em uma configuração de coprocessador, o coprocessador depende do processador host. Elaborar.

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?

8. Por que o 8089 é designado como 'um controlador DMA inteligente'?

9. Por que é necessário ter um IC árbitro de barramento dedicado em um sistema de multiprocessamento fracamente acoplado?

10. O que significa o termo 'recursos globais'?

11. Qual é o esquema de arbitragem de ônibus mais eficiente que discutimos?

12. O que é 'Multibus' e quais são suas características?

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

1. Desenhe um sistema de multiprocessamento com um 8086, 8087 e 8089.

2. Expresse os seguintes números reais em formato de precisão simples e precisão dupla.


a) 3463,75
b) 89.125
c) 8945683.875
Machine Translated by Google

CONFIGURAÇÕES DE MULTIPROCESSADOR 485

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.

4. Leia a folha de dados do 8087 e liste as exceções produzidas pelo 8087.

5. Escreva programas usando o conjunto de instruções de 8087.


a) Encontrar a circunferência de um círculo de raio 45,26. b)
Encontre a área desse círculo. c) Use os dois programas acima
como procedimentos para encontrar a área de círculos de qualquer raio.

6. Escreva um programa para encontrar o seno, cosseno e tan do ângulo 450 .

7. Encontre a instrução de 8087 para geração de números aleatórios e use-a em um programa.


Machine Translated by Google
Machine Translated by Google

80186
– embutido
1 4 microprocessador

Neste capítulo, você aprenderá


| As características distintivas do processador 80186. | Como cada um desses blocos opera.
| As melhorias no conjunto de instruções deste | Os detalhes completos do funcionamento do bloco
processador em comparação com 8086. temporizador dentro do chip.
| Os detalhes dos blocos periféricos dentro do chip.

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.

Imagem de abertura do capítulo: Um chip microcontrolador.


Machine Translated by Google

488 OS MICROPROCESSADORES x86

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.

14.1 | Adições no conjunto de instruções


Discutiremos primeiro as novas instruções do processador 80186, em comparação com seu antecessor, o 8086.

• Instruções de transferência de dados

PUSH
PAPA

• Instruções de string

INS
SAÍDAS

• Instruções de alto nível

DIGITAR
SAIR
VINCULADO

Tabela 14.1 | Lista de versões 80186 e recursos correspondentes


Características 80C186 XL 80C186 EA 80C186 EB 80C186 EC

80286 como conjunto de instruções Sim Sim Sim Sim

Economia de energia Sim Sim – Sim

Modo de desligamento – Sim Sim Sim

interface 80187 Sim Sim Sim Sim

Modo UMA VEZ Sim Sim Sim Sim

Controlador de interrupção Sim Sim Sim Sim

Unidade do temporizador Sim Sim Sim Sim

Unidade de seleção de chips Sim Sim Sim Sim

Controlador DMA Sim Sim – Sim

Unidade de comunicação serial – – Sim Sim

Atualizar controlador Sim Sim Sim Sim


– – – Sim
Relógio do cão de guarda
– – Sim Sim
Portas de E/S
Machine Translated by Google

80186 – O MICROPROCESSADOR INCORPORADO 489

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.

14.1.2 | Instruções de string


14.1.2.1 | INS source_string, porta
INS (In string) executa a entrada do bloco de uma porta de E/S para a memória. O endereço da porta é
colocado no registrador DX. O endereço de memória é colocado no registrador DI. Esta instrução usa o
registrador de segmento ES, que não pode ser sobrescrito. Após a transferência dos dados, o registrador de
ponteiro (DI) aumenta ou diminui, dependendo do valor do Sinalizador de Direção (DF). Os registradores de
ponteiro mudam em um, para transferências de bytes e em dois, para transferências de palavras.

14.1.2.2 | Porta OUTS, destination_string OUTS


(Out string) executa a saída do bloco da memória para uma porta de E/S. O endereço da porta é
colocado no registrador DX. O endereço de memória é colocado no registrador SI. Esta instrução usa o
registrador de segmento DS, mas isso pode ser alterado com uma instrução de substituição de
segmento. Após a transferência dos dados, o registrador de ponteiro (SI) aumenta ou diminui,
dependendo do valor do Sinalizador de Direção (DF). O ponteiro registra as alterações de um para
transferências de bytes e de dois para transferências de palavras.

14.1.3 | ENTRA E SAI


Essas instruções são usadas com quadros de pilha no caso em que a pilha é usada para passar parâmetros
de e para procedimentos. Eles são úteis na programação em linguagem de alto nível. Ele cria o quadro de
pilha exigido pela maioria das linguagens de alto nível estruturadas em blocos.

A instrução ENTER é equivalente a


PRESSIONAR PA

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

490 OS MICROPROCESSADORES x86

14.1.4 | Registo LIMITADO, Endereço


BOUND verifica se o valor com sinal no registrador especificado está dentro dos limites especificados.
Se o valor não estiver dentro dos limites, ocorrerá uma exceção de limites de matriz (INT 5). BOUND é útil para
verificar os limites do array antes de tentar acessar um elemento do array. Isso evita que o programa sobrescreva
informações fora dos limites da matriz.
BOUND tem dois operandos. O primeiro, registrador, especifica o registrador que está sendo testado. O
segundo, endereço, contém o endereço relativo efetivo dos dois valores de limite assinados. O índice de matriz
no registro de origem é verificado em relação aos limites superior e inferior na origem da memória. A primeira
palavra localizada em 'endereço' é o limite inferior e a palavra em 'endereço +2' é o limite superior da matriz.
A interrupção 5 ocorre se o valor de origem for menor ou maior que o conteúdo do registro.
Considere a instrução BOUND BX, COST onde COST é um endereço. O conteúdo de BX não deve ser inferior
a COST ou superior a COST+2. Se esta condição for violada, ocorre uma interrupção Tipo 5.

14.2 | Aprimoramentos do conjunto de instruções


Como mencionado anteriormente, o 80186 adiciona novos tipos de operandos a três instruções 8086 existentes,
e isso pode ser considerado como 'aprimoramentos'.

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

iii) IMUL destino, fonte, dados

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

80186 – O MICROPROCESSADOR INCORPORADO 491

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

492 OS MICROPROCESSADORES x86

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.

14.3 | Diagrama de Blocos do 80186


A Figura 14.1 mostra o diagrama de blocos interno do 80186. Os pinos externos também
são vistos no diagrama. Como já discutimos os recursos do 8086, nosso foco aqui será dar
uma rápida olhada nos componentes dentro do 80186, que não estão presentes no 8086.
Discutiremos os periféricos deste processador, que não encontramos no 8086 .

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

Registros Registros Contagem de 16 bits

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

A MAS UCS PCS6/A2


LCS PCS5/A1
TRANCAR WR AD0-AD15 A16/S3– MCSO-3 PCSO-4
DT/R RD A19/S6

BHE/S7

Figura 14.1 | Diagrama de bloco interno do 80186


Machine Translated by Google

80186 – O MICROPROCESSADOR INCORPORADO 493

14.3.1 | Gerador de relógio


Lembre-se que para o 8086, um gerador de clock externo IC (8284) foi necessário. Para o 80186, o gerador de
clock está dentro e fornece o clock de ciclo de trabalho de 50% necessário para o processador. O pino CLKOUT
fornece o sinal de clock do processador para uso por outros chips, se necessário.
O chip pode operar em frequências de até 25 MHz, o que é bom o suficiente para muitas aplicações embarcadas.

14.3.2 | Redefinir lógica


Há um pino de entrada RES para reinicializar o processador e um pino de saída RESET sincronizado para uso
com outros chips do sistema.

14.3.3 | Bloco de controle periférico


Em arquiteturas de processadores embarcados em geral; existem registradores para controlar cada um dos
periféricos. Assim, cada periférico está associado a um conjunto de registradores e escrever padrões de bits
específicos nesses registradores equivale a fazer com que os periféricos ajam como escolhemos (de uma lista
de escolhas). Os mesmos recursos também são usados neste processador. Há um conjunto de 256 registradores
de dezesseis bits e esse conjunto é chamado de bloco de controle periférico (PCB). Muitos registros deste
bloco não são usados e são denominados como 'reservados'. O endereço base deste bloco de controle é
decidido por um registrador de realocação de 16 bits contido dentro do bloco de controle em off set FEH do
endereço base. Na reinicialização, o registro de realocação é definido como 20FFH. Isso localiza o PCB nos
endereços de E/S FF00H a FFFFH em diante. O PCB pode ser realocado usando o registrador de realocação.
Na Fig 14.2, é mostrado o off set de cada registrador periférico do endereço base da PCB.

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

Registros de controle do temporizador 0 50H

3EH
Registros do Controlador de Interrupção
20H

Figura 14.2 | Bloco de controle periférico de 80186


Machine Translated by Google

494 OS MICROPROCESSADORES x86

15 0

ET RMX X MINHA Endereço de realocação (A19–A8)

ET = ESC/NO ESC ARMADILHA M/IO = Espaço de memória/IO


RMX=modo iRM x86/modo mestre X=Não usado

Figura 14.3 | Registro de controle periférico

14.3.4 | Lógica de Seleção de Chip

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.

14.3.5 | Unidade do temporizador

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.

14.3.6 | Controlador de interrupção No 8086,

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

80186 – O MICROPROCESSADOR INCORPORADO 495

DMA DMA
Hora 0 Hora 1 Hora 2 0 1 INT0 INT1 INT2 INT3

Interromper

Prioridade
Resolver

Para solicitação de interrupção da CPU

Figura 14.4 | Interromper a unidade de controle no modo mestre

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.

14,4 | Programando a Unidade do Temporizador


Vamos tentar entender a unidade do temporizador em termos muito simples – o que é, o que pode fazer e como pode
desempenhar as funções que lhe são atribuídas.
A unidade de temporizador consiste em três temporizadores independentes de 16 bits 0, 1 e 2 e operam
independentemente da CPU. Funcionalmente os temporizadores 0 e 1 são idênticos. O temporizador 2 é usado como fonte
de solicitação de DMA, como pré-escalador para outros temporizadores ou como temporizador de vigilância.

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

496 OS MICROPROCESSADORES x86

'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

Temporizador 2 Trava de saída


T1
Fora
Registros

CPU Interromper
Robusto
Relógio

Figura 14.5 | Temporizador/contador – diagrama de blocos interno


Machine Translated by Google

80186 – O MICROPROCESSADOR INCORPORADO 497

Maxcount A Maxcount B
Máximo duplo
Modo de contagem

Uma CPU
Maxcount A
Relógio
Máximo único
Modo de contagem

Figura 14.6 | Modo de contagem máxima dupla

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:

i) Registro de Controle Temporizado – TCON

ii) Compare o registro A


Machine Translated by Google

498 OS MICROPROCESSADORES x86

(EB e EC) (XL e EA)

46H ou 66H Controle T2

44H ou 64H Reservado

42H ou 62H T2 Comparar A


40H ou 60H Contagem de T2

3EH ou 5EH Controle T1

3CH ou 5CH T1 Comparar B

3AH ou 5AH T1 Comparar A


Contagem T1
38H ou 58H
Controle T0
36H ou 56H

34H ou 54H T0 Comparar B

T0 Comparar A
32H ou 52H
Contagem T0
30H ou 50H

Figura 14.7 | Offsets e conteúdo dos registros do temporizador

IN INH INT RIU RRRRRR MC RTG P EXT ALT CONT

Figura 14.8 | Bits de registro do registrador TCON 1 e 2

IN INH INT RRRRRRR MC RRRR CONT

Figura 14.9 | Configurações de bits do TCON2

iii) Registo de comparação B

iv) Registo de contagem O

temporizador 2 tem apenas três registos. Não possui o registrador de comparação B.

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

80186 – O MICROPROCESSADOR INCORPORADO 499

Tabela 14. 2 | Designações de bits dos registradores TCON

Pedaço Nome do Bit Função

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

EN. O bit INH não é armazenado; ele sempre lê como zero.

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.

R Reservado Para uso em processadores futuros - deve ser limpo agora.

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

a contagem. Este bit é ignorado com clock externo (EXT = 1).

P Pré-escalador Defina para incrementar o cronômetro quando o cronômetro 2 atingir sua


contagem máxima. Desmarque para incrementar o temporizador em ¼ CLKOUT.

Este bit é ignorado com clock externo (EXT = 1).

EXT Relógio externo Configure para usar o relógio externo; claro para usar o relógio interno. Os bits

RTG e P são ignorados com clock externo (conjunto EXT).

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.

14.5.1 | Geração de onda quadrada assimétrica


Ondas quadradas de vários ciclos de trabalho são frequentemente necessárias. O Exemplo 14.2 mostra o uso do Timer 1 na geração de
uma onda quadrada de 80% do ciclo de trabalho. O método utilizado é o seguinte.
O registro de comparação A armazena a contagem para o tempo alto e o registro de comparação B armazena a contagem para o tempo
baixo. O registro de contagem do Timer1 é inicializado em 0. O registro de controle é configurado para que uma onda quadrada contínua
seja gerada (os pinos ALT e CONT são 11).
Assumindo que a frequência de clock é de 8 MHz, o HIGH_TIME é calculado como (required pulse_width*f )/4. Precisamos de uma largura
de pulso alta de 0,8 ms. Então HIGH_TIME = 1600. Para uma largura de pulso baixa de 0,2 ms, LOW_TIME = 400. Estes são carregados
nos registradores de comparação de contagem máxima A e B.
Machine Translated by Google

500 OS MICROPROCESSADORES x86

Em seguida, o registrador de contagem T1COUNT é zerado e a palavra de controle é carregada em


TCON1 para iniciar o temporizador. A palavra de controle é 1100 0000 0000 0011, ou seja, os bits EN e
INH são 11 e os bits ALT e CONT são 11. Assim, é C003H e foi rotulado como CONWRD. Isso deve ser
carregado no TCON1 rotulado aqui como T1CONTRL. Como os bits ALT e CONT são 11, isso gerará um
sinal contínuo com a duração e ciclo de trabalho especificados.

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.

TICMPA EQU 0FF5AH


T1CMPB EQU 0FF5CH
T1COUNT EQU 0FF58H
CONTROLE T1 EQU 0FF5EH
COND EQU 0C003H ;Os bits ALT e CONT são 11
HIGH_TIME EQU 1600
LOW_TIME EQU 400

MOV DX, T1CMPA


MOV AX, HIGH_TIME ;defina hora alta
SAÍDA DX, AX

MOV DX, T1CMPB


MOV DX, LOW_TIME ;definir tempo baixo
SAÍDA DX, AX

MOV DX, TICOUNT


MOV AX, 0 ;limpar registro de contagem
SAÍDA DX, AX

MOV DX, TICNTRL


MOVE EIXO, CONWRD ;inicia o temporizador 1
SAÍDA DX, AX

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.

T0COUNT EQU 0FF50H ;substituir offsets de registradores


T0CMPA EQU 0FF52H
Machine Translated by Google

80186 – O MICROPROCESSADOR INCORPORADO 501

T0CMPB EQU 0FF54H


T0CONTRL EQU 0FF56H
MCBIT EQU 0020H
COND EQU 0C002H ;bits ALT e CONT são 10

MOV DX, T0CMPA


MOV AX, 20.000 ;especifique um atraso de 10 ms
SAÍDA DX, AX

MOV DX, T0CMPB


MOV AX, 200 ;largura do pulso = 100 microssegundos
SAÍDA DX, AX

MOV DX, T0COUNT ;limpar registro do contador


MOV AX, 0
SAÍDA DX, AX

MOV DX, T0CONTRL


MOVE EIXO, CONWRD ;palavra de controle para um pulso
SAÍDA DX, AX

RESETMC: EM AX, DX ;leia em TOCONTRL


EIXO DE TESTE, MCBIT ;teste se MCBIT está configurado
JZ RESETMC ;se não, espere
E AX, NÃO MCBIT ;limpar MCBIT
SAÍDA DX, AX ;atualizar TOCONTRL

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

502 OS MICROPROCESSADORES x86

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.

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| O diagrama de blocos mostra todos os periféricos dentro do processador.

| 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

1. Para quais aplicações o processador 80186 é usado?

2. O que motivou a Intel a desenvolver um processador com periféricos embutidos?

3. Como as operações PUSH e POP foram aprimoradas em comparação com as do 8086?


4. O que fazem as instruções INS e OUTS?

5. Como o bloco de controle periférico pode ser realocado?

6. Quais são os recursos fornecidos pela lógica de seleção de chip?

7. Quais são as interrupções suportadas pela lógica de controle de interrupção interna?

8. Como um atraso pode ser criado usando os temporizadores internos do processador?

9. De que forma o Timer 2 é diferente dos outros dois timers?

10. Qual é o significado do bit MC do registrador TCON?

EXERCÍCIO

1. Descubra o domínio do aplicativo do 80186.

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.

4. Escreva programas para obter um pulso de duração de 500 ÿs e 120 ÿs.

5. Escreva um programa para gerar uma forma de onda assimétrica de a)


ciclo de trabalho de 20% do Temporizador 0.
b) Ciclo de trabalho de 40% do Temporizador 1.
Machine Translated by Google

o80286e
1 5 80386 processadores

Neste capítulo, você aprenderá


| O impacto que o 80286 causou no reino dos PCs. | O mecanismo de tradução de endereços no modo
protegido.
| As principais mudanças que a arquitetura 80386 | A importância e implementação do pro
ofereceu. mecanismos de proteção no 80386.

| Os aprimoramentos de programação do 80386. | As questões e métodos de comutação de tarefas.


| As características do PVAM e o conceito de memória | O uso da tabela de descritores de interrupção e
virtual. exceções de 80386.

15.1 | O processador 80286


Você sabe que o primeiro processador Intel usado em um computador pessoal pela IBM foi o 8088. O PC baseado
no 8088 e fabricado pela IBM passou a ser conhecido como IBM PC. Ele tinha apenas uma unidade de disquete
internamente, mas poderia ter um disco rígido externo. Todos os PCs com hardware e padrões semelhantes
passaram a ser chamados de clones do IBM PC. Mais tarde, a Intel lançou o PC-XT (tecnologia estendida) que
incluía um disco rígido padrão internamente.
O próximo processador importante da Intel foi o 80186. No entanto, vimos na seção anterior que o 80186
nunca foi usado como processador em um PC, mas sim encontrou aplicações no campo de sistemas embarcados.

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.

As principais melhorias podem ser listadas como:

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).

Imagem de abertura do capítulo: A PGA.


Machine Translated by Google

504 OS MICROPROCESSADORES x86

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

OS PROCESSADORES 80286 E 80386 505

15.2.1 | 80386 Melhorias


O 80386 possui todos os recursos do 80286 – instruções adicionais, modo de endereçamento virtual protegido – e muito mais. Ele tem
mais instruções, maior capacidade de endereçamento de memória, o dobro da largura do barramento de dados e do barramento de
endereço e também inclui o uso de memória como 'páginas' além da segmentação. Vamos listar os novos recursos.

• O barramento de dados externo agora tem 32 bits de largura.

• Os registradores e, portanto, a largura do barramento de dados interno é de 32 bits.

• 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.

• Um novo modo de endereçamento chamado modo de endereçamento escalonado está disponível.

• Um conjunto de instruções de manipulação de bits está disponível.

• 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.

15.3 | Arquitetura Interna


15.3.1 | Registros
Vamos primeiro ver os registradores de trabalho do processador – aqueles usados para computação, cálculo de endereço e similares
(veja a Fig. 15.1). O processador tem 16 registradores, que consistem em registradores de rascunho (uso geral), registradores de
segmento, um registrador de bandeira e o ponteiro de instrução. Comparando-o com 8086, mostra que os registradores de 16 bits AX
to DX foram re-designados como EAX to EDX, tornando-os registradores de 32 bits. Esses registradores podem ser usados como 8
bits ou 16 bits também, mas apenas as partes inferiores dos registradores podem ser usadas, ou seja, o registrador EAX pode ser
usado como EAX (32 bits), AX (16 bits), AH (8 bits) e AL (8 bits). Semelhante é o caso dos registradores EBX, ECX e EDX.

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.

15.3.1.1 | Registros de segmento


Os registradores de segmento são de 16 bits, mas veremos mais tarde que eles têm o que é chamado de 'parte oculta' que os tornará
totalmente de 48 bits (isso se torna efetivo apenas no modo protegido). A parte visível dos registradores de segmento ainda é de 16
bits e você pode ver que existem dois novos registradores de segmento FS e GS. Eles são usados para armazenar os endereços base
dos segmentos GS e FS, que são os próprios segmentos de dados.

15.3.1.2 | Registros de Controle e Status


O registrador de bandeira, ou seja, agora EFLAG, contém os valores das bandeiras de status (isto é, C e Z), as bandeiras de controle
(isto é, DF, IF e TF) mais novos bits de bandeira que atendem aos recursos adicionais de o processador. O registrador de bandeira
tem todos os bits de bandeira que o 8086 possui – os bits adicionais são para uso no modo protegido. A Fig 15.2 mostra os bits do
registrador flag.
Machine Translated by Google

506 OS MICROPROCESSADORES x86

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)

Registros de Status e Instrução

15 7 0
31 23

BANDEIRAS

EIP (Ponteiro de Instrução)

Figura 15.1 | Registros gerais e registros de endereço usados no modo real

15,4 | Aprimoramentos de programação


O processador possui uma série de novas instruções e algumas melhorias em relação às
instruções disponíveis para seu predecessor. Tem todas as instruções que o 8086, '186 e '286
tem, além de mais algumas. Aqui veremos as novas instruções que podem ser usadas no modo real.
i) O '386 tem uma melhoria interessante em relação ao que até agora definimos como 'registros
de ponteiro' que carregam endereços. Aqui todos os registradores de uso geral também
podem conter endereços que podem ser usados no modo de endereçamento indireto,
relativo e baseado em registradores. Por exemplo, as instruções a seguir são permitidas.
MOV EAX, [EBX],
MOV CX, PALAVRA PTR [EAX]
MOV AL, BYTE PTR [ECX]
Machine Translated by Google

OS PROCESSADORES 80286 E 80386 507

Registro de sinalizadores de 16 bits

31 23 15 7 0

000000000000000 RV N I ODITSZAPC
0 0 0 1

RFT PL FFFFFF F F F

Modo Virtual 8086E


Retomar Sinalizador

Sinalizador de tarefa aninhada

Nível de privilégio de E/S


Transbordar

Sinalizador de direção

Ativar interrupção
Sinalizador de armadilha

Sinalizar bandeira

Sinalizador zero

Transporte Auxiliar

Sinalizador de paridade

Carregar bandeira

Figura 15.2 | Registro de bandeira do 80386

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

508 OS MICROPROCESSADORES x86

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

DATS DD 00123456H, 00EF3456H, 07860EACFH,


0A45674FH, 08976ABCH

STRT: MOV EAX, 0 ;EAX = 0


MOV EBX, 0 ;EBX = 0
MOV ECX, 00000005 ;ECX = 5, a contagem
AGN: ADICIONAR EAX, [DATS + EBX*4] ;adiciona ao EAX o conteúdo da memória
INC EBX ;incrementa o ponteiro
LOOP AGN ;repete até ECX = 0
FIM INICIAR

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.

15.4.1 | Novas Instruções de 80386


Instruções de Teste e Modificação de Bits Este grupo de instruções opera em um único bit que pode
estar na memória ou em um registrador geral. A localização do bit é especificada como um deslocamento
da extremidade de ordem inferior do operando. O valor do offset pode ser dado por um byte imediato na
instrução ou pode estar contido em um registrador geral. Essas instruções primeiro atribuem o valor do
bit selecionado a CF, a bandeira de transporte. Em seguida, um novo valor é atribuído ao bit selecionado,
conforme determinado pela operação. OF, SF, ZF, AF, PF são deixados em um estado indefinido. A
Tabela 15.1 define essas instruções.
Machine Translated by Google

OS PROCESSADORES 80286 E 80386 509

Tabela 15.1 | Instruções de teste e modificação de bits


Instrução mnemônica Levar a bandeira depois Efeito sobre o selecionado
execução pouco após a execução

PEDAÇO Teste de bits CF = bit Nenhum

BTS Teste de bits e ajuste CF = bit BIT = 1

BTR Teste de bits e reset CF = bit BIT = 0

BTC Teste de bits CF = bit BIT = não BIT


e complemento

Exemplo 15.3
.386
.MODELO FLAT, STDCALL
.CÓDIGO
DATS DW 0560H

STRT: AÍ, DATAS ;deixe ESI apontar para os dados


MOV AX, [ESI] ;AX = 0560H
BTC AX, 1 ;AX = 0562H, CF = 0
BTR AX, 1 ;AX = 0560H, CF = 1
BTS AX, 0EH ;AX = 4560H, CF = 0
FIM INICIAR

O efeito de cada uma das operações é mostrado no campo de comentários.

15.4.2 | Instruções de digitalização de bits

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

STRT: AÍ, DATAS ;deixe ESI apontar para os dados


Machine Translated by Google

510 OS MICROPROCESSADORES x86

MOV AX, [ESI] ;AX = 0560H


BSR BX, AX ;BX = 000AH significando que D10 = 1
BSF CX, AX ;CX = 0005 significando que D5 = 1
FIM INICIAR

15.4.3 | Instruções MOVSX e MOVZX


Duas outras instruções novas e úteis são as instruções MOVSX e MOVZX. No MOVSX, o bit de sinal de
um registrador (ou memória) pode ser estendido para qualquer registrador. MOVZX zero estende o
conteúdo de um registrador ou local de memória. A instrução MOVSX é usada para aritmética com sinal
e MOVZX para aritmética sem sinal.

Exemplo 15.5
.386
.MODELO FLAT, STDCALL
.CÓDIGO
DAT1 DW ÿ269
DAT2 DB 56
DAT3 DB - 123

STRT: MOV AX, DAT1 ;AX = FEF3H


MOVSX ECX, AX ;ECX = FFFFFEF3H
MOVSX EBX, DAT2 ;EBX = 00000038H
MOVZX ECX, DAT1 ;ECX = 0000FEF3H
MOVSX AX, DAT3 ;AX = FF85H
FIM INICIAR

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.

15,5 | Recursos de hardware do 80386


O 80386 tem 132 pinos e é embalado como uma matriz de grau de pinos (PGA). A Fig 15.3 mostra o
processador com o agrupamento funcional de pinos. Os números dos pinos não são mencionados –
apenas o pino funcionalmente é discutido. Apenas novos pinos que não estão presentes no 8086 serão discutidos.
Os pinos que não são discutidos podem ser considerados como tendo a mesma funcionalidade que eles
têm no 8086.

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

OS PROCESSADORES 80286 E 80386 511

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

Controle de barramento BS16


8 W/R

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

Figura 15.3 | Diagrama de pinos funcional do 80386

Figura 15.4 | Uma matriz de grau de pinos (PGA)


Machine Translated by Google

512 OS MICROPROCESSADORES x86

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).

BE3 BE2 BE1 BE0

Banco 3 Banco 2 Banco 1 Banco 0

1G × 8 1G × 8 1G × 8 1G × 8

D31 D24 D23 D16 D15 D8 D7 D0

16 bits 16 bits
32 bits

Figura 15.5 | Bancos de memória para o 80386


Machine Translated by Google

OS PROCESSADORES 80286 E 80386 513

Controle de Ciclo de Barramento Neste conjunto, apenas o sinal D/ C é novo.

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.

ERRO: Este é um sinal do coprocessador de que um erro foi detectado.

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.

15.5.1 | Operação em modo real do 80386


O 80386 pode operar tanto no modo real quanto no modo protegido. (Há também um terceiro modo chamado modo 8086
virtual.) Na inicialização, o processador está no modo real. No modo real, ele atua como um processador 8086 mais rápido.
O aumento de velocidade é devido ao aumento da velocidade do clock e aos aprimoramentos de hardware. O '386 leva
apenas dois ciclos para executar uma leitura/gravação (com zero estados de espera), enquanto o 8086 requer quatro ciclos.
Além de ser mais rápido, o '386 no modo real também pode usar as instruções aprimoradas que o processador fornece. Ele
pode usar os registradores e o barramento de dados de 32 bits e, portanto, a largura de banda é o dobro do 8086.

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

514 OS MICROPROCESSADORES x86

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.

15,6 | Memória virtual


A memória virtual é um conceito pelo qual o processador (na verdade, o usuário) é levado a acreditar que tem muito
mais memória do que está fisicamente disponível. Com efeito, existe essa ideia de um 'espaço de endereço
ampliado' que é chamado de 'espaço de endereço virtual'. Este é um mapa de espaço em um espaço de endereço
físico, em última análise. Quando um usuário escreve um programa, ele usa 'endereços virtuais' ou 'endereços lógicos'.
A ideia é que um aplicativo não consiga ver onde os dados estão localizados fisicamente. Cabe ao mecanismo de
tradução de endereços mapear esses endereços virtuais para um endereço físico. Este é um conceito de sistema
operacional que mantém o usuário livre da preocupação de esgotar a memória disponível, quando escreve uma
aplicação.
Lembre-se de que sempre que executamos programas baseados em DOS, usamos memória física, que é
RAM/ROM. Observamos que para o 8086, com 20 linhas de endereço, o espaço de memória disponível é de 220
bytes, ou seja, 1 MB. Da mesma forma, para o 80286, com 24 linhas de endereço, a memória física que ele pode
endereçar é 224 = 16 MB. Para o 80386, naturalmente, o espaço de endereço físico é de 232 ou seja, 4 GB.
Considere usar o 80386 para um aplicativo – isso significa que podemos ter que limitar nossos dados e código
para caber em 4 GB? Sabemos que nos computadores que usamos agora, nunca experimentamos um 'esmagamento
de memória' ou a sensação de que nosso aplicativo não pode ser executado porque a capacidade de memória é
insuficiente, embora possa ter havido momentos em que sentimos que nosso aplicativo corre muito devagar. Tudo
isso nos leva ao conceito do que se chama de 'memória virtual'.
Em um sistema de computador há uma hierarquia de memória, e uma hierarquia de dois níveis é mostrada em
Figura. 15.6. Vamos discutir o conceito de memória virtual usando apenas uma hierarquia de dois níveis,
A memória semicondutora, que é razoavelmente rápida (RAM/ROM), é o que costumamos designar como
'memória primária', 'memória principal' ou 'memória física'. Tenha em mente que frequentemente usaremos esses
termos de forma intercambiável e todos os três se referem à memória endereçável pelas linhas de endereço do
processador. Em seguida, designamos o disco rígido (e outros tipos de memória) como 'memória secundária'. O
processador se comunica diretamente apenas com a memória principal, mas a movimentação de dados entre a
memória secundária e a principal é possível. Sempre que um aplicativo deve ser executado, o processador espera
encontrar os dados e códigos associados na memória principal.

Principal Secundário
CPU
Memória Memória

Figura 15.6 | Hierarquia de memória em um sistema de computador


Machine Translated by Google

OS PROCESSADORES 80286 E 80386 515

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.

15.6.1 | Modo de endereçamento virtual protegido (PVAM)


Agora, vamos passar pelos recursos do processador 80386 que tornou tudo isso possível.
Esteja avisado que entender esses recursos não é muito fácil e não pode ser feito em uma leitura. A leitura
repetitiva e a contemplação dos meandros dos mecanismos envolvidos é a única maneira de obter uma
compreensão clara desse processador. Como os mesmos recursos também estão presentes no 80486 e no
Pentium, é importante ter uma boa visão de tudo isso, neste ponto em si. Também é importante ter em mente
que o '386 é uma versão atualizada do 8086 básico – como tal, ele terá todos os recursos do 8086 mais
recursos adicionais. Os recursos 'adicionais' no modo protegido são o que discutiremos agora.

Seguem os tópicos que abordaremos:


e) Gerenciamento de memória
ii) Proteção

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.

15,7 | Unidade de gerenciamento de memória


O 80386 transforma endereços lógicos (ou seja, endereços vistos pelos programadores) em endereços físicos
(ou seja, endereços reais na memória física) em duas etapas:
i) Tradução de segmentos, na qual um endereço lógico (consistindo em um seletor de segmento e um
segmento off-set) é convertido em um endereço linear. Aqui, a memória é considerada dividida em
segmentos que são grandes unidades de armazenamento.
ii) Tradução de página, na qual um endereço linear é convertido em endereço físico. Este passo é opcional e
pode ser usado a critério dos projetistas de software de sistemas. Nesta etapa, a memória é dividida em
áreas de armazenamento menores, cada uma das quais é designada como uma página.

Seletor

Segmentação Endereço linear paginação Endereço físico


Desvio Mecanismo Mecanismo

Figura 15.7 | Tradução de endereços usando paginação e segmentação


Machine Translated by Google

516 OS MICROPROCESSADORES x86

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

onde EAX é um registrador de 32 bits e COST é um off set de 32 bits em um segmento.


Isso implica que o segmento tem um endereço base de 32 bits, porque todos os endereços têm 32 bits. No
entanto, para acessar o local chamado COST, temos que obter o endereço base do segmento em que ele está
contido. COST é o deslocamento dos dados do endereço base. O cálculo do endereço físico envolve apenas
adicionar o off set ao endereço base. No modo real (como no 8086), esse cálculo de endereço é muito direto
(Fig. 15.8), mas não no modo protegido.
A razão para os níveis adicionais de cálculo no modo protegido é a necessidade de incorporar conceitos de
memória virtual no gerenciamento de memória e garantir recursos de proteção. Nosso problema agora é obter
um endereço físico quando o programa fornece um endereço virtual, que é o endereço lógico em um sistema de
memória virtual. Na instrução citada como exemplo, o rótulo COST é o endereço lógico do operando a ser
acessado. COST será um endereço de 32 bits – um número (digamos, 0987 7654H).

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

Figura 15.8 | Cálculo de endereço no modo de endereço real


Machine Translated by Google

OS PROCESSADORES 80286 E 80386 517

UMA
Limite
Base (B31–B24) GD 0 DENTRO
6
(L19–L16)
eu

Byte de acesso Base (B23–B16) 4

Base (B15–B0) 2

Limite (L15-L0) 0

15 0

Figura 15.9 | Descritor de um segmento de dados/código de um programa aplicativo

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

518 OS MICROPROCESSADORES x86

P DPL S E XR/WA

7 0

Figura 15.10 | Conteúdo do byte de acesso em um descritor

Tabela 15.2 | A Designação dos Bits do Campo 'Tipo' do Byte de Acesso

Pouco não. Se bit 3, E = 1 significa Se bit 3, E = 0 significa não


executável (segmento de código) executável (segmento de dados)
2 C, Em conformidade, C = 1 ED Expanda para baixo. ED = 1, segmento de pilha
Não conforme, C=0 Expandir ED = 0, segmento de dados
1 R, legível W, gravável
R = 1, pode ser lido W = 1, gravável
R = 0, não pode ser lido W = 0, não pode ser escrito para

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.

15.7.2 | Descritores do Sistema


Os segmentos usados pelo sistema operacional são separados e um pouco diferentes dos segmentos do programa aplicativo.
Eles têm um descritor que é um pouco diferente. A Fig. 15.11 mostra o formato geral de um descritor usado para usos do
sistema operacional. Se a Figura 15.11 for comparada com a Figura 15.9, o que se notará é que apenas os bits do byte de
acesso e os quatro bits do byte 6 são diferentes. A diferença no byte de acesso é que 4 bytes são usados para especificar o
tipo do segmento que está sendo descrito. Existem 16 tipos possíveis, dos quais alguns fazem referência ao 80286, alguns
referem-se a usos futuros, e apenas alguns indicam os tipos de segmentos de sistema do 80386. Não vale a pena entrar nos
detalhes desses tipos, pois isso só levará à confusão desta discussão com detalhes desnecessários.

15.7.3 | Tabelas de Descritores


Assim, vemos que cada segmento tem um descritor. No entanto, quem cria descritores?
Definitivamente, não o programador de aplicativos. Quando o programador cria um segmento, o software do sistema cria o
descritor correspondente com a ajuda de compiladores e carregadores e linkers – na verdade; é um trabalho do sistema
operacional.
Machine Translated by Google

OS PROCESSADORES 80286 E 80386 519

Limite
Base (B31–B24) G00 0 6
(L19–L16)

P DPL 0 MODELO Base (B23–B16) 4

Base (B15–B0) 2

Limite (L15-L0) 0

15 0

Figura 15.11 | Descritor para um segmento do sistema

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.

15.7.3.1 | Tabela de Descritor Local (LDT)


Suponha que o sistema tenha 10 tarefas de aplicação cujos segmentos e descritores correspondentes tenham
sido criados. Para cada uma dessas tarefas, haverá uma tabela de descritores designada como o LDT da tarefa
específica. Assim, podemos nomear essas tabelas como o LDT da tarefa 1, tarefa 2 e assim por diante.
Haverá tantos LDTs quantas tarefas de aplicativo.

15.7.3.2 | Tabela de Descritor Global (GDT)


Existem segmentos e descritores correspondentes, que não pertencem a nenhuma aplicação específica, mas
atendem ao sistema como um todo – são de natureza global. Esses descritores são armazenados no GDT.
Haverá apenas um GDT em um sistema.
Para executar uma tarefa de aplicativo específica, digamos, a tarefa A, são necessários segmentos do LDT
da tarefa A e alguns serviços do sistema operacional também são necessários. A Figura 15.12 mostra como uma
tarefa de aplicativo precisa do GDT, bem como de seu próprio LDT.
A próxima pergunta é – onde essas tabelas são armazenadas? A resposta é – na memória principal,
naturalmente. Lembre-se também de que uma tabela de descritores é um array de memória de entradas de 8
bytes e que o tamanho de uma tabela é variável. Assim, essas tabelas também são 'segmentos' e cada uma
delas também deve ter um descritor. Isso pode soar um pouco confuso no começo, mas no futuro, essa confusão
logo será superada.
Isso nos leva à discussão dos registradores do processador que são usados no modo protegido. Em um
determinado momento, o descritor do GDT estará disponível em um registrador de processador chamado
'Registro de Tabela de Descritor Global (GDTR)'. Isso deve ser assegurado quando o sistema é comutado para o
modo protegido. Como os descritores são entidades de 8 bytes, esses registradores devem ter 8 bytes de
comprimento, obviamente. De fato, o carregamento do GDTR com o descritor do GDT ocorre quando o sistema
é colocado no modo protegido.
Machine Translated by Google

520 OS MICROPROCESSADORES x86

LDT GDT

D–1 D–1

Base D–0 Base D–0

70 0 7

Figura 15.12 | LDT de uma tarefa e o GDT do sistema

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

OS PROCESSADORES 80286 E 80386 521

15 210

Índice SEU RPL

Figura 15.13 | Formato de um seletor

Segmento
Registros Parte oculta de 8 bytes (descritor)

15 0 Endereço básico Limite Atributos

CS Seletor

Seletor SS

DS Seletor

Seletor PT

Seletor FS

Seletor GS

Descritor de 8 bytes carregado

Endereço básico Limite Atributos

Seletor TR
LDTR
Seletor

GDTR

IDTR

31 Registro de Controle 0
CR0 RSU
CR1

CR2

CR3

Figura 15.14 | Registros de tradução de endereços

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

522 OS MICROPROCESSADORES x86

D-8191

Registro de Tabela de Descritor Global (GDTR)

Limite Base Atributo


D-2

D-1

D-0

Figura 15.15 | GDT e GDTR

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).

15,8 | Convertendo um endereço lógico em um endereço físico


Agora considere uma instrução para um programa aplicativo, que é
MOVE EAX, CUSTO

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

OS PROCESSADORES 80286 E 80386 523

Endereço lógico no programa


15 0 31 0

Seletor Desvio
Endereçado
Dados
+
Segmento
Visível Registro
15 0 Parte oculta

Índice DS Limite Base de 32 bits Atributo

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

Figura 15.16 | Tradução de endereço de um endereço lógico para um endereço físico

15,9 | Calculando o tamanho do espaço de endereço lógico


Em um modelo segmentado de memória, o espaço de endereçamento visto por um programa aplicativo
(chamado de espaço de endereçamento lógico) é um espaço muito maior de até 246 (64 terabytes). Como
esse número é obtido? Façamos um cálculo.
Um seletor possui 13 bits como índice para selecionar um dos descritores de uma tabela de descritores.
Assim, ele pode acessar até 213 descritores com apenas uma tabela de descritores. Como duas tabelas de
descritores (a GDT e uma LDT) estão ativas ao mesmo tempo, 2 × 213 segmentos podem ser acessados.
Cada descritor corresponde a um segmento com tamanho máximo de 4 GB ou 232 bytes. O espaço total de
memória disponível agora é calculado em 2 × 213 × 232 bytes = 246 ou 64 terabytes
Machine Translated by Google

524 OS MICROPROCESSADORES x86

(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.

15.9.2 | Tradução da página


O 80386 tem a segmentação como conceito básico em sua unidade de gerenciamento de memória. O endereço lógico
de um programa é convertido em um 'endereço linear' pela unidade de segmentação e fornecido à unidade de paginação.
Este endereço linear deve ser traduzido para um endereço físico, e isso envolve dois níveis de tradução. Um endereço
linear pode se referir diretamente a um endereço físico para que o segmento e o deslocamento possam ser localizados
diretamente, como é feito na Seção 15.8. Este é o caso quando apenas a segmentação é usada. Se a paginação também
estiver ativada, um endereço linear especifica indiretamente um endereço físico (consulte a Figura 15.7) especificando
uma tabela de páginas, uma página nessa tabela e um off set nessa página. Um endereço linear de 32 bits, como
mostrado na Fig 15 17, é composto pelos seguintes campos:

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

Figura 15.17 | Formato do endereço linear de 32 bits


Machine Translated by Google

OS PROCESSADORES 80286 E 80386 525

31 22 12 0 Quadro de página

VOCÊS
Página Desvio

Memória

Diretório de páginas Tabela de páginas

Entrada PG TBL

Entrada DIR

CR3

Figura 15. 18 | Tradução de endereços de dois níveis para paginação

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).

15.9.3 | Formato de uma entrada de tabela de páginas

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

526 OS MICROPROCESSADORES x86

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

Figura 15.19 | Entrada da tabela de páginas

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.

R/W Read/Write usado para proteção.

U/S User/Supervisor-usado no esquema de proteção.

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.

15.9.4 | Tradução Lookaside Buff é


É complicado e demorado calcular o endereço físico a partir do endereço linear para cada acesso à memória. Um buffer
look-aside de tradução (TLB) simplifica o processo. Um TLB é uma tabela no processador que armazena os endereços
físicos das 32 entradas da tabela de páginas acessadas recentemente. O TLB é um 'cache de hardware' para os
endereços físicos do endereço virtual usado mais recentemente. É um cache associativo de quatro vias dentro do chip
'386.
A unidade de paginação recebe um endereço linear de 32 bits da unidade de segmentação. Os 20 bits superiores
do endereço linear são comparados com todas as 32 entradas do TLB para verificar se ele corresponde a alguma das
entradas. Se corresponder, o endereço físico de 32 bits é calculado a partir da entrada TLB correspondente e colocado
no barramento de endereços. Veja a Fig. 15.20. Se não corresponder, o processador deve buscar no TLB, a entrada da
tabela de páginas da memória.

15.9.5 | Combinando paginação e segmentação


Como o 80386 possui segmentação e paginação, é fácil visualizar um sistema no qual um segmento pode ser
composto por várias páginas. Para acessar um dado em uma página, o que é necessário é ter uma técnica pela qual o
endereço lógico correspondente à segmentação localize um segmento, e então este endereço lógico seja convertido
em um endereço linear. Este endereço linear é convertido em um endereço físico como acabamos de ver. Isso é
mostrado na Fig. 15.21.
Machine Translated by Google

OS PROCESSADORES 80286 E 80386 527

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

Figura 15.20 | Buffer lookaside de tradução dentro do chip 80386

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

Entrada TBL de página


Entrada DIR

CR3

Figura 15.21 | Segmentação e paginação combinadas


Machine Translated by Google

528 OS MICROPROCESSADORES x86

15.9.6 | Modelo Plano


Em um sistema baseado em '386, não é obrigatório usar paginação e segmentação juntas. Existe a opção de desligar
o mecanismo de paginação que deixa uma arquitetura segmentada. No entanto, um mecanismo para desativar a
segmentação não está inerentemente presente. No entanto, isso pode ser alcançado por técnicas de programação.

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.

15.10.1 | Verificações de proteção


Os aspectos importantes de proteção no 80386 são os seguintes:

• Verificação de tipo.

• Verificação de limites.
• Restrição no domínio acessível.
Machine Translated by Google

OS PROCESSADORES 80286 E 80386 529

• Restrição nos pontos de entrada de procedimentos.


• Restrição nas instruções de uso.

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).

O papel dos descritores


Os parâmetros de proteção são colocados no descritor pelo software do sistema no momento em que um descritor é criado.
Quando um seletor de segmento é carregado em um registrador de segmento, o descritor do segmento é carregado
automaticamente na parte oculta do registrador de segmento – assim, todos os parâmetros de proteção estão disponíveis no
registrador de segmento dentro do processador e, portanto, verificações de proteção subsequentes no registrador de
segmento. mesmo segmento não consomem ciclos de clock adicionais. A primeira verificação que precisa ser feita é no bit P
do descritor. Se P = 0, significa que o referido segmento não está presente na memória principal e é gerada uma exceção,
que inicia um ISR para trazer o segmento correspondente para a memória principal.

15.10.2 | Verificação de tipo


Existe um campo de tipo para um descritor dentro do byte de acesso (bits 1, 2 e 3). Consulte a Fig. 15.10.
Este campo tem duas funções.

i) Distingue entre diferentes formatos de descritores.

ii) Especifica o uso pretendido de um segmento.

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.

i) O registrador CS pode ser carregado apenas com um seletor de um segmento executável.

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

i) nenhuma instrução pode escrever em um segmento executável,

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.

15.10.3 | Verificação de limite


Existe um campo limite no descritor e o limite de um segmento depende do valor do bit G. Antes de permitir um acesso à
memória, este campo é usado para confi rmar que o acesso à memória
Machine Translated by Google

530 OS MICROPROCESSADORES x86

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.

15.10.4 | Níveis de privilégio


O conceito de níveis de privilégio tem tudo a ver com confiança e proteção.

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.

15.10.4.1 | Níveis de privilégio de 80386


O processador '386 define 4 níveis de privilégio numerados de 0 a 3 – quanto menor o número, maior o nível de privilégio. A
Fig 15.22 mostra a hierarquia de privilégios de 4 níveis. Observe que o kernel do SO recebeu o nível mais alto de 0, enquanto
as tarefas do aplicativo estão no nível 3. Os serviços no nível do SO estão no nível de privilégio 1, e os utilitários e serviços
personalizados de menor importância estão no nível 2. Figura, três tarefas de aplicação A, B e C foram mostradas. Não é
obrigatório que um sistema baseado em 80386 use todos os 4 níveis de privilégio. O software do sistema pode reduzi-lo para
3 ou 2 conforme necessário.
Três tipos diferentes de níveis de privilégio entram nas verificações de nível de privilégio.

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

OS PROCESSADORES 80286 E 80386 531

Tarefa B

Formulários

Serviços personalizados

Serviços do sistema

Núcleo

Nível 0 Nível 1 Nível 2 Nível 3

Tarefa C Tarefa A

Figura 15.22 | Hierarquia de nível de privilégio de 80386

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.

15.10.5 | Acessando segmentos de dados


Suponha que uma tarefa precise obter dados de um segmento de dados. As verificações de nível de
privilégio são realizadas no momento em que um seletor para o descritor do segmento alvo é carregado no
registrador de segmento de dados. (Lembre-se de que os privilégios mais altos são representados por
números menores e vice-versa.) Como mostra a Figura 15.23, três níveis de privilégios diferentes entram
nesse tipo de mecanismo de verificação de privilégios.
1. A CPL.

2. O RPL do seletor usado para especificar o segmento de destino.


3. O DPL do descritor do segmento alvo.
Machine Translated by Google

532 OS MICROPROCESSADORES x86

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 é.

15.10.6 | Verificações de privilégios para transferências de controle

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'.

Antes de prosseguir, é necessário esclarecer os segmentos de código 'conformes' e 'não conformes'.


Machine Translated by Google

OS PROCESSADORES 80286 E 80386 533

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.

Existem três tipos de portas para isso:

• Portão de tarefas

• Portão de interrupção

• Portão de chamada

Nesta seção, apenas o portão de chamada será descrito.


Para permitir que um programa salte para um nível mais privilegiado, ele deve passar por Call gates, que basicamente
definem os pontos de entrada para o código privilegiado. As verificações de segurança correspondentes serão realizadas nesses
pontos de entrada para decidir se o código invocado tem direitos suficientes. Essas verificações de segurança são aplicadas pelos
sistemas operacionais.

15.10.7 | Portões de chamada

Um portão de chamada é uma entidade de 8 bytes que contém as seguintes informações:

• Seletor de segmento do segmento de código a ser acessado.

• Ponto de entrada para um procedimento no segmento de código especificado (off set no segmento).

• Nível de privilégio necessário para um chamador tentando acessar o procedimento (DPL).

• Contagem de parâmetros – se ocorrer uma troca de pilha, especifica o número de parâmetros opcionais a serem copiados entre
as pilhas.

Política de controle de acesso para portões de chamada

• Em geral, CPL ÿ DPL da porta de chamada (numericamente).

• 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

534 OS MICROPROCESSADORES x86

15 0

Deslocamento (O31–O16) 6

Contagem de palavras
P DPL 0 Tipo 0 00 4
(C4–C0)

Seletor 2

Deslocamento (O15–O0) 0

Figura 15.24 | Estrutura de um portão de chamada

é 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.

Como usar portões 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

OS PROCESSADORES 80286 E 80386 535

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.

15.11.1 | Problemas em sistemas multitarefa


Uma questão principal na alternância de tarefas é que, antes de abandonar uma tarefa temporariamente, seu 'contexto'
deve ser salvo para retomar a execução no ponto em que parou . O contexto consiste no

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).

• Os registradores de segmento (ES, CS, SS, DS, FS e GS).

• O registo de bandeiras (EFLAGS).

• O ponteiro de instrução (EIP).

• O seletor do TSS da tarefa executada anteriormente (atualizado somente quando um retorno é


esperado).

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).

• Ponteiros para as pilhas de níveis de privilégio 0-2.

• 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.

• A base do mapa de E/S.

A Figura 15.25 mostra a estrutura de um TSS típico.


Machine Translated by Google

536 OS MICROPROCESSADORES x86

31 23 15 7

Base do Mapa de E/S 0000000 000000 T 64

00000000 00000000 LDT 60

00000000 00000000 GS 5C
00000000 00000000 FS 58
00000000 00000000 DS 54
00000000 00000000 SS 50
00000000 00000000 CS 4C

00000000 00000000 ISSO É 48

FOI 44
Contexto de
COMO AS 40
Tarefa atual
EBP 3C

ESP 38

EBX 34

EDX 30

ECX 2C

EAX 28

Bandeiras E
24

Ponteiro de Instrução (EIP) 20


CR3 PDBR 1C

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

Figura 15.25 | Estrutura de um TSS típico

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

OS PROCESSADORES 80286 E 80386 537

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.

15.11.3 | Troca de tarefas


Como a alternância de tarefas pode ser feita?

• A tarefa atual executa um JMP ou CALL que se refere a um descritor TSS.

• A tarefa atual executa um JMP ou CALL que se refere a um portão de tarefa.

• Um vetor de interrupção ou exceção para um portão de tarefa na Tabela do descritor de interrupção.

• A tarefa atual executa um IRET quando o sinalizador NT é definido.


Vamos discutir os quatro casos acima com mais detalhes.

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.

Quais são as ações que seguem uma alternância de tarefas?

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

538 OS MICROPROCESSADORES x86

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.

15.11.4 | Vinculação de tarefas

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.

15.12 | Interrupções de 80386


As interrupções de 80386 funcionam exatamente da mesma forma que as de 8086 e a categorização também é semelhante, ou seja,
as interrupções de hardware são NMI e INTR e as interrupções de software podem ser utilizadas no formato INT n. Existem interrupções
geradas devido a erros e são chamadas de exceções. A resposta de interrupção também é semelhante, ou seja, o vetor de interrupção
está em uma tabela. Na reinicialização, esta tabela está no local 0 e tem um tamanho máximo de 1 K.

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

OS PROCESSADORES 80286 E 80386 539

IDT
Segmento executável

Desvio
Ponto de entrada

LDT ou GDT

Interromper Portão de armadilha ou portão de

EU IRIA
interrupção

Descritor de segmento

Base

Figura 15.26 | Interromper vetorização

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.

15.13 | Instruções Privilegiadas


As instruções que afetam as estruturas de dados do sistema só podem ser executadas no modo protegido e também deve-
se garantir que elas sejam usadas apenas no nível de privilégio mais alto, ou seja, quando CPL for zero. Estas instruções
incluem:

CLTS — Limpar sinalizador comutado de tarefa


HLT — Parar Processador

LGDT — Carregar Registro GDT


LITTLE — Carregar Registro IDT
LLDT — Carregar Registro LDT
Machine Translated by Google

540 OS MICROPROCESSADORES x86

Tabela 15.3 | Lista de 80386 interrupções


Identificar é Descrição

0 Erro de divisão

1 Exceções de depuração
2 Interrupções não mascaráveis

3 Ponto de interrupção (instrução INT 3 de um byte)


4 Estouro (instrução INTO)

5 Verificação de limites (instrução BOUND)

6 Código de operação inválido

7 Coprocessador não disponível

8 Falha dupla

9 (Reservado)

10 TSS inválido

11 Segmento não presente


12 Exceção de pilha

13 Proteção geral

14 Falha de página

15 (Reservado)

16 Erro do coprocessador

17-31 (Reservado)

32-255 Disponível para interrupções externas via pino INTR

LMSW — Palavra de Status da Máquina de Carregamento

LTR — Registro de Tarefa de Carregamento

MOV de/para CRn – Mover para o Registro de Controle n


MOV para/de DRn – Mover para Debug Register n
MOV para/de TRn – Mover para o Registro de Teste n

De fato, todas as instruções que envolvem carregamento/armazenamento de registradores de modo protegido são privilegiadas
instruções.

15.13.1 | Mudando para o modo protegido


Foi mencionado que quando o processador é ligado, ele está no modo real. Como é comutado para o modo protegido?

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

OS PROCESSADORES 80286 E 80386 541

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.13.2 | Modo Virtual 8086


Sabemos que embora o modo protegido seja importante, rodar programas em MS-DOS tem seus
encantos e para facilitar o uso de ambos os modos, o '386 possui um modo virtual que permite
alternar entre os modos real e protegido. Assim, um sistema multitarefa pode ter usuários executando
programas no modo protegido, bem como usuários executando programas 8086 em modo real.
Fatias de tempo são alocadas para todos esses programas e, portanto, há alternância contínua
entre o modo real e o modo protegido. O modo virtual 8086 divide o computador em vários espaços
de endereço e mantém registros virtuais para cada máquina virtual. Este modo é inserido
configurando o bit VM (Virtual Machine) no registrador EFlags.
O desejo de permitir a execução de aplicativos MS-DOS sob o controle de um ambiente de
modo protegido (como o Windows) levou à inclusão do modo virtual em todos os processadores de
32 bits da Intel. Quando o processador está rodando no modo máquina virtual, ele se comporta como
se fosse um 8086 equipado com proteção, multitarefa e suporte a paginação.
Observe que o modo virtual 8086 não tem nada a ver com 'memória virtual', mas está associado
ao termo 'máquina virtual' que pode ser explicado da seguinte maneira. 'Uma máquina virtual é um
tipo de aplicativo de computador usado para criar um ambiente virtual, conhecido como virtualização.
A principal vantagem das máquinas virtuais do sistema é que vários ambientes de SO podem
coexistir no mesmo computador, em forte isolamento uns dos outros'.

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.

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| Este processador pode endereçar 4 GB de memória física.

| Ele possui várias novas instruções e também aprimoramentos em algumas instruções existentes.

| Os registradores de uso geral do 80386 têm 32 bits de comprimento.


Machine Translated by Google

542 OS MICROPROCESSADORES x86

| Tem um número de pinos adicionais em comparação com seus antecessores.

| 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.

| A unidade de gerenciamento de memória do 80386 tem capacidade de paginação e segmentação.

| Descritores são entidades de 8 bytes nas quais são armazenadas as informações correspondentes a um segmento.

| Os seletores têm 16 bits e apontam para o descritor ao qual estão associados.

| 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?

2. Qual foi a principal reclamação contra o 80286?

3. Cite a principal mudança que fez do 80386 um grande salto na tecnologia do processador.

4. Qual é o modo de endereçamento 'indexado em escala'?

5. Onde as instruções MOVSX e MOVZX podem ser usadas?

6. Por que o '386 tem linhas de endereço apenas de A2 a A31?

7. O 80386 possui um processador de ponto flutuante embutido?

8. Qual é a importância do conceito de memória virtual para um usuário?

9. Por que a tradução de endereços no PVAM é tão complexa?

10. O que um descritor significa para um segmento?

11. Qual é o papel de um seletor na tradução de endereços?

12. Quantos LDTs e GDTs tem um sistema?

13. Por que dizemos que um segmento com CPL = 0 é um segmento altamente confiável?

14. Qual é o papel do RPL em permitir o acesso a um segmento?

15. Distinguir entre um segmento conforme e um não conforme.

16. Em que condições é utilizado um portão de chamada?

17. Qual é a principal questão a ser cuidada na troca de tarefas?

18. O que contém o registro de tarefas?

19. O que significa o termo 'link de retorno ao TSS anterior?

20. O que é um IDT? Quantos IDTs um sistema pode ter?


Machine Translated by Google

OS PROCESSADORES 80286 E 80386 543

EXERCÍCIO

1. Escreva um programa que use as instruções MOVSX e MOVZX para


a) adicione um número negativo de 8 bits a um número negativo de dezesseis bits, b)
adicione um número negativo de 32 bits a um número positivo de 16 bits.

2. Escreva um programa para testar os bits 4, 8, 9 de um número de 16 bits na memória.

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.

4. Encontre a diferença entre os processadores 80386DX e 80386SX.

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

Neste capítulo, você aprenderá


| Os recursos do 80486, que são um conjunto aprimorado
| Arquitetura superescalar e previsão de ramificações.
dos recursos do '386.
| Recursos aprimorados da sexta geração da família x86.
| A ideia de transferências de dados em modo burst para ambos
80486 e Pentium.
| Como o multiprocessamento se relaciona com o processamento
| Por que o alinhamento de dados é importante para multibyte multinúcleo.
processadores.
| Os conceitos de ILP e TLP.
| As características do Pentium.

| A estrutura de cache do Pentium.

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.

16.1 | Os recursos aprimorados do 80486

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.

Imagem de abertura do capítulo: Um processador AMD.


Machine Translated by Google

546 OS MICROPROCESSADORES x86

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

Figura 16.1 | Pipeline de cinco estágios do 80486


Machine Translated by Google

O PROCESSADOR PENTIUM 547

T1 T2 T1 T2

CLK

Endereço

Dados

PUBLICIDADES

Figura 16.2 | Ciclo de ônibus sem rajada

T1 T2 T2 T2 T2

CLK

Endereço

Dados

PUBLICIDADES

BRDY

Figura 16.3 | Transferência de dados em modo burst

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

548 OS MICROPROCESSADORES x86

BE3 BE2 BE1 BE0

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

DP3 D31–D24 D23-D16 DP2 DP1 D15–D8 D7–D0 DP0

Figura 16.4 | Bancos de memória de 80486

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:

Menemônico Função desempenhada


BSWAP Troca de bytes

XADD Troque e adicione


CMPXCHG Comparar e trocar
INVD Invalidar cache

INVLP Invalidar entrada TLB


WBINVD Escreva de volta e invalide o cache

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.

16.2 | Alinhamento de dados


Na Seção 7.3 foi apresentada a ideia de bancos de memória e explicada a importância de usar um
endereço par ao acessar dados de 16 bits. Ficou claro que quando o endereço de memória é par, o acesso
à memória leva apenas um ciclo de barramento, enquanto uma palavra endereçada ímpar incorre na
penalidade de mais um ciclo de barramento. Isso foi para o caso do 8086 onde os dados máximos
Machine Translated by Google

O PROCESSADOR PENTIUM 549

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.

16.3 | O processador Pentium


Agora, chegaremos ao nome mais popular da Intel em processadores, ou seja, Pentium. Em 1993, a Intel desenvolveu seu processador x86
de quinta geração e decidiu chamá-lo de 80586 (de acordo com a convenção seguida até então), mas para afastar concorrentes como AMD
e alguns outros, a Intel quis registrar este título de processador. No entanto, o processo que se seguiu declarou que os números não podem
ser registrados e, portanto, a Intel teve que encontrar um novo nome para seu novo processador, e foi assim que a palavra Pentium surgiu.
Também é chamado de P5. O nome Pentium foi derivado da palavra grega pente, que significa 'cinco', e a terminação latina -ium. Vinod
Dham, um engenheiro de Pune que trabalhou na Intel, é frequentemente aclamado como "o pai do Pentium".

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.

Características da família de processadores Pentium:

• Microprocessador de 32 bits (registradores internos de 32 bits)

barramento de endereços de 32 bits

barramento de dados de 64 bits

• Arquitetura superescalar

Duas unidades inteiras em pipeline

Capaz de 'menos de' um relógio por instrução

Unidade de ponto flutuante canalizado

• Código separado e caches de dados

8 K de cache de código, 8 K de dados de write-back


Machine Translated by Google

550 OS MICROPROCESSADORES x86

• Recursos avançados de design

Previsão de filial

Agora, vamos entrar nos detalhes de cada um desses aprimoramentos.

16.3.1 | Barramento de dados de 64 bits

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.

16.3.2 | Arquitetura superescalar

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.

BE7 BE6 BE5 BE4 BE3 BE2 BE1 BE0

Banco 7 Banco 6 Banco 5 Banco 4 Banco 3 Banco 2 Banco 1 Banco 0

Figura 16.5 | Bancos de memória do Pentium

,
486 Pentium

Unidade de execução Unidade de execução Unidade de execução

32 bits 32 bits 32 bits

barramento de 32 bits barramento de 64 bits

Figura 16.6 | Unidades de execução de pentium e o '486 comparado


Machine Translated by Google

O PROCESSADOR PENTIUM 551

16.3.3 | Unidade de ponto flutuante mais rápida

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.

16.3.4 | Dados separados e cache de instruções

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

Figura 16.7 | Unidade de execução do Pentium


Machine Translated by Google

552 OS MICROPROCESSADORES x86

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.

16.3.5 | Problema de dependência de dados

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.

16.3.6 | Unidade de previsão de filiais

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.

Assim, é imperativo que a unidade de previsão de desvios faça um bom trabalho.


Existem dois métodos de predição de desvios: estático e dinâmico. No primeiro caso, a suposição é que a maioria
das condições de ramificação diz respeito à repetição ou não de um loop. Na maioria dos casos, a condição de saída de
um loop é falsa; portanto, repetir o loop é algo que normalmente é considerado necessário. Este tipo de previsão estática
é simples e rápido, mas sua taxa de sucesso é boa apenas em casos de programas intensivos em loop.

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.

16.3.7 | Tamanho da página

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

O PROCESSADOR PENTIUM 553

16.3.8 | Modo de gerenciamento do sistema


O primeiro Pentium foi lançado em 1993, e uma versão mais recente foi lançada em 1994, que teve um novo modo de
operação, além dos modos real, virtual e protegido. Este modo é o modo System Management, que é um recurso adicional
para gerenciamento eficiente de energia e para executar código proprietário específico.

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.

16,4 | Pentium Pro


Em 1995, a Intel lançou seu processador de sexta geração P6 e o chamou de Pentium Pro. Isso foi seguido por uma série
de novos processadores chamados Pentium II e Pentium III. A arquitetura P6 da Intel, instanciada pela primeira vez no
Pentium Pro, é, por qualquer cálculo, uma história de super sucesso. Seu desempenho foi significativamente melhor do
que o do Pentium, tornou-se um favorito no mercado de desktops e estações de trabalho e abriu o caminho para a Intel
competir também nos mercados RISC. Veja a Tabela 17.2, que compara os processadores desta geração.

Pentium Pro Pentium-II Pentium-III

Ano de lançamento 1º de novembro de 1995 7 de maio de 1997 26 de fevereiro de 1999

Velocidade do 200 MHz 300 MHz 500 MHz


relógio na introdução

Contagem de transistores 5,5 milhões 7,5 milhões 9,5 milhões

Tamanho do cache L1 8K instrução, 16K instrução, 16K instrução,


8.000 dados 16 mil dados 16 mil dados

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.

• Superpipelining O Pentium Pro aumenta drasticamente o número de etapas de execução, para


14, do Pentium 5.

• 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

554 OS MICROPROCESSADORES x86

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'.

• Unidade de previsão de ramificação superior O buffer de destino de ramificação é o dobro do tamanho do


Pentium e sua precisão é maior, tanto quanto 94%.

• 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 | Pentium-II e Pentium-III


Esses dois processadores têm o Pentium Pro como seu núcleo de arquitetura, enquanto fornecem algumas novas instruções e
aprimoramentos.

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

O PROCESSADOR PENTIUM 555

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:

• Tecnologia Hyper Pipeline

• Barramento de Sistema de 400MHz

• Cache de Rastreamento de Execução

• Mecanismo de Execução Rápida


• Cache de Transferência Avançada

• Execução Dinâmica Avançada

• Ponto Flutuante Aprimorado e Unidade Multimídia

• Extensões 2 do SIMD de streaming

Não discutiremos tudo isso em detalhes aqui – em vez disso, falaremos sobre as novas tendências em design de
processos.

16,7 | Últimas tendências em design de microprocessadores


Com velocidades de clock atingindo valores muito altos, o que leva a uma dissipação de energia cada vez maior,
novas formas de melhorar o desempenho estão sendo consideradas. Assim, as últimas tendências em design de
microprocessadores estão focadas em duas ideias – multithreading e processamento multicore. Vamos agora tentar
ter uma ideia do que exatamente isso significa.

16.7.1 | Processadores multicore


No Capítulo 13, discutimos 'multiprocessadores' – a ideia de ter dois ou mais processadores ligados com recursos
comuns – discutimos os problemas associados e as possíveis soluções. Nisso, cada processador é fisicamente
separado e autocontido – mas basicamente podemos considerar cada um deles como um 'elemento de processamento',
e quando muitos desses elementos de processamento trabalham em sincronismo, o sistema resultante é mais
poderoso e oferece um rendimento maior.
Nos últimos tempos, a mesma ideia está sendo usada com um novo nome – tecnologia multicore – a única
diferença é que os elementos de processamento não são chips separados, mas sim dois ou mais elementos de
processamento no mesmo chip – fabricados na mesma matriz. Cada um desses elementos de processamento é agora
chamado de 'núcleo'. Assim, agora o 'processamento multicore' atingiu a maioridade e é a nova tendência da indústria
e está crescendo rapidamente. Como os núcleos estão na mesma matriz, eles estão fisicamente muito próximos e a
comunicação entre eles é rápida. Idealmente, um processador de núcleo duplo (um com dois núcleos) deve ser duas
vezes mais poderoso que um processador de núcleo único. No entanto, na prática, os ganhos de desempenho são
cerca de cinquenta por cento, o que significa que um processador dual core provavelmente será cerca de uma vez e
meia mais poderoso que um processador single core.
Núcleos múltiplos podem ser heterogêneos ou homogêneos – no primeiro; dois tipos diferentes de núcleos estão
na mesma matriz – por exemplo, como ter um processador de uso geral e um processador matemático no mesmo
chip. Isso já está presente no 80486 e no Pentium – mas quando falamos de processadores multicore, geralmente
queremos dizer núcleos 'homogêneos'.
Processadores dual core e quad core foram fabricados pela Intel, AMD e ARM, por exemplo. Os núcleos são
normalmente integrados em uma única matriz de circuito integrado (conhecida como
Machine Translated by Google

556 OS MICROPROCESSADORES x86

Arquivo de registro

VAI

Barramento do sistema

Interface de barramento

Figura 16.8 | a Um microprocessador de núcleo único

Arquivo de registro Arquivo de registro Arquivo de registro Arquivo de registro

UMA UMA UMA UMA

eu eu eu eu

DENTRO DENTRO DENTRO DENTRO

Interface de barramento

Figura 16.8 | b Um microprocessador multicore

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

O PROCESSADOR PENTIUM 557

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

• tem suas próprias instruções e dados,

• pode fazer parte de um programa paralelo ou programas independentes,

• 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

16.7.1.3 | TLP e ILP


TLP (Thread Level Parallelism) É explicitamente representado por vários threads de execução que são inerentemente
paralelos. Neste, vários fluxos de instruções são usados para melhorar a taxa de transferência de computadores que
executam muitos programas e reduzir o tempo de execução de programas com vários segmentos.

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.

16.7.1.4 | Multithreading simultâneo (SMT)


Isso explora o ILP, bem como o TLP. Multithreading simultâneo é uma técnica para melhorar a eficiência geral de CPUs
superescalares com multithreading de hardware. O SMT permite vários threads independentes de execução para melhor
utilizar os recursos de hardware.
O SMT permite que vários threads independentes sejam executados simultaneamente no mesmo núcleo. No
multithreading simultâneo, instruções de mais de um thread podem ser executadas em qualquer estágio do pipeline por
vez. Isso é feito sem grandes mudanças na arquitetura básica do processador – as principais adições necessárias são a
capacidade de buscar instruções de várias threads em um ciclo e um arquivo de registrador maior para armazenar dados
de várias threads. Por exemplo, se um encadeamento estiver aguardando a conclusão de uma operação de ponto
flutuante, outro encadeamento poderá usar as unidades inteiras.

16.7.2 | Processamento de vários núcleos

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

558 OS MICROPROCESSADORES x86

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.

16,8 | Tecnologia Multi-Core e Intel


O processador Pentium-D a 3,2 GHz foi o primeiro processador de servidor da Intel a integrar a tecnologia multi-core.

Família de processadores Intel® Core™2


1. Intel® Core™ i7

2. Intel® Core™ 2 Extreme

3. Intel® Core™ 2 Quad


4. Intel® Core™ 2 Duo

Aqui, 1 e 3 são processadores de quatro núcleos e 2 e 4 são processadores de núcleo duplo.

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 PENTIUM 559

16,9 | Processadores móveis


Vários processadores móveis foram fabricados por várias empresas, onde a palavra 'móvel' implica seu uso
em laptops que são portáteis, ou seja, móveis. A Intel tem vários processadores móveis. Pentium M (M para
celular) é um de seus processadores sendo usado para computação móvel.
Mais sobre isso e a tecnologia Centrino da Intel são abordados na Seção 17. Outro processador novo e
promissor para computação móvel é o processador Atom da Intel, considerado o 'menor' dos processadores
com desempenho comparável.

16.10 | Suporte legado


Começamos nossas discussões sobre x86, a partir do processador 8086 em diante. Percorremos uma grande
distância ao chegar ao Pentium e depois aos processadores multicore da Intel. O tempo todo, sempre que a
Intel desenvolvia o processador de próxima geração da família x86, um aspecto que precisava ser garantido
era o problema de compatibilidade com versões anteriores, o que significa que o mais novo processador x86
deve ser capaz de executar as instruções do 8086 de 16 bits. Vimos o processador Pentium que possui um
barramento de dados de 64 bits, mas que faz todos os cálculos em 32 bits. A próxima geração de
processadores será definitivamente de 64 bits; no entanto, esses processadores também terão que fornecer
o 'suporte legado' para executar aplicativos de 16/32 bits. Esses problemas fazem com que os processadores
mais novos gastem uma certa parte de seu orçamento de transistores para suporte legado. Números de até
30% foram sugeridos para este orçamento, o que é bastante alto, mas isso pode continuar sendo necessário
se a família x86 tiver que permanecer em uso.

PONTOS-CHAVE DESTE CAPÍTULO

| 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.

| O primeiro processador Pentium da Intel foi lançado em 1993.

| 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.

| Tem uma unidade de ponto flutuante mais rápido.

| Suas instruções e caches de dados são separados.

| Pode ter um tamanho de página de 2 MB/4 MB.

| O Pentium Pro é o primeiro dos processadores Intel de sexta geração da família x86.

| Pentium II e III são versões aprimoradas da família Pentium Pro.

| A nova tendência no design de microprocessadores é adicionar mais núcleos na mesma matriz.

| A simultaneidade pode ser alcançada pelo paralelismo no nível de thread e no nível de instrução.

| Multithreading é um método de software de execução paralela de instruções.


Machine Translated by Google

560 OS MICROPROCESSADORES x86

PERGUNTAS
1. Qual é a diferença entre 80386 DX e SX?

2. O que é cache L1 e como ele é diferente do cache L2?

3. O que é overclock? Quais são as possíveis armadilhas dessa ideia?

4. Como um ciclo de acesso intermitente à memória contribui para a velocidade da memória?

5. Qual é a penalidade incorrida no desalinhamento de dados?

6. Qual a vantagem de ter um barramento de dados de 64 bits para um processador de 32 bits?

7. O que significam as seguintes palavras no contexto de um processador Pentium?


a) arquitetura superescalar b)
previsão de desvio c) cache de
código e cache de instruções d) travamento
de pipeline

8. Qual é o primeiro processador da sexta geração da família x86?

9. Quais são os usos do grupo de instruções MMX e SSE?

10. De que forma os processadores multicore melhoram o desempenho?

11. Compare e contraste ILP e TLP.

EXERCÍCIO

1. Encontre os nomes e a frequência de operação de outros processadores da classe Pentium-IV de


processadores.

2. Descubra como a 'renomeação de registro' ajuda a resolver os problemas de 'paralisação de pipeline'.

3. No Pentium Pro, há um 'cache de nível 2 integrado'. O que exatamente é isso?

4. Como a otimização de 32 bits do Pentium Pro melhora o desempenho da execução do programa?

5. Conheça os recursos do processador Atom da Intel.

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

Neste capítulo, você aprenderá


| Os recursos de hardware do sistema baseado em x86 | A relevância e os recursos do barramento de expansão
computador pessoal. PCI Express.
| Os componentes que compõem a placa-mãe. | Os recursos que tornaram o USB muito popular.
| O significado da palavra 'chipset' e seu significado. | A transição de ATA para SATA.
| O que SIMM e DIMM significam.
| Os dispositivos ligados ao Norte e
| Como as RAMs de canal duplo devem
Pontes do Sul. velocidades de memória duplas.

| 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.

Imagem de abertura do capítulo: Um chip ponte sul.


Machine Translated by Google

562 OS MICROPROCESSADORES x86

17.1 | O computador moderno


Nos capítulos anteriores, vimos a evolução do PC e como as coisas mudaram ao longo dos anos. Entraremos nos detalhes
do PC como está agora, com os recursos mais recentes e, ao fazê-lo, também daremos uma olhada em como e por que
as mudanças ocorreram.
Quais são as peças associadas a um PC? Eles são:

e) Processador, RAM e ROM

ii) Monitor de vídeo, teclado, mouse

iii) Disco rígido

iv) Impressora, alto-falante, modem

v) drives de CD/DVD, drives de disquete (obsoletos, mais ou menos)

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

O COMPUTADOR PESSOAL BASEADO EM x86 563

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.

Na figura, o processador não está no soquete. Na placa, vários componentes eletrônicos


e trilhas podem ser vistos. Tudo isso funciona em conjunto para facilitar o uso da placa-mãe
como um hub que conecta vários componentes. As partes mais importantes da placa-mãe foram
marcadas e rotuladas. Muitos deles são slots/soquetes para placas que são conectadas à placa-
mãe e que ficam dentro do gabinete. À medida que você ler as próximas seções, as funções
dessas partes ficarão claras.
A Figura 17.2 mostra os soquetes típicos para conectar dispositivos externos ao computador.
Eles são colocados na lateral da placa-mãe e são acessíveis na parte de trás do gabinete. Além desses soquetes, conectores
e portas, a placa-mãe contém vários outros contatos. Esses incluem:

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.

Estes não são mostrados nas figuras.

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

Figura 17.1 | Uma placa-mãe com peças importantes marcadas e rotuladas


Machine Translated by Google

564 OS MICROPROCESSADORES x86

Ethernet
Porta Paralela Porta serial

Rato

Saída de áudio microfone


Teclado VGA Serial
Porta Entrada de áudio
USB

Figura 17.2 | Conectores da placa-mãe, acessíveis fora do PC

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

O COMPUTADOR PESSOAL BASEADO EM x86 565

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.

17.3.1 | Ponte Norte e Ponte Sul


Um chipset consiste em dois microchips principais. Estes são conhecidos como a Ponte Norte e a Ponte
Sul. O North Bridge trata os dados para o AGP (Accelerated Graphics Port), ou seja, o adaptador da placa
de vídeo e a memória principal que inclui o FSB (Front Side Bus, outro nome para o barramento do sistema)
Embora ambos os chips sejam necessários para o PC para funcionar, o North Bridge lida com a maioria
das tarefas muito importantes, como a conexão entre a CPU e a memória principal.

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)

PCI Express, PCI


Norte Sul
Ponte Ponte
USB

CPU ATA

BATER Disquete, COM, LPT


Teclado, mouse e
Outros dispositivos de E/S
Cartão de vídeo

Figura 17. 3 | A ponte norte e a ponte sul


Machine Translated by Google

566 OS MICROPROCESSADORES x86

Controlador PCI
Sul
Ponte
Controlador ATA

Controlador USB (host)

LPC
Outros dispositivos de E/S
Super E/S

Figura 17.4 | Ponte sul complementada pelo chip super I/O

• Modem (na ponte sul)


• Rede e Firewire (na ponte sul)
Todas essas funções eram tradicionalmente gerenciadas por dispositivos separados, geralmente placas
plug-in, que se conectam ao PC. No entanto, verificou-se que essas funções podem definitivamente ser
incorporadas ao próprio chipset. Por exemplo, não é preciso comprar uma placa de som extra ou mesmo uma
placa de vídeo separada, pois elas já estão na placa-mãe – compramos placas extras apenas para obter uma
qualidade de som e vídeo melhor do que a garantida no chipset. A compra ou não desses cartões extras
depende da nossa necessidade e também do nosso orçamento.

17.3.2 | Arquitetura de Hub Intel


A Intel Hub Architecture (IHA) substituiu o chipset Northbridge/Southbridge. O chipset IHA também possui
duas partes, o Graphics and Memory Controller Hub (GMCH) e o I/O Controller Hub (ICH).

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.

17,4 | Velocidade de transferência

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

O COMPUTADOR PESSOAL BASEADO EM x86 567

Pentium 4 Canal duplo


CPU
Ranhuras de Memória
AGP
Slot

3,2 GB/s

Memória 1,6 GB/s


AGP Controlador
1 GB/s
4X Eixo
(MCH) 1,6 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.

17.4.2 | AGP Outra

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

568 OS MICROPROCESSADORES x86

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 | Barramentos de Expansão


A palavra 'barramento de expansão' significa os barramentos de E/S através dos quais os dispositivos de E/S são
conectados ao processador (na Ponte Sul ou ICH). Isso é usado para periféricos mais lentos, como visto nas
Figuras 17.3–17.5. Vamos descobrir quais são as características desses ônibus e quais mudanças ocorreram ao
longo dos anos.

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

O COMPUTADOR PESSOAL BASEADO EM x86 569

dispositivo, mas quando mais dispositivos entraram em cena, havia uma chance de interferir nas atividades da CPU -
essa era sua desvantagem.

17.5.2 | Barramento PCI

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:

33,33 MHz × 4 bytes (32 bits) = 133 MBps

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.

Figura 17. 6 | Quatro slots PCI em uma placa-mãe


Machine Translated by Google

570 OS MICROPROCESSADORES x86

Quais são os recursos importantes e distintos do barramento PCI?


i) Suporta sinalização de 3,3 e 5 V.
ii) É independente do processador.
iii) Plug and Play.
Ele pode configurar dinamicamente um sistema, evitando confl itos de recursos. A especificação para Plug and
Play foi desenvolvida pela Microsoft e Intel entre outros, e a ideia era fornecer um sistema onde se pode
simplesmente instalar um adaptador para um componente e ele deve funcionar. Não é tão simples na prática;
um driver de software deve ser instalado antes que um adaptador funcione. No entanto, a cooperação real entre
adaptador, placa-mãe e sistema operacional – acontece automaticamente aliada. Durante a inicialização, a
comunicação ocorre entre os programas de inicialização do PC, o controlador PCI e cada dispositivo PCI.

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.

17.5.3 | PCI Express


Todos os barramentos de que falamos até agora eram barramentos paralelos – dados de 8 bits, 16 bits, 32 bits
ou 64 bits movidos em paralelo, juntamente com endereços e sinais de controle – o que tornava o número de
pinos em um conector de barramento bastante grande. Ao longo dos anos, a tendência de transferência de
dados passou de paralela para serial devido aos problemas associados à transferência paralela de dados, sendo
o mais significativo o que é chamado de 'distorção'. Por exemplo, quando os dados são enviados por 32 linhas
paralelas, todas as informações de bits não chegam ao destino ao mesmo tempo e, portanto, algumas linhas são
'inclinadas' em relação às outras. Esse problema sempre existiu, mas agora que as velocidades de transferência
tiveram que ser aumentadas, o efeito causado por isso se agravou. Além disso, com maior número de linhas de
dados, o problema de cross talk e interferência eletromagnética entre elas também se intensificou.
A solução para tudo isso tem sido a conversão gradual de padrões de dados paralelos para seriais – a
evolução do PCI Express e do USB são os exemplos de grande sucesso dessa mudança. As especificações PCI
Express foram finalizadas em julho de 2002 e foram inicialmente chamadas de 'Especificações de barramento
de E/S de terceira geração', onde ISA era a primeira geração e PCI era a segunda geração. Uma característica
dessa nova especificação foi a compatibilidade com versões anteriores com o barramento PCI existente, porque
não se pode esperar que o padrão existente seja eliminado da noite para o dia.

Nota Não há slot PCIe (PCI-Express) na placa-mãe mostrada na Fig 17.1.


No PCI-Express, os dados são enviados em full duplex (dois caminhos de sentido único separados) por dois
pares de fios sinalizados de forma diferente, chamados de lane. Cada pista atende a uma taxa de transferência
de 250 MBps em cada direção. Um fator de multiplicação de 1 para 2, 4, 8, 16 ou 32 é possível, onde esses
números significam o número de tais pistas (canais). Com 8 canais, a largura de banda é de 250 × 8 = 2000
MBps de sentido único. PCIe 16x tem uma taxa de dados de 4000 MBps. Compare isso com o PCI que tem uma
largura de banda de 133 MBps (unidirecional) e precisa de muito mais pinos em virtude de ser uma porta paralela.
Uma mudança óbvia na placa-mãe são os conectores PCIe de tamanho menor, em comparação com os
conectores PCI. Nos últimos anos, as placas-mãe foram projetadas com PCI
Machine Translated by Google

O COMPUTADOR PESSOAL BASEADO EM x86 571

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.

Figura 17.7 | Três soquetes PCIe em uma placa-mãe


Machine Translated by Google

572 OS MICROPROCESSADORES x86

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.

17.5.4.1 | Características do USB

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).

17.5.4.2 | USB – Problemas de energia

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

O COMPUTADOR PESSOAL BASEADO EM x86 573

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).

17.6.1 | Disco rígido


Um disco rígido é uma unidade selada contendo vários pratos em uma pilha. Os discos rígidos podem ser montados na
posição horizontal ou vertical. Vamos supor um disco rígido horizontal. As cabeças de leitura/gravação eletromagnéticas
são posicionadas acima e abaixo de cada prato. À medida que os pratos giram, as cabeças de acionamento se movem
em direção à superfície central e saem em direção à borda. Desta forma, as cabeças de acionamento podem atingir
toda a superfície de cada prato.
Em um disco rígido, os dados são armazenados em bandas finas e concêntricas. Uma cabeça de unidade,
enquanto em uma posição pode ler ou escrever um anel circular ou uma faixa chamada de faixa. Pode haver mais de
mil faixas em um disco rígido de 3,5 polegadas. As seções dentro de cada trilha são chamadas de setores. Um setor é

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.

17.6.2 | Interface de disco rígido


A interface para o disco rígido possui dois conjuntos de controladores e um cabo de interligação. Veja o PCB sob o
disco rígido na Fig 17.9. Parte da eletrônica do drive está aqui, e a outra parte está integrada na ponte sul como
controlador ATA (Fig 17.3).
A interface ATA pode ser vista como um barramento, que é gerenciado por um controlador host. Até quatro
dispositivos podem ser conectados por controlador host. O inusitado da interface ATA é que existem dois canais, cada
um podendo ter dois dispositivos conectados. Eles são chamados de canais primários e secundários. Se dois dispositivos
estiverem conectados a um canal, eles devem ser configurados como um dispositivo mestre e um dispositivo escravo.
Esses quatro canais são padrão nas placas-mãe atuais usando ATA paralelo. As placas-mãe normalmente têm
conectores para dois cabos ATA, que podem conectar dois dispositivos (mestre e escravo). Com todos os quatro canais
sendo usados, podem ser dois discos rígidos, um leitor de CD/DVD e um drive de DVD R/W.

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

574 OS MICROPROCESSADORES x86

Uma trilha
1 Setor = 512 bytes

Figura 17.8 | Faixas e setores de um disco rígido

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

Figura 17.10 | Os quatro canais do sistema ATA.


Machine Translated by Google

O COMPUTADOR PESSOAL BASEADO EM x86 575

Figura 17.11 | Dois conectores ATA em uma placa-mãe

Figura 17.12 | Quatro conectores SATA em uma placa-mãe

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

576 OS MICROPROCESSADORES x86

17,7 | Memória – SIMM e DIMM


O aspecto teórico da memória semicondutora foi discutido no Capítulo 12. Aqui, veremos como esses
aspectos teóricos importam no mundo dos computadores pessoais. A quantidade de memória física que
pode ser usada para um chip Pentium Pro é de 236 bytes, onde 36 é o número de linhas de endereço
que ele possui. Isso chega a 64 GB de espaço de memória física, que é um número muito grande. Ter
essa quantidade de RAM é proibitivamente caro e requer vários chips DDR e vários soquetes para
colocá-los. A capacidade máxima dos DDRs atuais é de apenas 2/4 GB. Na prática, a RAM que a maioria
das placas-mãe suporta é menor do que a quantidade fisicamente utilizável. Sabemos que o conceito de
memória virtual permite ao usuário sentir que tem memória além do que está fisicamente disponível.

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 COMPUTADOR PESSOAL BASEADO EM x86 577

Figura 17.14 | DIMM para DDR-2 com entalhes semelhantes

Figura 17.15 | Quatro slots de memória DIMM de canal duplo

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.

17.7.1 | Memória de canal duplo


Esta é uma técnica anunciada para dizer que dá o dobro da velocidade para a memória. A diferença está na placa-
mãe, ou melhor, no design do controlador de memória, e não na tecnologia de memória.
Na Fig. 17.5, a palavra soquete SDRAM de 'canal duplo' é usada. O diagrama mostra um chipset Intel onde o
controlador de memória suporta dual channel para RAMs Nos processadores AMD e em alguns processadores da
Intel (Nehalem, por exemplo), o controlador de memória fica dentro do chip.

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

578 OS MICROPROCESSADORES x86

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.

17,8 | BIOS do sistema


Você viu o termo BIOS ser usado muitas vezes ao longo deste livro e também usou algumas das rotinas do BIOS
para acessar o hardware do PC. Assim, uma ideia do que é e o que pode ser feito com ele, deve ser aparente.
Aqui, vamos ver a relevância do BIOS para PCs e as mudanças que ocorreram no uso do BIOS ao longo dos
anos.
BIOS significa Basic Input Output System e é uma coleção de funções que podem ser chamadas para
acessar o hardware diretamente. (O software que interage diretamente com um determinado hardware é
chamado de 'driver'). Essas funções são ativadas por meio de chamadas de interrupção de software e são
armazenadas na ROM do sistema, que é uma área no espaço de endereço físico do PC. A Tabela 7.2 mostra a
alocação de endereço para BIOS de 64 K de F0000H a FFFFFH.
Na Seção 6.1.9, você viu que na inicialização, a primeira instrução será obtida do local FFFF0H. Isso é para
o processador 8086. No entanto, para todos os processadores avançados além de 8086, na inicialização, o
processador acorda no modo real, onde apenas o menor 1 MB de memória é efetivo. No local de ativação há
uma instrução de salto ( Seção 8.4) para outra parte da memória que contém o carregador de inicialização, que
é um programa para carregar o SO do disco para a RAM do sistema. A ROM também contém o programa Power
on Self Test (POST), que é um programa que testa todo o hardware e memória antes que o sistema seja ligado.

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

O COMPUTADOR PESSOAL BASEADO EM x86 579

(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.

17.8.1 | ROM BIOS e placas-mãe


As rotinas do BIOS são aquelas que interagem diretamente com o hardware – portanto, elas devem ser projetadas
'para a placa-mãe'. O BIOS da placa-mãe geralmente inclui drivers para todos os componentes básicos do
sistema, incluindo teclado, unidade de disquete, disco rígido, portas seriais e paralelas e muito mais.
Como os drivers no BIOS se comunicam com o hardware, o BIOS deve ser específico para o hardware e combiná-
lo completamente.
Como mencionado anteriormente, muitos dispositivos podem ter seus drivers no disco rígido junto com o
sistema operacional e podem ser carregados na RAM durante o tempo de inicialização. No entanto, isso não se
aplica a dispositivos essenciais como o monitor, por exemplo – portanto, seus drivers mínimos devem estar
disponíveis na ROM do sistema como funções do BIOS. Como o BIOS deve ser compatível com o hardware da
placa-mãe, ele foi projetado para hardware específico. A prática é que os projetistas de BIOS forneçam o BIOS
de acordo com as especificações dos fabricantes da placa-mãe. Os vendedores de BIOS mais populares são
AMI (American Megatrends Inc) e Phoenix. Anteriormente, o chip BIOS 'AWARD' era comumente visto em PCs -
mais tarde, a Phoenix adquiriu a Award e ainda mais tarde, eles pararam de vender BIOS em nome da Award.
Esses são os fornecedores de software para placas-mãe Intel, mas também existem outros players no mercado.

17.8.2 | Flash BIOS


A partir dos últimos dez anos, o BIOS está em ROM flash e a vantagem é que, como o ROM flash é regravável
na própria placa de circuito, seu conteúdo pode ser alterado. Isso faz sentido se as atualizações do BIOS
estiverem disponíveis. O termo 'flashing the BIOS' implica a alteração do conteúdo da fl ash ROM e é feito para
substituir o conteúdo original por uma versão atualizada do mesmo BIOS, se o usuário achar que a nova versão
possui alguns recursos úteis para ele . Veja o chip BIOS flash na Fig 17.1.

17.8.3 | CMOS NVRAM


Vemos que a hora do sistema está correta, uma vez definida – apesar de podermos desligar o computador com
frequência. Isso implica que existe alguma ROM que mantém a contagem do tempo continuamente. Na realidade,
não existe tal ROM, mas um relógio de tempo real (RTC) é mantido continuamente em execução dentro de uma
NVRAM (RAM não volátil). Esta é uma RAM feita de CMOS que tem uma bateria de backup, tornando seu
conteúdo não volátil.
No sistema original IBM AT, um chip Motorola 146818 foi usado como relógio em tempo real (RTC) e chip
CMOS RAM. Este chip especial tinha um relógio digital simples que usava 14 bytes de RAM e restavam 50 bytes
nos quais algumas configurações do sistema eram armazenadas.
Machine Translated by Google

580 OS MICROPROCESSADORES x86

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.

17,9 | Novas placas-mãe


Assim, discutimos a maioria das partes importantes de uma placa-mãe. Agora, vejamos uma placa-mãe mais
recente do que a mostrada na Fig 17.1. Esta é uma placa-mãe Intel, lançada no ano de 2006, e era uma placa
bastante avançada daquele ano. Ela tem quatro soquetes PCI e três soquetes PCIe – a placa gráfica deve ser
conectada ao longo slot PCIe. Ele também possui dois conectores ATA paralelos e quatro conectores SATA.
Há também um conector para a unidade de disquete, que é semelhante ao ATA, mas com um conector diferente.
O processador geralmente é coberto por um ventilador e dissipador de calor – isso foi removido para mostrar o
processador (Fig 17.16). O conector ATX é a conexão com a fonte de alimentação para todos os componentes
da placa-mãe.
Na figura, o processador é visto como um chip quadrado colocado em seu soquete. Na condição de
trabalho, o processador é coberto com um dissipador de calor e um ventilador para dissipar o calor produzido

ATX ATA HORAS


Conector

DIMM
tomadas

Processador

Slots PCIe Ranhuras PCI

Figura 17.16 | Placa-mãe Intel mostrando todos os soquetes e conectores importantes


Machine Translated by Google

O COMPUTADOR PESSOAL BASEADO EM x86 581

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

Rato VGA Firewire Ethernet

Teclado Dois USB Áudio

Figura 17.18 | Conectores vistos na parte traseira de um novo PC

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

582 OS MICROPROCESSADORES x86

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.10 | Outros dispositivos de E/S


Discutimos a maioria dos componentes importantes de um PC de mesa de uso geral. O que resta
são dispositivos como teclados e mouses. Não entraremos em detalhes, mas faremos uma declaração
geral de que cada um deles requer hardware de controlador que é cuidado pela ponte sul.
Recentemente, seus conectores também se tornaram USB. No entanto, ainda existem versões PS/2
desses dispositivos de entrada.
Muitos itens como placas de rede, drives ópticos, modems e conexões Ethernet não foram
discutidos aqui. O leitor interessado é aconselhado a ler e descobrir sobre estes e também a
relevância de termos como SCSI, RAID e CNR (é mostrado na Fig 17.5).

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.

17.12 | Fatores de forma


Existe um termo chamado fator de forma frequentemente usado no mundo dos PCs. Isso se refere
à dimensão física dos componentes em um PC, que ditam o tamanho físico do gabinete, a
Machine Translated by Google

O COMPUTADOR PESSOAL BASEADO EM x86 583

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

584 OS MICROPROCESSADORES x86

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.

17.13.1 | Tecnologia Centrino da Intel


Muitos de vocês, quando confrontados com a perspectiva de comprar um laptop, já ouviram a palavra 'Centrino'
referindo-se a um processador da Intel que é usado em laptops. No entanto, na verdade, a palavra Centrino não
se refere a um processador Intel – refere-se a um sistema que a Intel fabricou para aplicativos móveis – isso
significa que a Intel projetou uma placa-mãe com um processador e chipsets específicos que, quando usados
em um laptop, tornam é um sistema 'Centrino'.
Devido à grande quantidade de publicidade da Intel e ao desempenho razoavelmente bom, o selo Centrino
definitivamente causou impacto no mercado de laptops.
Para ser considerada uma placa Centrino, ela deve possuir os seguintes componentes: o processador Intel
Pentium – M, um chipset Intel 855 e um módulo de rede sem fio Intel 802.11. Ele também deve ter uma placa
mini PCI Intel PRO/wireless. A placa mini PCI tem aproximadamente o tamanho de um cartão de crédito e é
conectada à placa-mãe através de um conector mini PCI.
No entanto, as coisas também estão se movendo na direção em que versões mais recentes do Pentium-M
estão sendo usadas em placas-mãe de outros fornecedores que oferecem desempenho melhor ou comparável.
Outra novidade prometida pela Intel é um sistema em chip (SOC) para um laptop, baseado no processador
Atom, que é um processador 'pequeno' e relativamente barato.

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

O COMPUTADOR PESSOAL BASEADO EM x86 585

Figura 17.19 | Laptops com tamanhos de tela de 12” e 9”

Figura 17.20 | Um computador de mesa

PONTOS-CHAVE DESTE CAPÍTULO

| A parte mais importante de um PC é sua placa-mãe.

| Os controladores na placa-mãe são chamados de chipsets.

| 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

586 OS MICROPROCESSADORES x86

| 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 adaptador para as unidades acima é chamado de ATA.

| O ATA paralelo está sendo gradualmente substituído pelo ATA serial (SATA).

| A memória vem na forma de módulos e o módulo popular atual é chamado DIMM.

| 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?

2. O que significa a palavra 'chipset'?

3. Por que existem muitos fabricantes de chipsets para um determinado processador?

4. Por que o Northbridge deve ter um fator de velocidade muito alta?

5. Quais acessórios são controlados pelo chip LPC?

6. O que significa a palavra 'memory wall'?

7. O que limita a velocidade do barramento frontal?


8. Costumava haver um termo chamado 'back side bus'. A que se referia?

9. Quais são os barramentos considerados precursores do barramento PCI?

10. De que forma o PCI Express é diferente do barramento PCI?

11. Quais recursos tornaram o USB um barramento muito versátil?


12. A que se refere a palavra IDE?

13. Quais são as diferenças entre um módulo DIMM e um SIMM?

14. Por que a memória de dois canais não é tão rápida quanto é anunciada?

15. Qual é o papel do BIOS do sistema agora?


16. Quais informações a NVRAM armazena?

17. Qual é a relevância da palavra 'fator de forma'?

EXERCÍCIO

1. Conheça os componentes e recursos das seguintes placas: a) placa de rede


b) modem c) placa de som d) placa gráfica

2. Qual é o estado da porta fi rewire agora?

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

| Capacidade de endereçamento direto 1 MByte de | Faixa de taxas de clock: 5 MHz


Memória para 8086, 8 MHz para
| Arquitetura projetada para montagem poderosa 8086-2, 10 MHz para
Idioma e Idiomas Eficientes de Alto Nível 8086-1 | Interface
| Conjunto de registradores de 14 palavras, por 16 bits com compatível com o sistema MULTIBUS | Disponível em
Operações Simétricas EXPRESS — Faixa de temperatura padrão — Faixa
| 24 Modos de Endereçamento de Operando de temperatura estendida | Disponível em Cerdip
| Operações de Bit, Byte, Word e Bloco | Aritmética de 40 derivações e embalagem plástica (consulte
assinada e não assinada de 8 e 16 bits em as especificações de embalagem nº 231369)
Binário ou Decimal Incluindo Multiplicar e Dividir

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.

UNIDADE DE EXECUÇÃO UNIDADE DE INTERFACE DE BUS

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

CLK REDEFINIR PRONTO MN/MX GND


VCC 40 chumbo

figura 1 | Diagrama de bloco da CPU 8086 Figura 2 | configuração de 8086 pinos


Machine Translated by Google

588 APÊNDICE

FORMAS DE ONDA

MODA MÍNIMA
T1 T2 T3 TW T4
VCH TCLCL TCH1CH2 TCL2CL1

CLK (saída 8284A)


VCL
TCHTV TCHCL TCLCH

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

PRONTO (Entrada 8086)


TCHRYX

TAVAL TRYHCH
TLLAX
TCLAV TCLAZ TDVCL TCLDX
TCLAX
AD15–AD0 A15–AD0
FLUTUADOR
ENTRADA DE DADOS

FLUTUADOR

TAZRL TCLRH TRHAV

CICLO DE LEITURA
RD

(NOTA 1) TCCTV TCLRL TRLRH TCHTV

(WR, INTA=VOH)
DT/R
TVVCTV TCVCTX

(Contínuo )
Machine Translated by Google

APÊNDICE A 589

MODO MÍNIMO (Continuação)

T1 T2 T3 TW T4
VCH TCLCL TCH1CH2 TCL2CL1

CLK (saída 8284A)


VCL
TCHTV TCHCL TCLCH

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

(RD, WR = VOH) TVVCTV

(BHE=VOL)
ENQUANTO

TVVCTV TCVCTX

ENDEREÇO INVÁLIDO PARADA DE SOFTWARE

TCLAV
PARADA DE SOFTWARE—

RD, WR, INTA=VOH


DT/R = INDETERMINADO

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

S2,S1,S0 (EXCETO PARADA) (VER NOTA 8)

TCLDV TCHDX
TCLAVTCLAX

BHE/S7, A19/S6–A16/S3 BHE, A19-A16 S7–S3


TSVLH TCHLL
TCLLH
ALE (SAÍDA 8288)

VEJA A NOTA 5 TR1VCL

RDY (ENTRADA 8284A)

TCLR1X
TRYLCL

PRONTO (ENTRADA 8086)


TCHRYX
TRYHSH
TCLAX

TRYHCH
CICLO DE LEITURA TCLAZ
TCLAV TDVCL TCLDX

AD15–AD0 A15–AD0 ENTRADA DE DADOS


FLUTUADOR FLUTUADOR

TAZRL TCLRH TRHAV

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

MODO MÁXIMO (Continuação)

T1 T2 T3 T4
TW
VCH
CLK
VCL
TCHSV TCLSH

S2, S1, S0 (EXCETO PARADA) -(ver nota 8)

CICLO DE GRAVAÇÃO TCLAV TCLDV TCHDX

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

FLUTUADOR RESERVADO PARA


AD15–AD0
ENDEREÇO EM CASCATA
FLUTUADOR FLUTUADOR
(VER NOTAS 3 e 4)
TCLAZ TDVCL TCLDX

AD15–AD0 PONTEIRO
FLUTUADOR FLUTUADOR

TCLMCL
TSVMCH

MCE/
PDEN TCLMCH TCHDTL TCHDTH
DT/R

8288 SAÍDAS TCLML


ENQUANTO
VER NOTAS 5,6

TCLMH
TCVNV

PARADA DE SOFTWARE– A
TCVNX
(DEN=VOL; RD, MRDC, IORC, MWTC,

AMWC, IOWC, AIOWC, INTA ,=VOH)


ENDEREÇO INVÁLIDO
AD15–AD0
TCLAV

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

RECONHECIMENTO DE SINAL ASSÍNCRONO

CLK

NMI TINVCH (ver nota 1)

DENTRO sinal

TESTE

Nota: Requisitos de configuração para sinais assíncronos apenas para garantir o reconhecimento no próximo CLK.

TEMPORIZAÇÃO DO SINAL DE BLOQUEIO DO BUS (SOMENTE MODO MÁXIMO) REINICIAR TEMPO

Qualquer ciclo CLK Qualquer ciclo CLK ÿ50ÿ seg

Vcc
CLK

TCLAV TCLAV CLK

TDVCLTCLDX
TRANCAR
REDEFINIR

ÿ4 CICLOS CLK

CRONOGRAMA DE SEQUÊNCIA DE SOLICITAÇÃO/GRANT (SOMENTE MODO MÁXIMO)

Qualquer ciclo CLK >0–Ciclo CLK

CLK

TGVCH TCLCL
TCLGH TCLGL
TCLCL TCHGX TCLGH
PULSO 1 PULSO 3
PULSO 2 COPROCESSADOR
COPROCESSADOR
RQ/GT 8086 GT LIBERAR
RQ

Concessão anterior TCLAZ


AD15–AD0

A19/S6 – A16/S3 COPROCESSADOR 8086


8086
S2 , S1 , S0

RD, BLOQUEIO (VER NOTA 1)

BHE/S7

Nota: O coprocessador não pode conduzir os barramentos fora da região mostrada sem risco de contenção.

HOLD/HOLD CONFIRMAÇÃO DE TEMPO (SOMENTE MODO MÍNIMO)

ÿ 1 CICLO CLK 1 OU 2 CICLOS

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

Tabela 1 | Resumo do conjunto de instruções

Mnemônico e Descrição Código de instrução

TRANSFERÊNCIA DE DADOS 76543210 76543210 76543210 76543210


MOV = Mover:

Registo/Memória para/do Registo 100010 dw mod reg r/m

Registro imediato/memória 1100011 w mod 000 r/m dados dados se w=1

Registro imediato 1011 w reg dados dados se w=1

Memória para acumulador 1010000 w addr-low addr-high

Acumulador para Memória 1010001 w addr-low addr-high

Registro/Memória para Registro de Segmento 10001110 mod 0 reg r/m

Registro de segmento para registro/memória 10001100 mod 0 reg r/m


EMPURRAR = Empurrar:

Registro/Memória 11111111 mod 110 r/m

Registro 01010 registro

Registro de segmento 000 registros 110

POP = POP:
Registro/Memória 10001111 mod 000 r/m

Registro 01011 registro

Registro de segmento 000 registros 111

XCHG = Câmbio:
Registo/Memória com Registo 1000011 w mod reg/m

Registre-se com o acumulador 10010 registro

IN = Entrada de:
Porta Fixa 1110010 em porta

Porta variável 1110110 em

OUT = Saída para:


Porta Fixa 1110011 em porta

Porta variável 1110111 em

XLAT = Traduzir Byte para AL 11010111

LEA = Carregar EA para registrar 10001101 mod reg r/m

LDS = Carregar ponteiro para DS 11000101 mod reg r/m

LES = Carregar Ponteiro para ES 11000100 mod reg r/m

LAHF = Carregar AH com Flags 10011111

SAHF = Armazenar AH em Flags 10011110

PUSHIF = Empurrar Bandeiras 10011100

POPF = bandeiras pop 10011101


(Contínuo )
Machine Translated by Google

594 APÊNDICE

Tabela 1 (Continuação)

Mnemônico e Descrição Código de instrução

ARITMÉTICA 76543210 76543210 76543210 76543210


ADICIONAR = Adicionar:

Reg./Memória com Registro para Imediato para 000000 dw mod reg r/m

Registro/Memória 100000 sw mod 000 r/m dados dados se s: w = 01

Imediato para Acumulador 0000010 em dados dados se w = 1

ADC = Adicionar com Transporte:

Reg./Memória com Registro para Imediato para 000100 dw mod reg r/m

Registro/Memória 100000 sw mod 010 r/m dados dados se s: w = 01

Imediato para Acumulador 0001010 em dados dados se w = 1

INC = Incremento:

Registro/Memória 1111111 w mod 000 r/m

Registro 01000 registro

AAA = Ajuste ASCII para Adicionar 00110111

BAA = Ajuste Decimal para Adicionar 00100111

SUB = Subtrair:

Reg./Memory e Register para Imediato do 001010 dw mod reg r/m

Register/Memory 100000 sw mod 101 r/m dados dados se sw = 01

Imediato do Acumulador 0010110 ramal dados dados se w = 1

SSB = Subtrair com Empréstimo

Reg./memória e registro para qualquer um 000110 dw mod reg r/m

imediatamente do registro/memória 100000 sw mod 011 r/m dados dados se sw = 01

Imediato do Acumulador 000111 em dados dados se w = 1

DEC = Diminuir:

Registro/Memória 1111111 w mod 001 r/m

Registro 01001 registro

NEG = Alterar sinal 1111011 w mod 011 r/m

CMP = Comparar:

Cadastro/Memória e Cadastro 001110 dw mod reg r/m

Imediato com Registro/Memória 100000 sw mod 111 r/m dados dados se sw = 01

Imediato com acumulador 0011110 ramal dados dados se w = 1

AAS = Ajuste ASCII para Subtração 001111111

DAS = Ajuste Decimal para Subtração 001001111


(Contínuo )
Machine Translated by Google

APÊNDICE A 595

Tabela 1 (Continuação)

Mnemônico e Descrição Código de instrução

ARITMÉTICA 76543210 76543210 76543210 76543210


ADICIONAR = Adicionar:

MUL = Multiplicar (sem sinal) 1111011 w mod 100 r/m

IMUL = Multiplicar Inteiro (Assinado) 1111011 w mod 101 r/m

AAM = Ajuste ASCII para Multiplicação 11010100 00001010

DIV = Dividir (Não assinado) 1111011 w mod 110 r/m

IDIV = Divisão inteira (assinada) 1111011 w mod 111 r/m

AAD = Ajuste ASCII para Divisão 11010101 00001010

CBW = Converter Byte para Mundo 10011000

CWD = Converter palavra em palavra dupla 10011001

LÓGICA

NÃO = Inventar 1111011 w mod 010 r/m

SHL/SAL = Deslocamento Lógico/Aritmético Esquerdo 110100 vw mod 100 r/m

SHR = Deslocamento Lógico para a Direita 110100 vw mod 101 r/m

SAR = Deslocamento Aritmético à Direita 110100 vw mod 111 r/m

ROL = Girar para a esquerda 110100 vw mod 000 r/m

ROR = Girar para a direita 110100 vw mod 001 r/m

RCL = Girar através da bandeira de transporte para a esquerda 110100 vw mod 010 r/m

RCR = Girar através da direita 110100 vw mod 011 r/m

E = E:

Reg./memória e registro para qualquer um 001000 dw mod reg r/m

imediatamente para registro/memória 1000000 w mod 100 r/m dados dados se w = 1

Imediato para Acumulador 0010010 ramal dados dados se w = 1

TESTE = E função para sinalizadores, sem resultado:

Cadastro/Memória e Cadastro 1000010 w mod reg r/m

Dados Imediatos e Registro/Memória 1111011 w mod 000 r/m dados dados se w = 1

Dados imediatos e acumulador 1010100 em dados dados se w = 1

OU = Ou:

Reg./memória e registro para qualquer um 000010 dw mod reg r/m

imediatamente para registro/memória 1000000 w mod 001 r/m dados dados se w = 1

Imediato para Acumulador 0000110 em dados dados se w = 1

(Contínuo )
Machine Translated by Google

596 APÊNDICE

Tabela 1 (Continuação)

Mnemônico e Descrição Código de instrução

76543210 76543210 76543210 76543210

XOR = Exclusivo ou:

Reg./memória e registro para qualquer um 001100 dw mod reg r/m

imediatamente para registro/memória 1000000 w mod 110 r/m dados dados se w = 1

Imediato para Acumulador 0011010 ramal dados dados se w = 1

MANIPULAÇÃO DE STRING

REP = Repetir 1111001z

MOVS = Mover Byte/Palavra 1010010 em

CMPS = Comparar Byte/Palavra 1010011 em

SCAS = Sean Byte/Word 1010111 em

LODS = Byte Local/Wd para AL/AX 1010110 em

STOS = Stor Byte/Wd de AL/A 1010101 em

TRANSFERÊNCIA DE CONTROLE

CHAMAR = Ligar:

Direto dentro do segmento 11101000 profundo dap-alto

Indireto dentro do segmento 11111111 mod 010 r/m

Intersegmento Direto 10011010 off set-low off set-high

segmento baixo seg-high

Intersegmento indireto 11111111 mod 011 r/m

JIMP = Salto Incondicional:

Direto dentro do segmento 11101001 exibição-baixa disp-hish

Direto dentro do segmento-curto 11101011 exibir

Indireto dentro do segmento 11111111 mod 100 r/m

Intersegmento Direto 11101010 off set-low off set-high

segmento baixo seg-high

Intersegmento indireto 11111111 mod 101r/m

RET = Retorno da CHAMADA:

Dentro do segmento 11000011

Dentro do Segmento Adicionando Imediatamente ao SP 11000010 poucos dados dados altos

Intersegmento 11001011

Intersegmento Adicionando Imediato ao SP 11001010 lei de dados dados altos

(Contínuo )
Machine Translated by Google

APÊNDICE A 597

Tabela 1 (Continuação)

Mnemônico e Descrição Código de instrução

76543210 76543210 76543210

JE/JZ = Saltar em Igual/Zero 01110100 exibir

JL/JNGE = Saltar em Menos/Não Maior de Igual 01111100 exibir

JL/JNG = Saltar em Menos ou Igual/ 0111110 exibir


Nem Maior

JB/JNAE = Saltar abaixo/não acima ou igual 01110010 exibir

JBE/JNA = Saltar abaixo ou igual/ 01110110 exibir


Não Acima

JP/JPE = Saltar na Paridade/Paridade Par 01111010 exibir

JO = Saltar no estouro 01110000 exibir

JS = Saltar no sinal 01111000 exibir

JNE/JNZ = Saltar em Não Igual/Não Zero 01110101 exibir

JNL/JGE = Saltar em Não Menos/Maior de Igual 01111101 exibir

JNLE/JG = Saltar em não menor ou igual/maior 01111111 exibir

JNB/JAE = Saltar em Não Abaixo/Acima do Igual 01110011 exibir

JNBE/JA = Saltar em Não Abaixo ou Igual/ Acima 01110111 exibir

JNP/JPO = Saltar em Não Par/Par Ímpar 01111011 exibir

JNO = Saltar para Não Transbordar 01110001 exibir

JNS = Saltar em Não Assinar 01111001 exibir

LOOP = Lop CX Tempos 11100010 exibir

LOOPZ/LOOPE = Loop Enquanto Zero/Igual 11100001 exibir

LOOPNZ/LOOPNE = Loop Enquanto Não 11100000 exibir


Zero/Igual

JCXZ = Saltar no CX Zero 11100011 exibir

INT = Interromper

Tipo especificado 11001101 modelo

Tipo 3 11001100

INTO = Interromper no Transbordo 11001110

IRET = Retorno Interrompido 11001111


(Contínuo )
Machine Translated by Google

598 APÊNDICE

Tabela 1 (Continuação)

Mnemônico e Descrição Código de instrução

CONTROLE DO PROCESSADOR 76543210 76543210

CLC = Limpar Transporte 11111000

CMC = Complemento Carry 11110101

STC = Definir transporte 11111001

CLD = Direção clara 11111100

STD = Definir direção 11111101

CLI = Limpar interrupção 11111010

STI = Definir interrupção 11111011

HLT = parar 11110100

ESPERAR = Esperar 10011011

ESC = Escape (para Dispositivo Externo) 11011 xxx mod xxx r/m

LOCK = Prefi x de Bloqueio de Barramento 11110000

NOTAS: se sw = 01 então 16 bits de dados imediatos do operando se sw = 11

AL = acumulador de 8 bits então um byte de dados imediato é estendido para from


o operando de 16 bits
AX = acumulador de 16 bits
se v = 0 então “count” = 1; se v = 1 então “contar” em (CL) x
CX = Registrador de
= não importa z é usado para primitivas de string para
contagem DS =
comparação com ZF FLAG
Segmento de dados ES
= Segmento extra Acima/abaixo refere-se ao PREFIXO DE SUBSTITUIÇÃO DE SEGMENTO
valor sem sinal Maior = mais positivo; Menos =
valores com sinal menos positivos (mais negativos) se d = 1 001 registro 110
então “to” reg; se d = 0 então “from” reg se w = 1 então REG é atribuído de acordo com a seguinte tabela:
palavra instrução; se w = 0 então instrução byte se mod = 11 então r/m é
tratado como um campo REG se mod = 00 então DISP = 0*, disp-low e 16 bits (W=1) 8 bits (W=0) Segmento
disp-high estão ausentes se mod = 01 então DISP = disp- sinal baixo 000 EIXO 000 AL 00 PT
estendido para 16 bits, disp high está ausente se mod = 10 então DISP = disp- 001 CX 001 CL 01 CS
high; disp-low se r/m = 000 então EA = (BX) + (SI) + DISP se r/m = 001
010 DX 010 DL 10 SS
então EA = (BX) + (DI) + DISP se r/m = 010 então EA = (BP ) + (SI) + DISP
se r/m = 011 então EA = (BP) + (DI) + DISP se r/m = 100 então EA = (SI) + 011 BX 011 BL 11 DS
DISP se r/m = 101 então EA = (DI ) + DISP se r/m = 110 então EA = (BP) + 100 SP 100 AH
DISP* se r/m = 111 então EA = (BX) + DISP DISP segue o 2º byte da instrução 101 BP 101 CH
(antes dos dados, se necessário) *exceto se mod = 00 e r/m = 110 então EA
110 SI 110 DH
= disp-high; disp-low.
111 DE 111BH

Instruções que referenciam o arquivo registrador flag como um objeto de


16 bits usam o símbolo FLAGS para representar o arquivo:
BANDEIRAS = X:X:X:X:(OF):(DF):(IF):(TF):(SF):(ZF):X:(AF):X:(PF):X:(CF )

Mnemônicos © Intel, 1978.


Machine Translated by Google

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:\

Documents and Settings\ admn > cd\


C:\ >

A unidade atual é a unidade C agora.


Para ir para outra unidade, diga digite 'D':
C:\ >D:
D:\ >

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.

Lista de alguns comandos importantes do DOS Alguns dos

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.

Ao digitar 'debug', um sublinhado é obtido no prompt. Modelo '?'.


A lista dos comandos debug são exibidas e são mostradas abaixo. (Essa lista pode ser obtida no próprio diretório C, pois é o
depurador nativo do x86. Ela também pode ser obtida em qualquer outro diretório.)

C:\ > depurar


-?

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.

i) O comando Desmontar 'u'

Formato: u

C:\masm6.14\BIN>debug tinym.com
-dentro

13C6:0100 B067 MOV AL,67


13C6:0102 B345 MOV BL,45
13C6:0104 02C3 ADICIONAR AL,BL
13C6:0106 8AD0 MOV DL,AL
13C6:0108 B44C MOV AH,4C
Machine Translated by Google

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.

ii) O comando Go 'g'


Formato: G [endereço inicial] endereço de interrupção
O endereço inicial é opcional. Normalmente, apenas o endereço de interrupção é necessário.

Para um arquivo com, o programa a ser executado começa na localização 0100.


Digitar g0100 causa a execução de instruções até aquele endereço.
Abaixo dela, a instrução MOV AL,67 está programada para ser executada.
O conteúdo de todos os registros naquele momento é mostrado.

-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

Agora para executar do endereço 0100 a 0106

-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

iii) O comando Trace 't'

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

AX = 0067 BX = 0000 CX = 000C DX = 0000 SP = FFFE BP = 0000 SI = 0000 DI = 0000


DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0102 NV UP EI PL NZ NA PO NC
13C6:0102 B345 MOV BL,45

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

AX = 0067 BX = 0045 CX = 000C DX = 0000 SP = FFFE BP = 0000 SI = 0000 DI = 0000


DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0104 NV UP EI PL NZ NA PO NC
13C6:0104 02C3 ADICIONAR AL,BL

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
Machine Translated by Google

602 APÊNDICE

iv) O comando de registro 'r'

Isso fornece o conteúdo dos registradores em um determinado momento.


-r

AX = 0067 BX = 0000 CX = 000C DX = 0000 SP = FFFE BP = 0000 SI = 0000 DI = 0000


DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0102 NV UP EI PL NZ NA PO NC
13C6:0102 B345 MOV BL,45

v) O comando de despejo ou exibição 'd'

Este comando exibe o conteúdo da porção de memória especificada.


Por padrão, o conteúdo do segmento de dados é exibido. Mas o conteúdo de outros segmentos pode ser exibido
especificando o endereço no formulário endereço base: off set

Os diferentes formatos do comando 'd' são os seguintes.

a) d endereço inicial [comprimento] .

É opcional especificar o comprimento. Se não for especificado, o conteúdo de locais de 128 bytes será exibido.

b) d endereço inicial endereço final

Exemplos
a)
-d0000

13C6:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 DA 0D 8A 03 .........O.....


13C6:0010 DA 0D 17 03 DA 0D C9 0D-01 01 01 00 02 FF FF FF 13C6:0020 FF FF ................
FF FF FF FF FF-FF FF FF FF 87 13 F1 49 .......... . ....EU
13C6:0030 DA 0D 14 00 18 00 C6 13-FF FF FF FF 00 00 00 00 ................
13C6:0040 05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........
13C6:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20 .....
13C6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
-

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 .

vi) O comando Montar 'a'

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

Os códigos de operação do programa estão agora na forma desmontada.


Ele pode ser executado usando os comandos 't' ou 'g'. O valor [0124] é um endereço no segmento de dados,
e o conteúdo deste local pode ser verificado após a execução do programa. vii) O comando Comparar 'c'

Este comando compara duas áreas na memória. O registro padrão é o registro DS.

Existem dois formatos para isso.

a) C início do endereço 'de' Comprimento da área de bytes início do endereço


'para' 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. -c0200 L24 0400

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.

Este formato para comparação dá o mesmo resultado que o formato anterior.


Em vez de especificar um comprimento de 24 localizações por L24, é mencionado o intervalo de endereços
de 0200 a 0224.

viii) O comando Enter 'e' Este

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.

ix) O comando de preenchimento 'f'

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.

Assim, existem dois formatos para este comando.

a) –f endereço inicial Dados de comprimento


-f 0110 L10 "HI"
Este comando faz com que os dados correspondentes a HI sejam replicados 10(H) vezes a partir do endereço
0110.

b) –f endereço inicial dados do endereço final


-f 0110 0120 "oi"
Neste caso, os dados 'hi' são armazenados em toda a gama de localizações de 0110 a 0120.
-f 0110 0120 "oi"
-d0110 0120
1381: 0110 68 69 68 69 68 69 68 69-68 69 68 69 68 69 68 69 ...sorriso
1381: 0120 68 ............................................. h
-

x) O comando Continuar 'p'


Este comando é útil para prosseguir através de várias instruções. Em programas onde há interrupções de
software, este comando vai direto sobre os comandos de interrupção e executa o número de instruções
mencionadas no programa. O formato do comando continuar é
prosseguir P [=endereço] [número]
Pode ser especificado o endereço até o qual a linha prosseguir ou o número de instruções a serem executadas
durante o processo. Veja o programa a seguir.

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

QUADRADO PROC PRÓXIMO

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.)

xi) Os comandos de pesquisa 's'

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.

a) s comprimento do endereço inicial 'dados'

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.

-s 0100 L24 'C'


1376:0110
1376:0116
1376:0118
O resultado da busca mostra que existem três locais em que o caractere 'C' está presente.

b) s início do endereço fim do endereço início ao endereço


Este é o segundo formato para o uso da instrução string.

xii) O comando Hex 'h'

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

xiii) O comando de entrada 'I'

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.

xiv) O comando de saída 'O'

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
-

Advanced DOS Commands


Os comandos load, name e write são comandos que precisam de uma compreensão muito boa e profunda do DOS
e, portanto, não serão discutidos aqui.

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.

Sinal de interrupção de direção de transbordamento Zero Aux.carry Carry de paridade


Definir OV DN NÃO DE ZR AC SOBRE CY

Limpar NV ACIMA OI PL NZ NA DEPOIS NC


Machine Translated by Google

apêndice C
conjunto de instruções e tempo de instrução de 8086

i) Conjunto de instruções 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.

Instruções de transferência de dados

Mnemônico Função Seção Mesa

MOV Move byte ou palavra para registro 3.2.1 3.1


ou memória
ENTRADA, SAÍDA Byte de entrada ou palavra da porta, 5.2 3.1
palavra de saída para a porta
ESTE Carregar endereço efetivo 3.2.2 3.1
— 3.1
SUD, LES Carregar ponteiro usando segmento de
dados, segmento extra

EMPURRAR, POP Empurre a palavra para a pilha, retire a 3.2.4 3.1


palavra da pilha

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

NÃO NOT lógico de byte ou palavra - 3,7


(complemento de um)
E E Lógico de byte ou palavra OR - 3,7

OU Lógico de byte ou palavra Lógico - 3,7

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

Instruções de deslocamento e rotação

Função mnemônica Tabela de Seções

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

ROL, ROR 3.6.2


Girar para a esquerda, direita, byte ou palavra por 1 ou CL Girar para a esquerda, 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

Função mnemônica Tabela de Seções

ADICIONAR
Adicionar byte ou 3.4.2 3.4

SUB palavra Subtrair byte ou 3.4.3 3.4

ADC palavra Adicionar byte ou palavra 3.4.2 3.4

SBB e carregar Subtrair byte ou palavra e carregar (emprestar) 3.4.3 3.4

INC Incrementar byte ou palavra 3.4.2 3.4

DEZ Decrementar byte ou palavra 3.4.3 3.4

NEG Negar byte ou palavra (complemento de dois) — 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

DIV Dividir byte ou palavra (sem sinal) 3.4.6 3.4

IMUL Inteiro multiplicar byte ou palavra (assinado) 4.7.2 3.4

IDIV Byte de divisão inteiro ou palavra (assinado) 4.7.2 3.4

CBW, CWD Converter byte em palavra, palavra em palavra dupla 4.7 3.4

AAA Ajuste ASCII para adição 4.5.1 3.4

AAS Ajuste ASCII para subtração 4.5.2 3.4

AAM Ajuste ASCII para multiplicação 4.5.3 3.4

AAD Ajuste ASCII para divisão 4.5.3 3.4

DAA, DA Ajuste decimal para adição, subtração (números


decimais codificados binários) 4.4.2 3.4

Instruções de salto e loop

Mnemônico Função Seção Mesa

JMP Salto incondicional 3.3.1 e 3.3.2 —


— 3.3
E (JNBE) Saltar se estiver acima (não abaixo ou igual)
— 3.3
JAE (JNB) Saltar se acima ou igual (não abaixo)
— 3.3
JB (JNAE) Saltar se estiver abaixo (não acima ou igual)
— 3.3
JBE (JNA) Saltar se estiver abaixo ou igual (não acima)
— 3.3
NPP (SW) Saltar se for igual (zero)
Machine Translated by Google

APÊNDICE C 609

Mnemônico Função Seção Mesa


— 4.2
JG (JNLE) Saltar se maior (não menor ou igual)
— 4.2
JGE (JNL) Saltar se maior ou igual (não menor)
— 4.2
JL (JNGE) Pule se for menor (não maior nem igual)
— 4.2
JLE (JNG) Saltar se for menor ou igual (não maior)
— 3.3
JC, JNC Saltar se carregar definido, carregar não definido
— 4.2
JO, JNO Pule se estouro, sem estouro
— 4.2
JS, JNS Pule se sinal, nenhum sinal
— 3.3
JNP (JPO) Saltar se não houver paridade (paridade ímpar)
— 3.3
JP (JP) Saltar se paridade (paridade par)
CICLO 3.3.3 —
Loop incondicional, contagem em CX
3.3.3 —
LOOPE (LOOPZ) Loop se igual (zero), conte em CX

LOOPNE (LOOPNZ) Loop se não for igual (não zero), contar em CX 3.3.3 Saltar se CX
JCXZ for igual a zero
— 3.3

Instruções de chamada e devolução

Função mnemônica Seção Mesa

LIGUE, RETIRE Chamada, retorno do procedimento 4.2.2 e 4.2.3 —

INT, INT Interrupção de software, interrupção se estouro 8.3 e 8.2.5 —


ele iria 8.1.1 —
Retorno da interrupção

Instruções de string

Mnemônico Função Seção Mesa

MOVS Mover byte ou string de palavras 4.1.1 4.1

CMPS Comparar byte ou string de palavras 4.1.2 4.1

SCAS Digitalizar byte ou string de palavras 4.1.3 4.1

LODS, STOS Carregar, armazenar byte ou string de palavras 4.1.4 4.1

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

Instruções de controle de processador e sinalizador

Mnemônico Função Seção Mesa

3.4.1 —
STC, CLC, CMC Set, transparente, complemento de transporte fl ag

DST, DST Definir, limpar a bandeira de direção — 4.1

STI, CLI
——

Definir, limpar interrupção habilitar

LAHF, SAHF sinalizador Carregar AH de sinalizadores, armazenar AH em sinalizadores — 3.1

(Contínuo )
Machine Translated by Google

610 APÊNDICE

Mnemônico Função Seção Mesa

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 —

ii) Tempo de Instrução de 8086


a) Número de ciclos gastos no cálculo do 'Endereço Efetivo'

Não. Modo de endereçamento Nº de relógios para


cálculo de EA

1 Direto 6

2 Registro indireto 5

3 Registrar parente 9

4 Baseado indexado com BP como base cadastral 8

5 Baseado indexado com BX como base cadastral 7

6 Base relativa indexada com BP como base cadastral 12


7 Base relativa indexada com BX como base cadastral 11

b) Número de ciclos de clock gastos para cada instrução de 8086

Código Descrição 8086

AAA Ajuste ASCII para adição 8


AAD Ajuste ASCII para divisão 60

AAM Ajuste ASCII para multiplicação 83


AAS Ajuste ASCII para subtração 8
ADC Adicionar com
carry reg a reg 3
mem a reg reg a 9+EA
mem immed a reg 16+EA
immed a mem 4
immed a acc 17+EA
4
ADICIONAR Adição
reg para 3
reg mem para 9+EA
reg reg para 16+EA
mem immed 4
para reg immed 17+EA
para mem immed para acc 4
E E Lógico
Machine Translated by Google

APÊNDICE C 611

Código Descrição 8086

reg para reg 3

mem para reg 9+EA

reg para mem 16+EA

immed para reg 4


immed para mem 17+EA
immed para acc 4
LIGAR Chamar um procedimento

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

reg para mem 9+EA

immed para reg 4


immed para mem 10+EA
immed para acc 4
CMPS/ Comparar string/
CMPSB/ Comparar cadeia de bytes/
CMPSW Comparar sequência de palavras

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

reg de 8 bits 15+EA


DIV Divisão não assinada
registro de 8 80–90

bits registro de 144–162


16 bits memória de (86–96)+EA
8 bits memória de 16 bits (150–168)+EA
ESC Escapar
registro
2
mem 8+EA
(Contínuo )
Machine Translated by Google

612 APÊNDICE

Código Descrição 8086

HLT Parar 2
IDIV Divisão inteira
registro de 8 101–112

bits registro de 165–184


16 bits memória de (107–118)+EA
8 bits memória de 16 bits (171–190)+EA
IMUL Multiplicação de inteiros
registro de 8 80–98

bits registro de 128–154


16 bits memória de (86–104)+EA
8 bits memória de 16 bits (134–160)+EA
DENTRO
Entrada da porta de E/S
Porta fixa 10

Porta variável através de DX 8


INC Incrementar em 1
registro de 16 bits 3

registro de 8 bits 3
mem 15+EA
INT Interromper
tipo=3 52

tipo3 51
EM Interromper se transbordar
interrupção tomada 53

interrupção não tomada 4


ele iria Retorno da interrupção 32
E/ Pule se estiver acima / 16, pegue 4
JNBE Saltar se não for inferior ou igual
JAE / Saltar se acima ou igual 16, pegue 4
JNB Pule se não estiver abaixo/
JNA Pule se não estiver acima
JCXZ Pule se CX for Zero 18, pegue 6
É/ Saltar se for igual / 16, pegue 4
JZ Pule se for zero
JG/ Pule se for maior 16, pegue 4
JNLE Pule se não for menor ou igual
JGE/ Saltar se maior ou igual / 16, pegue 4
JNL Pule se não menos
JL / Pule se menos/ 16, pegue 4
JNGE Saltar se não for maior ou igual
JLE/ Saltar se menor ou igual / 16, pegue 4
fã Pule se não for maior
JMP Pular
intrasegmento direto curto 15

intrasegmento direto intersegmento 15

direto 15
Machine Translated by Google

APÊNDICE C 613

Código Descrição 8086

intrasegmento indireto
através da memória 18+EA

intrasegmento indireta
por meio de cadastro 11

intrasegmento indireto 24+EA

ETC/ Saltar se não for igual / 16, pegue 4


JNZ Pule se não for Zero
JNO Saltar se não transbordar 16, pegue 4
JNP/ Saltar se não houver paridade/ 16, pegue 4
JPO Saltar se a paridade for ímpar
JNS Pule se não assinar 16, pegue 4
JO Saltar se transbordar 16, pegue 4
JP/ Saltar se paridade/ 16, pegue 4
JPE Saltar se a paridade for igual
JS Saltar se assinar 16, pegue 4
LAHF Carregar AH de sinalizadores 4
SUD Carregar ponteiro usando DS/
A Carregar ponteiro usando ES 16+EA
ESTE Carregar endereço efetivo 2+EA
TRANCAR Bloquear ônibus 2

PILOTO/ Carregar sequência/


LODSB Carregar cadeia de bytes
LODSW Carregar sequência de palavras

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

reg para reg 2

mem para reg 8+EA

reg para mem 9+EA

immed para reg 4


immed para mem reg 10+EA

para SS/DS/ES mem 2

para SS /DS /ES 8+EA

segmento reg para reg 2

segmento reg para mem 9+EA

MOVS/ Mover string /


MOVSB/ Mover cadeia de bytes/
MOVSW Mover cadeia de palavras
(Contínuo )
Machine Translated by Google

614 APÊNDICE

Código Descrição 8086

Não repetido 18
REP MOVS/MOVSB/MOVSW 9+17/repetição
EU TENHO
Multiplicação sem sinal
registro de 8 70–77

bits registro de 118–133


16 bits memória de (76–83)+EA
8 bits memória de 16 bits (124–139)+EA
NEG Negar
registro
3
mem 16+EA
NOP Nenhuma operação 3
NÃO NÃO Lógico
registro
3
mem 16+EA
OU OU lógico
reg para reg 3

mem para reg 9+EA

reg para mem 16+EA


immed para acc 4

immed para reg 4


immed para mem 17+EA
FORA Saída para porta de E/S
porta variável 10

de porta fixa 8
POP Pop palavra fora da pilha
8

memória de registro 8

de segmento reg 17+EA


POPF Pop fl ags fora da pilha 8
EMPURRE Empurre a palavra para a pilha
11

segmento reg memória reg:ES/ 10

SS/CS 16+EA
PUSH Empurre a bandeira dupla para a pilha 10
RCL Gire para a esquerda através do transporte /

Gire para a direita através do transporte /

reg com deslocamento único 2

reg com deslocamento variável 8+4/bit

mem com deslocamento único 15+EA


mem com deslocamento variável 20+EA+4 / bt
CERTO Retorno do procedimento /
REFERÊNCIA Voltar para longe /

RETENTAR Retorno próximo

intrasegmento 16

intrasegmento com constante 20

intrasegmento 26
Machine Translated by Google

APÊNDICE C 615

Código Descrição 8086

intrasegmento com constante 25

FUNÇÃO/ Vire à esquerda

ROR Vire à direita


reg com deslocamento único 2

reg com deslocamento variável 8+4/bit

mem com deslocamento único 15+EA


mem com deslocamento variável 20+EA+4/bit
SAHF Armazenar AH em sinalizadores 4

DEVE/ Deslocar aritmética para a esquerda /

SAR / Deslocar aritmética para a direita /


SHL/ Deslocar lógico para a esquerda /

SHR Deslocar para a direita lógica

reg com deslocamento único 2

reg com deslocamento variável 8+4/bit

mem com deslocamento único 15+EA


mem com deslocamento variável 20+EA+4/bit
SBB Subtrair com empréstimo

reg de reg mem 3

de reg reg de mem 9+EA

immed de acc immed 16+EA


de reg immed de mem 4
4
17+EA

SCAS/ Cadeia de varredura /


SCASB Cadeia de bytes de varredura

SCASW Escanear sequência de palavras

não repetido 15

REPE /REPNE SCAS /SCASB /SCASW 9+15/repetição


STC Definir bandeira de transporte
2

DST Definir sinalizador de direção 2

DST Definir sinalizador de interrupção 2

PILHA/ Armazenar string /


STOSB/ Armazenar string de bytes /
STOSW Armazenar string de palavras

Não repetido 11

REPRESENTANTE STOS/STOSB/STOSW 9+10/repetição


STR Armazenar registro de tarefas
SUB Subtração
reg de reg mem 3

de reg reg de mem 9+EA

immed de acc immed 16+EA


de reg immed de mem 4
4
17+EA

TESTE Teste

reg com reg 3


(Contínuo )
Machine Translated by Google

616 APÊNDICE

Código Descrição 8086

mem com reg 9+EA


immed com acc 4
immed com reg 5
immed com mem 11+EA
ESPERAR Aguarde enquanto o pino de TESTE

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.

i) Lista de serviços importantes do DOS INT 21H

As chamadas do sistema DOS usam o vetor 21H. Alguns dos serviços importantes da INT 21H estão listados aqui.

Função Nº Ação Devoluções/Esperas

AH = 01 Leia o caractere do dispositivo de entrada Devoluções:


padrão com eco AL = ASCII da chave de entrada
AH = 02 Gravar caractere no dispositivo de saída Espera:
padrão DL = código ASCII de dados de saída
AH = 05 Gravar caractere na impressora Espera:
DL = ASCII da saída
AH = 08 Leia a entrada de caracteres do dispositivo Devoluções:

de entrada padrão, sem eco AL = ASCII da chave de entrada


AH = 09 Sequência de exibição Espera:
DS:DX = segmento: off set de string,
terminado por '$'
AH = 0AH Saída de string com buffer Espera:
DS:DX = segmento: off set de buffer
AH = 25H Definir vetor de interrupção Espera:
AL = número de interrupção da máquina
DS:DX = segmento fora do conjunto da rotina de
serviço de interrupção

AH = 2AH Obter data do sistema DOS Devoluções:

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

Função Nº Ação Devoluções/Esperas

AH = 2DH Definir hora do sistema DOS Espera:


CH = Hora (0 a 23)
CL = Minutos (0 a 59)
DH = segundos (0 a 59)
DL = centésimo de segundos (0 a 99)
AH = 30H Obter o número da versão do DOS Devoluções:

AL = Número da versão principal


(DOS 6.2 = 6 etc )
AH = número da versão secundária
(DOS 6.2 = 2 etc)
AH = 31H Terminar e permanecer residente (TSR) Espera:
AL = código de retorno

DX = número de parágrafos a tornar residente


na memória
AH = 35H Obter vetor de interrupção Espera:
AH = 35H

AL = número do tipo de interrupção


Retorna:

ES:BX da rotina de serviço de interrupção


AH = 4CH Terminar com código de retorno Espera:
AL = código de retorno

ii) Funções do BIOS 10H para vídeo 1. INT

10H, Função 00: Definir modo de vídeo

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.

2. INT 10H, Função 01: Definir Forma do Cursor

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).

3. INT 10H, Função 02: Definir Posição do Cursor

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).

4. INT 10H, Função 03: Ler Posição do Cursor

Espera: AH = 03
BH = página de vídeo

Retorna: DH = linha atual (coordenada y)


DL = coluna atual (coordenada x)
CH = linha inicial do cursor
CL = linha final para cursor

Descrição: A função 03 é utilizada para ler a posição atual do cursor no display em coordenadas de texto.

5. INT 10H, Função 04: Ler a posição da caneta de luz Espera: AH =

04 Retorna: AH = 0 se a caneta de luz não estiver inativa ou não

acionada 1 se a caneta de luz estiver inativa ou acionada CH = linha de


pixel (coordenada y no modo gráfico 04-06 )

CX = linha de pixel (coordenada y no modo gráfico 0DH-13H)


BX = coluna de pixel (coordenada x no modo gráfico)
DH = linha de caracteres (coordenada y 0-24 no modo texto)
DL = coluna de caracteres (coordenada x 0-79 ou 0-39 no modo texto)

Descrição: A função 04 é utilizada para ler o estado atual e a posição da caneta de luz.

6. INT 10H, Função 05: Definir expectativa de página de vídeo

ativa : AH = 05 AL = número da página

Retornos: Nenhum para PC padrão

Descrição: A função 05 é utilizada para selecionar a página de exibição ativa para a exibição do vídeo.

7. INT 10H, Função 06 : Scroll (Initialize) Rectangle Window Up Espera: AH = 06 AL =

Número de linhas para rolar para cima (se AL = Zero, toda a janela é limpa ou em branco)

BH = atributos de área em branco

CH = coordenada y, canto superior esquerdo da janela


CL = coordenada x, canto superior esquerdo da janela
DH = coordenada y, canto inferior direito da janela
DL = coordenada x, canto inferior direito da janela

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)

BH = atributos de área em branco

CH = coordenada y, canto superior esquerdo da janela


CL = coordenada x, canto superior esquerdo da janela
DH = coordenada y, canto inferior direito da janela
DL = coordenada x, canto inferior direito da janela

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.

9. INT 10H, Função 08: Ler Caractere e Atributo no Cursor

Espera: AH = 08
BH = página de vídeo (em CGA, deve ser 0 no modo gráfico)

Retorna: AH = atributo byte


AL = código de caractere ASCII

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.

10. INT 10H, Função 09: Escrever Caractere e Atributo no Cursor

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

AL = código de caractere ASCII BH = página de vídeo BL = cor (modo gráfico)

CX = contagem de caracteres para escrever (fator de replicação)


Machine Translated by Google

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.

12. INT 10H, Função 0BH: Definir paleta de cores

Espera: AH = 0BH
No modo de texto
BH = 00 seleciona a cor da borda

BL = cor da borda (0-1FH: 10H a 1FH para alta intensidade)


No modo gráfico
BH = 01 selecionar combinação de paleta
BL = 0 para selecionar a combinação Vermelho Verde Azul

BL = 1 para selecionar a combinação Cyan Magenta White

Devoluções: Nenhuma

Descrição: A função 0BH é utilizada para definir o conteúdo de uma paleta de cores.

13. INT 10H, Função 0CH: Definir Pixel

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.

14. INT 10H, Função 0DH : Obter Pixel Espera: AH =

0DH BH = página de vídeo CX = número da coluna ( x


coordenada )

DX = número da linha ( coordenada y )

Retorna: AL = valor do pixel (atributo-cor do pixel)

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

AL = código de caractere ASCII


Machine Translated by Google

622 APÊNDICE

BH = página de vídeo (em modo texto)


BL = cor de primeiro plano (no modo gráfico)

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.

16. INT 10H, Função 0FH: Obter Modo de Vídeo

Espera: AH = 0FH

Retorna: AH = número de colunas de caracteres na tela

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.

17. INT 10H, Função 10H : Definir os Registros da Paleta de Cores

Esperados: AH = 10H

AL = 00 para configurar o registro da paleta


01 para configurar o registro de cor da borda
02 para configurar todos os registros de paleta e registro de borda
03 para alternar o piscar ou bit de intensidade (somente no EGA)
BH = valor da cor

BL = registro de paleta a ser definido (00 a 02) se AL = 00


piscar/bit de intensidade AL = 03 0 habilitar intensidade
1 habilitar piscar

ES:DX = segmento:off set da lista de cores (se AL = 02)

Devoluções: Nenhuma

Descrição: A função 10H é utilizada para configurar o registro da paleta para a nova combinação de cores.

18. INT 10H, Função 13H: String de exibição esperada: AH

= 13H AL = modo de gravação 0 atributo de uso na posição


do cursor BL não é atualizado após a gravação

1 atributo de uso na posição do cursor BL é atualizado após a gravação 2 formato


de string: char, attr, …, char, attr A posição do cursor não é atualizada após a
gravação Formato de 3 strings: char, attr, …, char, attr A posição do cursor é atualizada após a gravação
BH = página de vídeo BL = atributo (modos de gravação 0 e 1)

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.

19. INT 10H, Função 0FEH: Obter ponteiro de buffer de vídeo

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

Retorna: ES:DI segment:off et do buffer de vídeo real para o processo atual

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.

20. INT 10H, Função 0FFH: Atualizar buffer de vídeo

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.

iii) Funções do BIOS 16H para controle do teclado

Aqui são apresentadas algumas interrupções do BIOS para controle do teclado.


Algumas das primeiras funções do BIOS atendiam apenas ao antigo teclado de 83 teclas. Mais tarde, mais algumas funções
do BIOS foram adicionadas ao teclado aprimorado. i) AH = 0 ou AH = 10H. O primeiro número de função é para o teclado

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

reg = registrador de ponto flutuante, st(0), st(1) ... st(7)


mem = endereço de memória
mem32 = endereço de memória do item de 32 bits
mem64 = endereço de memória do item de 64 bits
mem80 = endereço de memória do item de 80 bits

Tempos de Instrução da FPU

FX = pares com FXCH


NP = sem emparelhamento
Os tempos com um hífen indicam um intervalo de tempos possíveis
Os tempos com uma barra (salvo indicação em contrário) são a latência e a taxa de transferência.

A latência é o tempo entre as instruções dependente do resultado.

A taxa de transferência é a taxa de transferência do pipeline entre instruções não conflitantes.

EA = ciclos para calcular o endereço efetivo

Dimensionamento de Instrução de FPU

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)

Formatos de instruções, ciclos de relógio e informações de emparelhamento do Pentium®

F2XM1 Calcular 2x –1
8087 287 387 486 Pentium
310–630 310–630 211–476 140–279 13-57 NP

FABS Valor absoluto


8087 287 387 486 Pentium
10–17 10–17 22 3 1 câmbio
Machine Translated by Google

626 APÊNDICE

FADD Adicionar ponto flutuante


FADDP Floating point add and pop

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

FBLD Carregar BCD

operando 8087 287 387 486 Pentium


mem (290–310)+EA 290–310 266–275 70–103 48-58 NP

FBSTP Armazenar BCD e pop

8087 287 387 486 Pentium


(520–540)+EA 520–540 512-534 172–176 148-154 NP

Sinal de mudança FCHS

8087 287 387 486 Pentium


10–17 10–17 24-25 6 1 câmbio

FCLEX Limpar exceções


FNCLEX Limpar exceções, sem espera

variações 8087 287 387 486 Pentium


fclex 2–8 2–8 11 7 9 NP
fnclex 2–8 2–8 11 7 9 NP

A versão de espera pode levar ciclos adicionais

FCOM Comparação de ponto flutuante


FCOMP Comparação de ponto flutuante e pop
FCOMPP Comparação de ponto flutuante e pop duas vezes

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

FCOS Cosseno de ponto flutuante (387+)

8087 287 387 Pentium 486


– – 123–772 18–124 NP 257–354
Ciclos adicionais necessários se operando > pi/4 (~3.141/4 = ~.785)
Machine Translated by Google

APÊNDICE E 627

FDECSTP Decrementa ponteiro de pilha de ponto flutuante

8087 287 387 486 Pentium


6–12 6–12 22 3 1 NP

Confie em mim Desabilitar interrupções (somente 8087, outros fazem fnop)


FNDISI Desabilita interrupções, sem espera (somente 8087, outros fazem fnop)

Variações fdisi fndisi 8087 287 387 486 Pentium


2–8 22 22 33 1 NP
2–8 1 NP

A versão de espera pode levar ciclos adicionais

FDIV Divisão flutuante


FDIVP Floating divide and pop

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

FDIVR Divisão flutuante invertida


FDIVRP Floating divide invertido e pop

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

FENI Habilitar interrupções (somente 8087, outros fazem fnop)


FNENI Habilita interrupções, agora espera (somente 8087, outros fazem fnop)

variações 8087 287 387 486 Pentium


feni 2–8 2 2 3 1 NP
que? 2–8 2 2 3 1 NP

FFREE Cadastro Gratuito

8087 287 387 486 Pentium


9–16 9–16 18 3 1 NP

FIADD Inteiro adicionar

operando 8087 287 387 486 Pentium


mem16 (102–137)+EA 102–137 71–85 20–35 7/4 7/4 POR EXEMPLO

mem32 (108–143)+EA 108–143 57–72 19–32 POR EXEMPLO


Machine Translated by Google

628 APÊNDICE

FICOM Comparação de inteiros


FICOMP Integer compara e pop

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

ficomp mem32 (80–93)+EA 80–93 71–75 16–20 8/4 POR EXEMPLO

56–63 15–17 8/4 POR EXEMPLO

FIDIV Divisão inteira


FIDIVR Divisão inteira revertida

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

FILD Carregar inteiro

operando 8087 287 387 486 Pentium


mem16 (46–54)+EA 46–54 61–65 13–16 1/3 POR EXEMPLO

mem32 (52–60)+EA 52–60 45–52 9–12 1/3 POR EXEMPLO

mem64 (60–68)+EA 60–68 56–67 10-18 1/3 POR EXEMPLO

FIMUL Multiplicar inteiros

operando 8087 287 387 486 Pentium


mem16 (124–138)+EA 124–138 76–87 23–27 04/07 POR EXEMPLO

mem32 (130–144)+EA 130–144 61–82 22–24 04/07 POR EXEMPLO

Ponteiro de pilha de ponto flutuante de incremento FINCSTP


8087 287 387 486 Pentium
6–12 6–12 21 3 1 NP

FIM Inicializar processador de ponto flutuante


FNINIT Inicializa o processador de ponto flutuante, sem espera
variações 8087 287 387 486 Pentium
termina 2–8 2–8 33 17 16 NP
finito 2–8 2–8 33 17 12 Por exemplo

A versão de espera pode levar ciclos adicionais

PUNHO Armazenar inteiro


FISTP Armazenar inteiro e pop

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

punho mem32 (82–92)+EA 82–92 79–93 28–34 6 NP


punho mem16 (82–92)+EA 82–92 82–95 29–34 6 NP
punho mem32 (84–94)+EA 84–94 79–93 28–34 6 NP
punho mem64 (94–105)+EA 94–105 80–97 28–34 6 NP

FISUB Subtração inteira


Subtração de inteiro FISUBR revertida

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

143 57–82 19–32 7/4 POR EXEMPLO

Carga de ponto flutuante FLD

operando 8087 287 387 486 Pentium


reg mem32 17–22 17–22 14 4 1 câmbio
(38–56)+EA 38–56 20 3 1 câmbio
mem64 (40–60)+EA 40-60 25 3 1 câmbio
mem80 (53–65)+EA 53-65 44 6 3 NP

Carregar constantes de ponto flutuante

FLDZ Carregar constante na pilha, 0,0


FLD1 Carregar constante na pilha, 1.0
FLDL2E Carregar constante na pilha, base logarítmica 2 (e)
FLDL2T Carregar constante na pilha, base logarítmica 2 (10)
FLDLG2 Carregar constante na pilha, base logarítmica 10 (2)
FLDLN2 Carregar constante na pilha, logaritmo natural (2)
FLDPI Carregar constante na pilha, pi (3,14159...)

Variações 8087 287 387 486 Pentium


fldz 11-17 11-17 20 4 2 por exemplo

fld1 15-21 15-21 24 4 2 por exemplo

fldl2e 15-21 15-21 40 8 5/3 NP


fldl2t 16-22 16-22 40 8 5/3 NP
fldlg2 18-24 18-24 41 8 5/3 NP
fldln2 17-23 17-23 41 8 5/3 NP
fldpi 16-22 16-22 40 8 5/3 NP

Palavra de controle de carga FLDCW

operando 8087 287 387 486 Pentium


mem16 (7-14)+EA 7-14 19 4 7 NP

FLDENV Carregar estado do ambiente

operando 8087 287 387 486 Pentium


mem (35-45)+EA 35-45 71 44/34 37 / 32-33 NP

ciclos para modo real/modo protegido


Machine Translated by Google

630 APÊNDICE

FMUL Multiplicação de ponto flutuante


FMULP Ponto flutuante multiplicar e pop

variações/
operando 8087 287 387 486 Pentium

fmul reg s fmul reg 90-105 90-105 29-52 16 1/3 FX

fmul mem32 130-145 130-145 46-57 16 1/3 FX


(110-125)+EA 110-125 27-35 11 3/1 FX
fmul mem64 (154-168)+EA 154-168 32-57 14 3/1 29-52 16 3/1 134-148 29-57 16 3/1 FX

fmulp reg s fmulp reg 94-108 94-108 FX


134-148 FX

s = registrador com 40 zeros à direita em fração

FNOP sem operação

8087 287 387 486 Pentium


10-16 10-16 12 3 1 NP

FPATAN arco tangente parcial

8087 287 387 486 Pentium


250-800 250-800 314-487 218-303 17-173

FPREM Restante parcial

FPREM1 Restante parcial (compatível com IEEE, 387+)

variações 8087 287 387 486 Pentium

fprem 15-190 15-190 74-155 70-138 16-64 NP


– – 95-185 72-167 20-70 NP
fprem1

FPTAN Tangente parcial

8087 287 387 486 Pentium


30-540 30-540 191-497 200-273 17-173 NP

Ciclos adicionais necessários se operando > pi/4 (~3.141/4 =~.785)

FRNDINT Arredondar para inteiro

8087 287 387 486 Pentium


16-50 16-50 66-80 21-30 9-20 NP

FRSTOR Restaurar estado salvo


variações/
operando 8087 287 387 486 Pentium
frstor mem (197-207)+EA 197-207 308 131/120 75-95/70 NP
primeiro dia – –
308 131/120 75-95 / 70 NP
primeiro mem – –
308 131/120 75-95 / 70 NP

ciclos para modo real/modo protegido

Salvar estado da FPU


Machine Translated by Google

APÊNDICE E 631

FSAVE Salvar estado da FPU


FSAVEW Salvar estado da FPU, formato de 16 bits (387+)
FSAVED Salvar estado da FPU, formato de 32 bits (387+)
FSAVE Salva o estado da FPU, sem espera
FSAVEW Salvar estado da FPU, sem espera, formato de 16 bits (387+)
FSAVED Salva o estado da FPU, sem espera, formato de 32 bits (387+)

variações 8087 287 387 486 Pentium


aldeias (197-207)+EA 197-207 375-376 154/143 127-151/124 NP
eles salvaram 375-376 154/143 127-151 / 124 NP
salvo 375-376 154/143 127-151 / 124 NP
fnsave (197-207)+EA 197-207 375-376 154/143 127-151/124 NP
fnsavew 375-376 154/143 127-151 / 124 NP
salvo 375-376 154/143 127-151 / 124 NP

Ciclos para modo real/modo protegido


A versão de espera pode levar ciclos adicionais

Escala FSCALE por fator de 2

8087 287 387 486 Pentium


32-38 32-38 67-86 30-32 20-31 NP

FSETPM Definir modo protegido (somente 287, 387+ = fnop)

8087 287 387 486 Pentium


– 2-8 12 3 1 NP

FSIN Seno (387+)


FSINCOS Seno e cosseno (387+)

Variações 8087 287 387 486 Pentium


Fsin – – 122-771 257-354 16-126 NP
Fsincos – – 194-809 292-365 17-137 NP

Ciclos adicionais necessários se operando > pi/4 (~3.141/4 = ~.785)

Raiz quadrada FSQRT

8087 287 387 486 Pentium


180-186 180-186 122-129 83-87 70 NP

FST Loja de ponto flutuante


Armazenamento e pop de ponto flutuante FSTP

variações/
operando fst 8087 287 387 486 Pentium

reg fst mem32 15-22 15-22 11 3 1 NP


(84-90)+EA 84-90 44 7 2 por exemplo

fst mem64 (96-104)+EA 96-104 45 8 2 por exemplo

registro fstp 17-24 17-24 12 3 1 NP


Machine Translated by Google

632 APÊNDICE

fstp mem32 fstp (86-92)+EA 86-92 44 7 2 por exemplo

mem64 fstp (98-106)+EA 98-106 45 8 2 por exemplo

mem80 (52-58)+EA 52-58 53 6 3 NP

FSTCW Armazenar palavra de controle


FNSTCW Armazenar palavra de controle, sem espera

variações/
operando 8087 287 387 486 Pentium
fstcw mem 12-18 12-18 15 3 2 por exemplo

fnstcw mem 12-18 12-18 15 3 2 por exemplo

A versão de espera pode levar ciclos adicionais

Armazenar ambiente FPU


FSTENV Armazenar ambiente FPU
FSTENVW Armazenar ambiente FPU, formato de 16 bits (387+)
FSTENVD Armazenar ambiente FPU, formato de 32 bits (387+)
FNSTENV Armazene o ambiente FPU, sem espera
FNSTENVW Armazenar ambiente FPU, sem espera, formato de 16 bits (387+)
FNSTENVD Armazenar ambiente FPU, sem espera, formato de 32 bits (387+)

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

Ciclos para modo real/modo protegido


A versão de espera pode levar ciclos adicionais

FSTSW Palavra de estado da loja


FNSTSW Armazenar palavra de status, sem espera

variações/
operando 8087 287 387 486 Pentium
fstsw mem 12–18 12-18 15 3 2 por exemplo

machado fstsw – 10–16 13 3 2 por exemplo

fnstsw mem 12–18 12-18 15 3 2 por exemplo

machado fnstsw – 10-16 13 3 2 por exemplo

A versão de espera pode levar ciclos adicionais


Machine Translated by Google

APÊNDICE E 633

FSUB Subtração de ponto flutuante


FSUBP Subtração e pop de ponto flutuante

variações/
operando 8087 287 387 486 Pentium

fsub reg fsub 70-100 70-100 26-37 8-20 3/1 FX


mem32 (90-120)+EA 90-120 24-32 8-20 3/1 FX
fsub mem64 (95-125)+EA 95-125 28-36 8-20 3/1 75-105 26-34 8-20 3/1 FX

fsubp reg 75-105 FX

FSUBr Subtração de ponto flutuante


FSUBR Subtração e pop de ponto flutuante

variações/
operando 8087 287 387 486 Pentium

fusbr reg 70-100 70-100 26-37 8-20 3/1 FX


fusbr mem32 (90-120)+EA 90-120 24-32 8-20 3/1 FX
fusbr mem64 (95-125)+EA 95-125 28-36 8-20 3/1 FX
registro fsubrp 75-105 75-105 26-34 8-20 3/1 FX

Teste de ponto flutuante FTST para zero

8087 287 387 486 Pentium


38-48 38-48 28 4 01/04 FX

FUCOM Comparação de ponto flutuante não ordenado (387+)


FUCOMP Comparação e pop de ponto flutuante não ordenados (387+)
FUCOMPP Comparação de ponto flutuante não ordenado e pop duas vezes (387+)

Variações 8087 287 387 486 Pentium


Fucom – – 24 4 FX
01/04
– – 26 4 FX
Fucomp 01/04
– – 26 5 FX
Fucompp 01/04

FWAIT Espera enquanto o FPU está em execução

8087 287 387 486 Pentium


4 3 6 1-3 1-3 NP

FXAM Examine os sinalizadores de condição

8087 287 387 486 Pentium


12-23 12-23 30-38 8 21 NP
Machine Translated by Google

634 APÊNDICE

Registradores de ponto flutuante FXCH Exchange


8087 287 387 486 Pentium
10-15 10-15 18 4 0-1 *

* FCXH é emparelhado no tubo V com todas as instruções emparelháveis de FX

FXTRACT Extrair expoente e significando


8087 287 387 486 Pentium
27-55 27-55 70-76 16-20 13 NP

FIL2X Calcular Y * log2(x)


FYL2XP1 Calcular Y * log2(x+1)
variações fyl2x 8087 287 387 486 Pentium
fyl2xp1 900-1100 900-1100 120-538 196-329 22-111 NP
700-1000 700-1000 257-547 171-326 22-103 NP
Machine Translated by Google

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 microprocessador HMOS de 16 bits 8086/8086-2/8086-1, setembro de 1990.

Manual Intel para temporizador de intervalo programável 8253/8254, novembro de 1986.

Manual da Intel para o controlador de interrupção programável 8259A, dezembro de 1988.

Manual Intel para interface de exibição do teclado 8279A, setembro de 1987.

Manual Intel para Interface de Comunicação Programável 8251A, novembro de 1988.

Manual de referência do programador Intel 80386, 1986.

Manual da Intel para a família de microprocessadores 80486, dezembro de 1992.

Manual Intel para Processador Pentium em icomP“ Índice 610\75 MHz, junho de 1997.

Manual da Intel para a interface programável CHMOS 82C55A, outubro de 1995.

Manual Intel para coprocessador matemático 8087, outubro de 1989.

Manual Intersil para 8289 Bus Arbiter, março 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

636 O MICROPROCESSADOR 8086

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.

http://pt. wikilivros. org/wiki/X86_Assembly/Print_Version, acessado em dezembro de 2008.


http://msdn. Microsoft. com/en-us/library/c9tff 918(VS. 80). aspx., acessado em janeiro de 2009.
http://webster. cs. ucr. edu/Page_TechDocs/MASMDoc/ProgrammersGuide/Appendix _A.htm, acessado em
novembro de 2008.

http://www. além da lógica. org/serial/serial. htm, acessado em abril de 2009.


http://www. etc. umass. edu/ece/koren/architecture/Cache/tutorial. html, acessado em abril de 2009.
http://www. cs. iastate. edu/~prabhu/Tutorial/CACHE/bl_place. html, acessado em abril de 2009.
http://www. redes leigas. com/Direct%20Mapped%20Cache. htm, acessado em abril de 2009.
http://arstechnica. com/paedia/r/ram_guide/ram_guide. parte 1-1. html, acessado em julho de 2009.
http://www. guia de karbos. com/books/pcarchitecture/start. htm, acessado em agosto de 2009.
http://www. pcguia. com/, acessado em agosto de 2009.
Machine Translated by Google

índice

4004, 1 configuração de pinos, 292, 303-04 ordem crescente, 153


64 bits, 3 8259, 349, 377-81, 383-85, 389-94 ASCII, 19–20, 39
barramento de dados, 2–3, 6–7, 9–10, diagrama de blocos, 350–51, 353, 363, 368, adição, 10, 17, 22-5, 27-30, 36-7, 39
32, 42–45 373, 378–79, 404–05, 419–22
8008, 1–2 código, 10, 11, 17–20, 34–5
80186, 487–88, 492–96, 501 recursos, 349, 363, 377, 385, 389 usando o, divisão, 15, 37
80188, 487 363–64, 367, 381, 389 multiplicação, 10, 37–8
80286, 2–4, 503–05, 514, 518, 524, 540 8279, 349, 363-66, 368-69, 371 subtração, 10, 25–8, 29, 40
montador, 11
80386SX, 504 montadores, 71–4, 86
80386, 503–05, 507–08, 510–16, 524–28, características de, 72, 84
530–31, 535, 538–42 UMA para x86, 71, 73
aprimoramentos, 503-06, 513 macro, 72, 74, 76
recursos de hardware, 505, 510, 528, 535 Porta gráfica acelerada (AGP), 562, 565 MASM, 73-9, 84-6
TASM, 73-4
arquitetura interna, 505 tempo de acesso, 431–33, 437–38, 440, 446 duas passagens, 73
interrupções de, 538 acumulador, 31–2, 35–7, 46 erro de montagem, 79
níveis de privilégio de, 530 sinal baixo ativo, 226 linguagem assembly, 71–4, 76, 78–9, 81, 83, 85–6
aprimoramentos de programação, 503, 506 ADICIONAR, 10, 17, 19, 21, 23, 30, 35–9
barramento de endereço, 2, 6–7, 9–10, 32, 42–5 regras gerais para escrever, 85
operações de modo real, 513 endereço, 51–2, 55, 58–66 processo, 71–4, 76, 86
80486, 3-4, 6, 545-46, 548-49, 552, 555 base, 55, 58-62, 65-7 ferramentas de desenvolvimento de programas, 71, 86
filial, 58 onda quadrada assimétrica, 499
recursos aprimorados de, 545 eficaz, 61, 64, 66-7 leitura assíncrona, 438
8080, 1–2 lógico, 59-64 ATA, 561, 563, 565–66, 573–75, 580
microprocessador 8085, 1, 31 físico, 58-9, 62, 64
relógio, 1, 5-6, 8-9, 12, 31, 42-4 endereçamento, 2, 34–7, 39, 51, 55, 61, 63–67
aspectos de hardware de, 41
fonte de alimentação, 43 base indexada, 66–7 B
modelo de programação, 1, 31–2 direto, 10–2, 35, 46, 148–49, 160, 166, 173,
leitura e gravação, 8, 43 443, 447–50 referências para trás, 73
pinos de reset e pronto, 43 porta fixa, 181 sistema básico de entrada e saída, 97
8086, 51–5, 58, 60–1, 63 imediato, 35-7 taxa de transmissão, 397–98, 405–06, 408, 410,
em uma configuração de coprocessador, indireto, 35-7, 39, 148-49 412
455, 458, 461 modos, 34-5 Números BCD, 17–8, 23, 25
diagrama de blocos interno de, 51-3 registrar, 6, 10-11, 32, 34-6, 39, 489-90, viés, 473-74, 476
conjunto de registros de, 52 492-501 Diretório BIN, 74–5
8086 e 8089, 462 base relativa indexada, 66-7 números binários, 13, 17–8, 22, 25
sistema baseado em 8086, 380 registrar indireto, 64–5 adição, 17, 22-5, 27-30
sequência de interrupção para, 380 registro relativo, 66-7 fracionário, 13-4
8087, 455, 458-61, 463-64, 471-72, 477-79, 481-82 porta variável, 181 BIOS 10H, 259, 264–65, 267
MAS, 257 funções, 258–59, 264–65, 267, 272, 274–
características de, 461, 472, 477, 561, Alienware, 584 78, 280, 283
568, 570, 572 GO, 7, 31–2, 219 BIOS INT 09, 274
registros de, 478 AMD, 2, 3 Modo de reinicialização do conjunto de bits, 300

8088, 503 AppleMac, 5 BIU, 219


8253/8254, 349–350 arquitetura, 1–2, 5, 11–2 comando de apagamento, 363
8255, 291-99, 340, 308-10, 313, 315-18, interno, 2–3, 6, 43, 51–3 sinal de explosão, 547
323-24, 332-33, 337-39, 342-44 aritmética, 139, 151, 158-59, 165-66, 172 abordagem de baixo para cima, 96
ligado, 490
palavra de controle, 351–54, 356–58, número assinado, 139, 148, 166–69, 172 endereço, 487, 489–91, 493–94, 500 registrador,
360–61, 363, 368, 371–73, 375, 381, 490
384–85, 389 coprocessamento aritmético, 461 bps, 397-98, 408
diagrama de bloco interno, 292-93 coprocessador aritmético, 471 unidade de previsão de ramal, 552, 554
Machine Translated by Google

638 ÍNDICE

endereço de ramificação, geração, 203–04, 207 período,


D
tabela de histórico de 552 8 sistema, 1, 5–11, 14–5, 26
ramificações, buffer de destino de 552 duplicação de clock, 546
ramificações, 552, 554 previsão bits D e W, 87
dinâmica, 552 execução especulativa, 552, CMOS NVRAM, 579 DAA, 160-61
554, 557 previsão estática, 552 Entrada de Vídeo Digital (DVI), 582 DAC, 289, 317-19, 321
Sinal BRDY , 547 Relógio em tempo real (RTC), segmento encadeamento em série, 464-65, 469, 471
buffer, 257, 274–77 modo de código 579–80, segmentos de código 58, Par Darlington, 332, 335
de rajada, 441 transferência 60, 62, 530, 532–34 em conformidade, 518, alinhamento de dados, 545, 548–49
de dados em modo rajada, 547 530, 532–33 não conforme, código 532– barramento de dados, 2–3, 6–7, 9–10, 32, 42–
arbitragem de barramento, 455, 457, 464–66, 468 33, 7, 10–11, 17–20, 34–5, 71–92 5 externo, 2–3, 5, 43–4 byte de dados, 79
entre diferentes módulos de processamento, projetando, 12, 88–9 máquina, 3–5, 10–11, 32 dados problema de dependência, 552
468 usando o IC árbitro de 8289 objeto, 11, 72–6, 78 fonte, 11, 35–6, segmentos de dados, 505, 529, 531–32
barramento, 466 barramento contenção, 455, 40, 71– 3, 78, 88–9 simbólico, 10–11 transferência de dados, 289, 291–92, 296, 302,
459 controlador de barramento, 213–16, 218 configuração de cores, 263
304, 310, 312–13
Bus High Enable (BHE), unidade de paralelo, 289, 291, 298, 310, 312–13,
interface de barramento 237, 51, 58, 60 328, 332 tipos de dados, 74, 79,
Habilitação de Barramento Baixo (BLE), 237 86 decodificadores, 229, 231 intervalo de
endereços, 225–29, 233, 240 bloco, 229 ,
Arquivos COM, 78 231–32 decodificação, 225, 227–35, 237,
Palavra de comando, 407, 410–15, 425 ânodo 239, 244 exaustiva, 234 endereço de
C comum, 341–42 comunicação, 395–99, 402– memória, 225, 227, 234, 239 endereço parcial, 225,
07, 411, 415 assíncrono, 396, 403, 405–08, 410– 234–35 loops de atraso, 195, 220, 222–23
C, 32, 35, 38–9, 41 cache, 12, 415 full duplex, 395–96 half duplex, ordem decrescente , 152 tabelas de descritores,
431–32, 435, 444–54 e a família x86, 395–96, 405 simplex, 395 síncrono, 396, 403, 518–19, 523, 528 globais, 519 locais, 519–
451 hit, 445, 450 memory, 431– 405–08, 412, 438, 440, 442–43 registro de 20, 528 design de 8086, 87 conjuntos de
53 organization, 434, 446–47 comparação, 497–99 compatibilidade, 3, 5 para instruções, 86–7, 487–88, 490 desktops, 583–84
substituir políticas, 451 write trás, 3 compilador, 189, 191 dispositivos, 2, 5– 6, 9–10, 43–4 entrada, 5, 9, 35–
políticas, 451 6, 301–10, 313–18, 328, 337–38 saída, 5, 9, 39–40,
41–2, 291–92, 294–98, 300–10, 313, 315–21,
334, 337, 344–48
Portões de chamada, 533–34, 538
política de controle de acesso para, 533
CAPSLOCK, 276 carry,
23–5, 29–30, 33–4, 37–8, 39–40, 42 carry
fl ag, 34 auxiliares, 34 modo Turbo C++ da Borland, 189
cascata, 382–83, 390 controladores de computadores aritméticos, 1, 22, 29, 472
interrupção programáveis no PC, 390 barramentos de controle, 6–7, 9–10, 32
transferências de controle, 532 verificações de
privilégios, 532 controladores, 9 portas de
conversão, 244 analógicos para digitais, 244 DIP, 31
CBW, placa conversões, 1, 12, 15, 158–59, 165 binário acesso direto à memória, 395, diretiva
de 168 centrinos, 584 para hexadecimal, 16 decimal para 415, 76–7, 79, 81–5 assume, 84–5
centronics, interface de binário, 15 decimal para hexadecimal, 16 da
impressora 310–12, 310–11 forma de complemento de dois 21 DUP, 82
CGA, endereço lógico para um endereço físico, extremidades, 84

exibição de 4 caracteres, 262, 270 522–23 coprocessador, 213, 217 EQU, 82


chip, 289–96, 298, 308, 310, 313–18, 343 contadores, 350, 352–54, 357 programando ORG, 83–4, 92
programável, 289–91, 322–23, 349–50, o chip, 352, 368 segmentos, 71, 75–82, 84–8, 92
355, 363, 371, 377–79, 390–91 lógica de diretivas, 71–2, 74, 79, 84 discos, 4 disquetes,
seleção de chip, 487, 494 chips, 1, 8, 10 4 sistemas operacionais de disco, 96
interfaces de exibição, 363, 365, 367–
68 desmontagem, 77 arbitragem distribuída,
466 divisão, 114, 120, 126–28 por zero, 127
1 KB, 8, 31 CP/M, 96 dividendo, 120, 126–28 quociente, 120, 126–
1 MB, 8, 31 CPU, 5–6, 8 28 assinado, 108, 111, 113–14, 131, 139 ,
256 bytes, 8, 31 CWD, 168 148, 166-72
chipset, 561, 564–68, 577–78, 580, 584 ciclos, 7–9, 42, 195–97, 199, 200–201,
203, 205–15, 218–21 leitura de
Arquitetura CISC, 12 memória, 6, 9 gravação de
Relógio, 1, 5-6, 8-9, 12, 31, 43-4, 51, 197, 199, memória, 6, 9
203, 206
Machine Translated by Google

Í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

registrador de endereço base, 420–23 ATX, 580, 583


registrador de contagem de palavras BTX, sistema Leitura de E/S, 6
base, 420 diagrama de blocos de, 492 de refrigeração 583, E/S, 1–2, 6–7, 9–10, 32, 36, 42–3, 46 isoladas, 180,
DMA e IBM-PC, 426 formato 583, 56, 59, 61, 63 201, 212, 225, 239, 243–44, 336, 415, 423,
DMA e PC-AT, 428 precisão big endian, 63 little 528 portas, 1–2, 45
dupla, 472–75, 477 endian, 63, 65 referências
DRAM, 431, 433, 435–40, 442–43, 445–46 chip, diretas, 73 segmento IBM, 2, 4–5, 503
431–41, 444, 452 modo de página completo, 71, 75, 84–5 chamadas PC-AT, 4
rápida dram, 439 ciclo de leitura de, 433, de função, 97, 101 PC-XT, 4
435–37 síncrono, 396, 403, 405–08 , 412, BIOS, 96–7, 249, 253, 255–56, 258–61, computadores pessoais, 2, 4–5
438, 440, 442–43 drivers, 11 dispositivos, 1, 264–65, 267, 270, 272, 274–77, 283 IBM PC, 225, 239–40 mapa
7, 9–11, 30–1, 39, 45–6 memória de canal de memória de, 239
duplo, 567, 577 DOS, 95–7, 99–102, 105–06, 109, 122–23, Sistema pessoal IBM/2, 582
128, 249, 255–56, 259–60, 269, 272, 274, IDIV, 170-71
277–78, 280–81, 283–87 teclas, 272, 274, IMUL, 170-71
276 bloco funcional, 95–6 desigualdade, 142-43
Módulo de memória de linha dupla (DIMM), 576 Palavras de Comando de Inicialização (ICWs), 381
display multiplexado dinâmico, 289, 344
ICW1, 381-85
ICW2, 381-85, 387
ICW3, 381-82, 384-86

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

EPROM, 226, 230–31, 234 unidade


handshake, 296, 302–05, 308, 310, 312 no
de execução, 51–2
protocolo RS232, 402 sinais, 289–90, Paralelismo de nível de instrução (ILP), 557 fila de
Arquivos EXE, 78
292, 296, 302–06, 308, 310, 311–13, 322, instruções, 58
barramentos de expansão, 568
325, 348 disco rígido, 562 –63, 571, 573–74, FIFO, 58
Barramento ISA, 565, 568–69, 573
579, 583–84 interface, 565–66, 568, 571, instruções, 3, 5, 7–8, 11, 12, 27, 31–8, 40–1,
Barramento PCI, 566, 568–70
573, 575, 582 pratos, 573 setores, 573–74 trilha, 44, 71–2, 74, 77–9, 81, 84–9, 91–2
PCI Express, 561, 565, 568–71
573 hardware, 5, 12, 31, 41, 44–6, 195–97, aritmética, 1, 5–6, 19, 22, 29, 31–2,
USB, veja barramento serial universal
217 estrutura de 8086, 196 hardware 36–8 branch, 7, 34, 36, 38–9, 58 call, 5,
EXTRN, 184-85, 187-88
retriggerable one shot, 359 modo acionado 7, 12, 38 compare, 40–1 complex,
por hardware, 362 teclado hexadecimal, 289, 12 data transferência, 6, 36, 38, 46
337–39 representação hexadecimal, 17–8, 30 ajuste decimal, 36–7 decodificação, 7–8
F construções de linguagem de alto nível, 172– execução, 7–8 busca, 7–8 fl ag control,
73, Taxa de acerto de 175–76, 445 114, 609
fatorial, 125-26
buscando, 58
FIFO RAM, 367–68, 370, 374–75 porta de
fiação de fiação, 582
Flag, 33–4, 40, 55–7
ocupado, 323, 348
carregado, 23–5, 29–30, 33–4, 37–40, LODS, 144–45, 596, 609, 613 lógico, 36,
42
129–130
Machine Translated by Google

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

plano, 33–4, 40, 55–7, 250 key debounce, 338–40


manipulador, 251, 278, 377, 390, 533, 537 liberação de chave, 273–74 M
interface de exibição do teclado, 363
enganchar, 277, 280 programável, 289–91, 322–23, 349–50, códigos de máquina, 72, 77, 86
instrução, 1, 3, 7–8, 11–2, 31–2, 34–40, 45, 355, 363, 371, 377–79, 390–91 macros, 139, 155-58
52, 54, 56, 58, 60–1, 67, 195, 199, 206, diretiva local, 157
213, 215, 217– 21 varreduras de teclado, 367 magnitude, 19, 22, 29, 40
pressionamento de tecla, 367–68, 374 técnicas de mapeamento, 431, 447, 450
rotina de serviço, 45 teclas, 272–76, 281–82 direto, 447-50
vetor, 45-46 TODOS, 272, 274, 276, 280-81, 283-86 totalmente associativo, 447-50
Tabela de Descritor de Interrupção (IDT), 503, conjunto associativo, 449-51
537–38 aplicação, 255, 258, 273, 277 MASM 6, 14, 96
exceções, 503, 515, 538-40 Caps Lock, 273-74 mestre 8, 259, 390, 391
ganchos de interrupção, 278 personagem, 260-64, 266-78, 283 Contagem Máxima (MC), 496–97, 499, 501
Rotina de Serviço de Interrupção (ISR), 250–51 CTRL, 272, 274, 282-85
tipos de interrupção, 253, 255 Entrar (Retornar), 272 registro de contagem máxima, 496–97, 499
interrupção de ponto de interrupção, 254, 256 Fuga, 272 modo máximo, 195, 213–18
dividir por zero erro, 253, 255-56 Função, 256, 258-61, 264-70, 272, 274-81, memória, 2, 4–10, 30–2, 34–7, 39–46
interrupção não mascarável, 254–56, 260 283-84 endereço, 463, 489, 505, 525, 546, 548
interrupção de estouro, 255 Num Lock, 273
passo único, 254 janelas, 266, 273 banco, 200, 213, 235-39, 244-45, 298,
tabela de vetores de interrupção, 249, 252– 440-41, 512, 547-50
53, 255–57, 274, 278–79 primário, 8, 431, 514
interrupções, 249–50, 252, 255–59, 261, 272, 274– secundário, 8, 431, 445-46, 514, 524
75, 277–78, 280, 283 eu
virtuais, 2, 4, 431, 503, 514, 516, 524, 576
BIOS, 249, 253, 255–56, 258–61, 264–65, rótulo, 72–3, 82, 85–6
267, 270, 272, 274–77, 283 idioma, 1, 3, 5, 10–1, 34 acesso à memória, 63
montagem, 1, 5, 10–1, 34 bancos de memória, 235–39, 244–47
Machine Translated by Google

ÍNDICE 641

capacidade de memória, 30– usando sistemas passando por registradores, 151


31 unidades de, 6, 30 multiprocessadores 8086, 457, 472, 456–57 passando para procedimentos de e para,
controlador de memória, 566, 568, 577 sistemas fortemente acoplados, 456, 151 capacitância parasita, 438
unidade de gerenciamento de memória, 515, 464 multithreading, 555–57 PC-AT, 503
524, 545, 552 modelos de memória, PC-XT, 503
71, 75, 85 segmento completo, 71, 75, 84 clones de PC, 503
minúsculo, 75 , 77–80, 85 organização PC, 2, 4, 5, 12–3, 30–1, 34, 44 desktops,
de memória, 62 leitura de memória, 6–9 N 3 laptops, 4 servidores, 4
gravação de memória, 6–9 microchip, 1, 565 supercomputadores, 4
microcontrolador, 487, 495 design de NAND, 294
microprocessador, 555 últimas tendências números negativos, 1, 19, 21, 24, 29 adição
em, 555 processadores multi core, 555, 558 de, 22–4, 28–9, 36 representação de, Computadores baseados em PCI, 428
multi core tecnologia, 558 microprocessadores, 17–9, 21–2 netbook, 584 rede e fi PCI, 561, 563, 565–71, 580–81, 584 expresso,
1–2, 12, 23–4, 31, 46 embutidos, 2, 12 rewire, 566 nibble, 18, 23, 27 561, 565, 568–71 soquete, 563, 568, 577,
histórico, 1, 4, 12, 31 pinos de modo 580
mínimo, 196–98 funções, 195–98, 203, Pentium II, 553-54
214, 216 , pino NMI, Pentium III, 553-54
normalização 256, ponte Pentium IV, 555
norte 473–74, cabos de modem nulo Pentium M, 559
563, 565, 567–68, sistemas numéricos Pentium PRO, 3, 12, 553–54
400, 1, 12–4 binário, 1–2, 10–11, 13–9, Processador Pentium, 549
21–6, 28 decimal, 12–8, 21–30, 36, 37, 49 estrutura de cache de, 545
256, 258-59, 264-65, 267, 272, 274-78, hexadecimal, 1, 14–7, 21–2, 24–6 pai de Pentium, 549
280, 283 Pentium, 3–5, 12, 29
MMX, 553, 554 números de comprimentos diferentes, 29 blocos de periféricos, 487
mnemônicos, 10 adição, 10, 17, 22–5, 27–30, 36–7, 39 blocos de controle de periféricos, 493,
processadores móveis, sinal estendido, 29–30 497 periféricos, 2, 9, 10, 44, 46
palavra de controle de 559 modos, 405, 407– computadores pessoais, 561, 567
08, 410, 412, formato de instrução de NUMLOCK, 276 modernos, 562, 565, 567, 580, 583 pinos,
modo 414, modo 408, 411, 2, 13, 35 assíncrono, NVRAM, 444, 579-80 31, 41–4, 46 configuração, 195, 205, 292, 303
396, 403, 405–08 , 410–12, 415 bidirecionais,
6, 7 acionados por hardware, 355, 362 HLDA, 41, 45-6
protegidos, 2 acionados por software, HOLD, 31, 34, 39, 41, 45-6
355, 362 modem, 397–98, 403, 562, 566 O INTR, 41, 45–6
módulos, 179, 183–86, 188–90 placa-mãe, modo mínimo, 195–200, 203, 213–14
561–67, 569–71, 575, 577, 579–81, 583– endereços ímpares, 236, 238 status da fila, 217, 460 solicitação/
84 porta gráfica acelerada, 562, 565 placa opamp, 319 sistema concessão, 457 dados de entrada serial
de som, 565–66 placa de vídeo, 565–66, 568 operacional, 11 kernel, 11 veja SID, 46 dados de saída serial veja
interconexão de componentes periféricos, 563, palavras de comando SOD, 46
569 movimento (MOV ), 98 endereçamento operacional, 385
direto, 100 OCW1, 385, 387, 390 SID, 41, 45-6
OCW2, 385, 387, 389 SOD, 41, 45–6
OCW3, 385, 389–90 processador em pipeline,
optoacopladores, 336 portas 546 pipeline, 58 ponteiro,
de saída, 240 overclocking, 546 55, 60–1, 64–5, 99, 101, 103, 107, 112–13, 115–
overfl ow fl ag, 166–68 17, 122–23
instrução, 52, 54, 107, 146,
478–79, 489, 505–06, 535–36
MSB, 19, 22, 25, 28–30, 34 pilha, 55, 58, 60–2, 67–9, 573 endereço
MS-DOS, 4 de porta, 179–83 porta, 289–310, 312–13,
MUL, 10 P 315–17, 319–21, 324–26, 332–34, 337–
processamento multicore, 545, 555, 557 39 , 343–46 recursos estendidos,
multitarefas, 504, 534 problemas em, 532, bcd compactado, 18, 23, 26–7 312 paralelo estendido, 312
535 sistemas, 503, 514–15, 526, 533– adição de, 22–4, 28–9, 36 legado, 310 paralelo padrão, 312
35 multibus, 467, 470–71 exibição dinâmica subtração de, 27–9 densidade de
multiplexada, 364 multiplicação , 114, 124–26, 131 empacotamento, 438, 445 tamanho
de página, 552 entrada de tabela de
página, 525–26 tradução de página, USB, veja barramento serial universal
assinado, 108, 111, 113–14, 131, 133, 515, 524 paginação, 505, 515-16, dissipação de energia, 553, 555
139, 148, 166–72 não assinado, 524-29, 535 arbitragem paralela, 465, power on reset, 206 power on,
95, 111, 114, 121, 124, 126, 131 469-70 implementação de, 469, 472 253, 258 pré-buscando, 58 prefixo,
multiprocessamento, 455–59, 462, 140, 142–45
466–67, 469– 71 parâmetros, 151–53, 156–57
passando pela memória, 152 REP, 140-42, 144-45
Machine Translated by Google

642 ÍNDICE

pré-escalador, ler e escrever, 201, 216 comparação de, 168-69


371 níveis de privilégio, 528, 530–35, 537 tempos de barramento, signifi cando, 479
proteção, 503–04, 515–17, 520, 526, 528– 195, 201 sinais de controle para, 201, Multithreading Simultâneo
30, 532, 540 trust, 530 instruções 211, 216 modo real, 504–06, 513–14, 516, 540 (SMT), 557
privilegiadas, 539–40 chamadas de conjunto de instruções reduzido arquitetura do Módulo de memória de linha única
procedimento, 150 procedimentos, 139, 145, computador ver arquitetura RISC (SIMM), 576
148–49, 151, 179 poder de processamento, reentrante, procedimento 280 , 255–56, 279–80 precisão simples, 472–73, 475–76 modelo
Barramento de 5 processadores, processador programa, 249–51, 254–55, 258, 260–61, pequeno, 75, 80–1 software, 5, 11–2, 45
566–67, 1–12, 29, 31, 33–5, 41, 43–6 265–69, 271–73, 276–85 taxa de atualização, modo acionado por software, 362 ponte
contador de programa, 2, 33–4, 43, 45 439 registro, 31–7, 39, 51–2 , 54–61, 63– sul, 563, 565–66, 568, 573, 580, 582
7 fl ag, 33–4, 40, 55–7, 250 uso geral, valores especiais, 474, 476 desnormalizados,
32 scratchpad, 32, 52 registradores, 51–2, 54–5, 477 infinito, 477 não é um número,
58–67 interno, 6, 52, 352, 419–20, 423, 459 477 operações especiais, 477 zero, 473, 476–
Prefixo de segmento de programa (PSP), programa visível, 52 nível de privilégio 77, 479–80 gerador de onda quadrada, 362
106 programa, 2–3, 5, 7, 10, 11, 33–4, 37– solicitado, 520, 531 lógica de reinicialização,
9, 43, 45, 141–54, 156–57, 163–69, 171– 493 resistores, 242 entrada direita, 369, 370–
72 , 174-78 chamado, 139-40, 145, 71, 374, 376
147-49, 151, 155-56, 158 chamado, 145, 148,
150-51, 171 contador, 2, 33-4, 38-9, 43,
45 execução , 7–8, 12, 32, 34–5, 38, 43, 45 Chip SRAM, arquitetura
principal, 145–47, 149–51, 153–54 fonte, 11, interna 432–34 de, 431, 434, 437
35–6, 40, 71–3, 78, 88–9 temporizador de
intervalo programável, 349, 391 SSE, 553, 554
programável one shot, 359 programando stack pointer, 2, 33–4
usando, 172 programando em C, 189 com Arquitetura RISC, 12 stack, 55, 58, 60–2, 99, 104–06, 119, 128, 146–
módulos de montagem, 189 ROM, 1, 4 47, 149–51, 153–55, 573 definindo a,
portas, 1–2, 45 105–06 operação, 98, 104–06, 112, 114,
Conectores RS-232, 395, 398–400, 402, 118, 120–21, 128–33, 135
413, 399–400
Dispositivos DCE e DTE, 399
conversores de nível, 399 padrões, overfl ow, 155, 166–69, 171
Interface Periférica de Programação (PPI), 291 395, 398, 402 underfl ow, 155 byte de status,
RS232c, 290 274–76, 281, 284 registrador de status,
programando, 289, 290–92, 295, 395, 352, 368, 374–76 status word, 292, 305,
407, 412, 420, 425–26, 489, 495, 497 410–11 step angle, 331–33 motor de
programando o 8087, 479 passo, 289, 327-37 bipolar, 329-30
S acionamento a, 330 bifásico, 329 tipos,
formato de instrução, 480–81 328 unipolar, 329-30 instruções de
programando o modo de loopback 8251, código de varredura, 273–76, 281–82, 284–86 string, 139, 140, 144-45
407, 412, 412–13 programação, 95– Gatilho Schmitt, substituição
7, 105, 289–92, 295, 395, 407, 412, 420, 425–26 de segmento 206–07, 87, 92
aproximações, 95 entradas /saída, 179, prefixo, 67 registros de
183 interativo, 96 modular, 179, 183, 189 segmento, 52, 58–62, 64 segmento, 52,
abordagem de cima para baixo, 95 58–62, 64–67 latência CAS selecionável, CMPS, 142
seletor 441, 515, 520–23, 527, 529-31, MOVS, 140
533-38 segmento, 52, 58-62, 64-67, pré-requisitos, 139–40
SCAS, 143
Modo de endereçamento virtual protegido estroboscópios,
(PVAM), 504, 515 505–06, 515–36, 538–40 memória 355 acionados por hardware, 355,
mecanismos de proteção, 545 de semicondutor, 431–32 362 acionados por software, 355,
proteção, 503–04, 515–17, 520, 526, 528–30, RAM dinâmica, 435, 439, 446 RAM 362 modo estroboscópico, 302, 304
532, 540 pseudo-instruções, 72 estática, 432, 446 comunicação serial, entradas, 302, 305 saídas, 305,
10 programáveis, 403 servidores, 561, 569 308 subtração, 10, 25–9, 40, 114,
Diretiva PTR, 115 monitores de sete segmentos, 341– 119–21 assinados números, 22, 25, 27–8, 29–30
público, 184–89 42 dinâmicos, 289, 342–44 multiplexados, números sem sinal, 22, 25, 29 arquitetura
289, 313–14, 342, 344 estáticas, 342 superescalar, 545, 549–50, 557
memórias de sombra, 259 extensões alternando para modo protegido, 540
de sinal, 21, 30 números com sinal, símbolos, 72 síncrono vs assíncrono, 442 erros
R 166, 168–70 de sintaxe, 74

RAM, 1, 4, 8, 34, 52 no
chip, 52, 58 gerador
de taxa, 360
Machine Translated by Google

ÍNDICE 643

BIOS do sistema, 578–79 Translation Lookaside Buffer (TLB), tradutor


DENTRO

BIOS flash, 563, 567, 579 526–27, taxa de transmissão 71–2,


ROM BIOS e placas-mãe, 579 barramento pino de disparo 397, buffer tri-state 351, 226,
adaptador de vídeo,
de sistema, 6–7, 10 descritores de 242–44
261 placas de vídeo, 4
sistema, 518 modo de gerenciamento de
monocromáticos, 4
sistema, 553 sistema no chip, 584
modos virtuais 8086, 513
TSB, 257-58
memórias virtuais, 503–04, 514,
TSR, 249, 278, 280-81, 283, 285
516, 524
TTL,
verificação de tipo 226,
número do tipo 528–29, 252–60, 264, 274,
277–78, 282, 284 geração de, Dentro
T 257–58 typematic, 274
ciclos de espera,
vinculação de tarefas,
210 gerador de estado de
538 registro de tarefas, 536–37, espera, 487 formas de onda, 289, 300,
540 alternância de tarefas, 503, 534– 303, 305, 319-21 dente de serra,
35, 537–38 contagem de DENTRO
321 escada, 320-21 triangular, 319
terminais, 355, 358 terminam e
ciclo de máquina de gravação, 211
permanecem residentes, 277–78 barramento serial universal, 310, 571–72
estroboscópios de gravação, 239
Thread Level Parallelism (TLP), 557 características de, 72, 78, 84, 461, 472, 477,
thread, 557 time, 1, 4, 6, 8, 12, 561, 568, 570, 572 problemas de
31, 34, 39, 42, 44, 46 access, 6, 8, 11, 31, energia, 572 números sem sinal, 22, 25, 29
43–4 timer unit , 488, 494–95
temporizadores, 289, 350–51 adição de, 22-4, 28, 29-36
cronometragem, 495–97, 501 eventos, USART 8251, 395, 403 diagrama X
495–96 sequência, 494–95, 499 kit de de blocos, 350, 351, 353, 363, 368, 373, 378,
x86, 2–5, 11–2, 31
treinamento, 290, 298 velocidade de 379, 404, 405, 419–22 bloco de controle de
transferência, 566 tradução, 99, 102–03 modem, diagrama de 406 pinos, 400, 404
programação, 95–7, 105 receber buffer, 405
A PARTIR DE

Z-80, 2
CONSTRUÇÃO DE USOS, 150-51, 160 Bandeira ZF, 509
Machine Translated by Google

Você também pode gostar