465
1 Paulo Maciel Interface Hardware/Software Paulo Maciel Centro de Informática

Book Chapter 1 - cin.ufpe.brdpam/arquivos/IntHwSw10.pdf · Para calcular automaticamente tabelas matemáticas, necessárias sobretudo para a navegação. Trabalhava por gravidade

Embed Size (px)

Citation preview

1

Paulo Maciel

Interface

Hardware/Software

Paulo Maciel

Centro de Informática

2

Paulo Maciel

Problema

Projete o sistema de software de controle e monitoração para previnir roubos

em uma propriedade.

LuzComSensor

Câmera

Sensor de Abertura

Galpão deInsumos

Galpão deMáquinas

Escritório(Controle)

Dispositivos Atuadores de Bastão

3

Paulo Maciel

Programa

Introdução

Uma visão histórica relacionando as influência mútuas entre as evoluções:

das tecnologias de fabricação de CI,

das arquiteturas de processadores e

da infra-estrutura de software.

Processador Pentium: Visão Geral

Modos de Operação

Modelo de Software

Diagrama Funcional

Previsão de Desvio

Assembly

Modos de Endereçamento

Instruções

4

Paulo Maciel

Programa

Assemblers

MASM

NASM

Programação de Ponto Flutuante

Registradores de ponto flutuante

Padrão, tipos e formatos

Modos de endereçamento

Conjunto de instruções

Dispositivos de Entrada e Saída e Mecanismos de Tratamento

Dispositivos

Políticas de Tratamento

Pooling

Interrupções

DMA

Controladores

Gerenciamento de Dispositivos de Entrada e Saída

Serviços do BIOS

5

Paulo Maciel

Programa

Tópicos em Linguagem C

Organização da Memória

Ponteiros

Alocação Dinâmica de Memória

Interface entre C e Assembly

Programação no Modo Protegido:

Organização de Memória

Introdução ao NASM

Interface C-Assembly, Assembly-C em ambiente Linux

Uso de Serviços do Linux e de Bibliotecas C.

6

Paulo Maciel

Programa

Introdução à Programação Concorrente por variável

Compartilhada

Processos e threads

Sincronização

Exclusão Mútua

Semáforos

Monitores

7

Paulo Maciel

Bibliografia

The Pentium Microprocessor, James Antonakos. Prentice Hall

Pentium Processor System Architecture. Addison Wesley.

Assembly Language. Programing with DOS and Linux. Jeff Duntemann.

Wiley.

Linux Assembly Language Programming. Bob Nevln. Prentice Hall.

Programacão Avançada em Linux. Gleicon Moraes. Novatec.

A Guide to Assembly Programming Language in Linux, Dadamudi, Springer.

8

Paulo Maciel

Avaliação

Primeiro Exercício: projeto + prova

Segundo Exercício: projeto + prova

Final: prova

9

Paulo Maciel

Computadores Mecânicos

Máquina de Pascal

Operações:Soma e Subtração

Manivela

Blaise Pascal (1623-1662)

Máquina Analítica

Componentes:

Armazenamento

Engenho

Seção de Entrada

Seção de Saída

Cartões Perfurados

Charles Babbage (1792-1871)

Ada Lovelace

10

Paulo Maciel

Charles Babbage,o avô do computadores (Inglaterra, 1791-1871)

Para calcular automaticamente tabelas matemáticas, necessárias sobretudo para a navegação. Trabalhava por gravidade.

Programável. As instruções entravam por meio de cartões perfurados; tinha memória (store) para 1000 números de 50 algarismos, tinha uma unidade aritmética (mill), impressão automática, uma operação aritmética por segundo. Usava a base 10, era uma máquina “mecânica”, trabalhava a vapor.

Máquina Diferencial, 1822:

Máquina Analítica, 1834:

Nunca foram completamente construídas…

11

Paulo Maciel

Ada, condessa de Lovelace,a primeira programadora (Inglaterra, 1815-1851)

Em homenagem a Ada Lovelace, a linguagem vencedora do

concurso internacional promovido pelo Departamento de

Defesa dos EUA foi baptizada “Ada” (1979).

Matemática, colaboradora de Babbage, considerada a

primeira programadora.

12

Paulo Maciel

Ada, condessa de Lovelace,a primeira programadora (Inglaterra, 1815-1851)

13

Paulo Maciel

Computador Elétrico

Advento da Energia Elétrica

Desenvolvimento da tecnologia

eletrônica

dispositivos eletromagnéticos

relés

Automatização dos processos

mecânicos

Máquinas de Aiken

Relés

Dígitos decimais

Fita de papel perfurado

14

Paulo Maciel

Computador Eletrônico

Máquina Enigma

15

Paulo Maciel

Computador Eletrônico

COLOSSUS (1943)

1° computador eletrônico

Max Newman (matemático)

Tommy Fowlers (engenheiro)

Alan Turing

16

Paulo Maciel

Alan Turing (1912-1954)

1912: Londres, UK.

1935: Investigador na Universidade de Cambridge.

1936: “On Computable Numbers” (A máquina de Turing)

1938: Decifrando a ENIGMA, durante a II Guerra Mundial

1945: Concepção de Computador Digital (ACE, NPL)

1947: Construção do ACE (Automatic Computing Engine)

1950: Artigo Pioneiro em IA (O teste de Turing)

Alan Turing foi um dos fundadores da Informática, tendo apresentado contribuições

importantes tanto em aspectos teóricos como práticos da mesma.

O prémio Turing Award tem sido concedido pela ACM (Association for Computing

Machinery) desde os anos sessenta a personalidades que se tenham distinguido no

domínio da Informática e Ciências da Computação.

17

Paulo Maciel

Alan Turing e o ACE

18

Paulo Maciel

1ª Geração (1945-1955)

ENIAC

Tecnologia - Válvulas e relés

Arquitetura: 20 registradores

10 digitos decimais

Programação: Chaves

John Mauchly e John Eckert

19

Paulo Maciel

1ª Geração (1945-1955)

ENIAC

Programação: Chaves

20

Paulo Maciel

1ª Geração (1945-1955)

ENIAC John Mauchly and J. Presper Eckert

17,468 válvulas,

1,500 relés, 70,000 resistores, 10,000 capacitores27 t63 m2

21

Paulo Maciel

1ª Geração (1945-1955)

UNIVAC - J. Presper Eckert and John Mauchly

5,200 válvulas,13 ton.,125 kW,1,905 ops2.25 MHz clock.

35.5 m²

22

Paulo Maciel

1ª Geração (1945-1955)

IBM 709

23

Paulo Maciel

John von Neumann(1903-1957)

1903: Budapeste, Hungria.

1931: Professor de Matemática na Universidade de Princeton.

1940: Consultor do projeto da bomba atómica.

1944: Visita o ENIAC, e torna-se “padrinho” do projeto. O maior problema do ENIAC era como construir uma memória programável, para o novo computador EDVAC.

1945: First Draft of a Report on the EDVAC, sugerindo que:

1 Deve usar-se sistemas de numeração binária.

2 Os dados e os programas devem residir na memória interna.

John von Neumann foi um dos maiores matemáticos de todos os tempos, e as suas

contribuições não se limitam aos computadores. Foi o inventor da Teoria dos Jogos,

por exemplo.

24

Paulo Maciel

John von Neumann (1903-1957)

25

Paulo Maciel

1ª Geração (1945-1955)

EDSAC - Jonh von Neumann

Tecnologia - Válvulas e relés

Arquitetura:

Componentes

Memória

Unidade lógico-aritmética

Unidade de controle

Equipamentos de entrada

Equipamentos de saída

Aritmética binária

Programa em linguagem de baixo

nível armazenado em memória

Memória

Unidade

de

ControleULA

Entrada Saída

Acumulador

Arquitetura de von Neumann

26

Paulo Maciel

Camadas de um Sistema Computacional

Linguagens

Sistemas Operacionais

MáquinasMáquina

SO

Aplicações

27

Paulo Maciel

1ª Geração (1945-1955)

Máquinas

UNIVAC

IBM 709

• Linguagenso Código Absoluto

Fios e Paineis

Nesta época os

conceitos de linguagem

de programação e de

sistemas operacionias

não estavam claros

Um único grupo de

pessoas projetava,

construia, programava,

operava e efetuava

manutenção das máquinas

28

Paulo Maciel

2ª Geração (1955 - 1965)

Advento do Transistor

redução de dimensões

redução do consumo de potência

possibilita a construção de equipamentos mais

complexos

TX-0

1° Computador transistorizado

MIT

PDP-1

Metade do desempenho do IBM 7090

~5% o valor do IBM 7090

DEC

IBM 7090

IBM 1401

IBM 7094

29

Paulo Maciel

2ª Geração (1955 - 1965)

Sistema Operacional Batch

Fortran Monitor System

IBSYS

Distinção clara das atividades e grupos de pessoas na

execução de tarefas

• Linguagens de Alto Nível

FORTRAN

ALGOL

30

Paulo Maciel

3ª Geração (1965 - 1980)

Circuitos Integrados

redução de dimensões

redução do consumo de potência

possibilita a construção de equipamentos mais

complexos

melhoria de desempenho

Microprocessadores

IBM System/360

Família de Computadores com diferentes

desempenhos, precos, mas compatíveis.

DEC PDP-11

Minicomputador de 16 bits.

Microprocessadores

INTEL

4004,8008,8080,8085,8086

ZILOG

Z80

Motorola

68000

An IBM System/360-20 (front panels removed), with IBM 2560 MFCM (Multi-Function Card Machine)

31

Paulo Maciel

3ª Geração (1965 - 1980)

Multiprogramação

Timesharing

Simula

Pascal

C

ML

Smalltalk

32

Paulo Maciel

4ª Geração (1980 - ?)

• Very Large Scale Integration

• Computadores Pessoais

• Workstations

Computadores

Cray

SUN - 20

IBM SP2

Processadores

Intel PENTIUM

ALPHA Digital

PowerPC

33

Paulo Maciel

4ª Geração (1980 - ?)

• Sistemas Operacionais para Redes

• Sistemas Operacionais Distribuídos

o Unix, Windows NT

C++

VisualBasic

(Programação Visual)

Java

(Aplicações para WEB)

34

Paulo Maciel

Arquitetura de Computadores

Abordagens de Hardware e de Software

Seqüência de

Funções Aritmética

e Lógicas

Dados Resultados

Programação em HardwareFunções Aritmética

e Lógicas de

Propósito Geral

Dados Resultados

Programação em Software

Interpretador

de

Instruções

Códigos de

Instruções

Controle

35

Paulo Maciel

Arquitetura de Computadores

Diagrama em Bloco

I/O Paralelo I/O SerialCircuitos de

Interrupção

Circuitos de

TemporizaçãoCPU Memória

36

Paulo Maciel

Sistema de Memória

Hierárquia

Interna

Registradores

Cache

Memória Principal

Externa

Disco Magnético

Fita

Desempenho × Custo

Princípio da Localidade

Memória de Massa

Memória Principal

Reg.

37

Paulo Maciel

Processador Hipotético

Reg. Uso

Geral

Data buffer

Latch End.

A

Unidade de Controle

Reg. Inst

Dec. InstFlags

Reg. Aux.ALU

.......................

Barramento de Dados

Barramento de EndereçosBarramento de Controle

•Desempenho

•Espaço de endereçamento......

....

55

Paulo Maciel

Arquitetura de Computadores

Ciclo de Instrução

Ciclo de Busca

Ciclo de Decodificação

Ciclo de Leitura

Ciclo de Execução

Ciclo de Escrita

56

Paulo Maciel

Arquitetura de Computadores

Formato Genérico de Uma Instrução

Exemplos:

mov al,01h

mov al,[0400]

mov al,[bx+si]

Código da Instrução Dado, Endereço ou Modo de Endereçamento

57

Paulo Maciel

Arquitetura de Computadores

Diagrama de Estado do Ciclo de Instrução

Busca

Inst.

Cal. End.

Prox. Inst.

Operand.

Cal. End.

Operand.

Exec.

Operaç.

Cal. End.

Operand.

Escrev.

Operand.

Dec.

Inst.

Múltiplos

Operandos

Múltiplos

Resultados

Retorna para string ou vetorInstrução Finalizada. Busca

Nova Instrução

58

Paulo Maciel

Arquitetura de Computadores

Interrupções

Internas - erro de paridade, divisão por zero

Externas - relógio, teclado

Mascarável - pode ser inibida

Não-Mascarável - não pode ser inibida

59

Paulo Maciel

Arquitetura de Computadores

Interrupções na Arquitetura x86

Hardware Internas

Externas Mascarável

Não-Mascarável

Software Sistema Operacional

Usuário

60

Paulo Maciel

Arquitetura de Computadores

Programa do Usuário Serviço de Interrupção

1

2

i

i+1

m

61

Paulo Maciel

Arquitetura de Computadores

Diagrama de Estado do Ciclo de Instrução com Interrupção

Busca

Inst.

Cal. End.

Prox. Inst.

Operand.

Cal. End.

Operand.

Exec.

Operaç.

Cal. End.

Operand.

Escrev.

Operand.

Dec.

Inst.

Múltiplos

Operandos

Múltiplos

Resultados

Retorna para string ou vetorInstrução Finalizada. Busca

Nova Instrução

Verif. se

há interrp.

Interrupção

Sem

Interrup.

62

Paulo Maciel

Arquitetura de Computadores

Programa do Usuário Serviço da Interrupção X

1

2

i

i+1

j

j+1

m

Serviço da Interrupção Y

Múltiplas Interrupções

63

Paulo Maciel

Arquitetura de Computadores

Programa do Usuário Serviço da Interrupão X

1

2

i

i+1

m

Serviço da Interrupção Y

Interrupções Aninhadas

J

j+1

64

Paulo Maciel

Arquitetura de Computadores

I/O I/O

CPU Memória

Barramento

Dados

Endereço

Controle

•Desempenho

•Espaço de endereçamento

65

Paulo Maciel

Arquitetura de Computadores

Arquiteturas RISC X CISC

Complex Instruction Set Computer

Reduced Instruction Set Computer

RISC : SPARC

CISC : Intel 386

66

Paulo Maciel

Arquitetura de Computadores

Problemas CISC

Desempenho

ROM interna aumenta as

dimensões da pastilha

Mau uso, pelos

programadores, das

instruções e modos de

endereçamento disponíveis

Caracteristicas CISC

Instruções complexas

Modos de endereçamento

complexos

Controle implementado por

ROM

Micro-instruções

67

Paulo Maciel

Arquitetura de Computadores

CISC

•SE CARACTERIZA POR:

•CONJUNTO DE INSTRUÇOES E MODOS DE

ENDEREÇAMENTO SOFISTICADOS

•CONTROLE MICROPROGRAMADO

•UM NÚMERO REDUZIDO DE INSTRUÇÕES NO CÓDIGO

COMPILADO

•COMPILADOR DE CONSTRUÇÃO MAIS SIMPLES

68

Paulo Maciel

Arquitetura de Computadores

RISC

Objetivos das Maquinas RISC

Melhoria de desempenho

Reduzir acesso à memória principal (arq. load/store)

Instruções e modos de endere₤amento simples (Controle hardware wired)

Bom uso dos registradores

Pipelining (execução super-escalar)

Uso extensivo do compilador

69

Paulo Maciel

Arquitetura de Computadores

RISC

SE CARACTERIZA POR:

•CÓDIGOS DE INSTRUÇÃO MAIS SIMPLES

•COMPILADORES MAIS SOFISTICADOS

•PEQUENOS CICLOS DE CLOCK

•PEQUENOS NÚMEROS DE CICLOS POR INSTRUÇÃO

•EFICIENTE PIPELINING DE FLUXO DE INSTRUÇÕES

70

Paulo Maciel

Arquitetura de Computadores

Petium

8086

16 bits

Espaço de endereçamento : 1 Mb

Endereço da primeira instrução

executada: FFFF0H

286

16 bits

Espaço de endereçamento : 16 Mb

(24 bits)

Memória Virtual

386

32 bits

Espaço de endereçamento :

32 bits

Registradores de 32 bits

486

Cache interna de 8K

Co-processador 80387

interno

71

Paulo Maciel

Arquitetura de Computadores

Petium

Processador Intel Processador AMD

72

Paulo Maciel

Arquitetura de Computadores

Petium

Pentium é uma máquina CISC com características de RISC

Pipelines - Superescalar

Cache Interna - Dados, Instrução

Registradores de uso geral - 32

Previsão dinâmica de desvios

Co-processador aritmético interno com 7 registradores de ponto flutuante

de 80 bits

73

Paulo Maciel

Modos de Operação

Modo Real

1 Mbyte

Modo Protegido

4 Gbytes

Multitarefa

Memória Virtual

Gerenciamento e Proteção de Memória

Modo Virtual

Modo de Gerenciamento

74

Paulo Maciel

Modelo de Software

EAX

EBX

ECX

EDX

EBP

ESI

EDI

AX

BX

CX

DX

BP

SI

DI

AL

BL

CL

DL

AH

BH

CH

DH

IP

SP

Flags

EIP

ESP

EFlags

CS

DS

SS

ES

FS

GS

Registradores de Segmento

Registradores de Uso Geral

Acumulador

Base

Contador

Dados

Base de Pilha

Índice Fonte

Índice Dest.

Apont. Inst.

Apont.Topo de Pilha

Flags

Codigo

Dados

Pilha

Extras

75

Paulo Maciel

Modelo de Software

Registrador de Flags

CF - Vai-um

PF - Paridade

AF - Vai-um auxiliar

ZF - Zero

SF - Sinal

OF - Estouro

NT IOPL OF DF IF TF SF ZF AF PF CF

o IF – Interrupção

oDF - Direção

oTF - Passo Simples

oIOPL - Nível de Prioridade

o da Tarefa

oNT - Tarefa Aninhada

76

Paulo Maciel

Modos de Endereçamento de Dados

Imediato

Ex.: mov cx,1024H

Registrador

Ex.: mov al,ah

Op_Code Dado

Op_Code Regist.

Regist. Dado

77

Paulo Maciel

Modos de Endereçamento de Dados

Direto

Ex.: mov al,[0300h]

mov ax,counter

Registrador Indireto

Ex.: mov ch,[bx]

Op_Code Ender. Dado

Op_Code Regist.

DadoBX,SI,DI Ender.

78

Paulo Maciel

Modos de Endereçamento de Dados

Indexado

Ex.: mov ch,[si+02]

Op_Code Regist. de Índice

SI,DI

Desl.

Desl.

DadoEnder.

79

Paulo Maciel

Modos de Endereçamento de Dados

Base

Ex.: mov ch,[bx+02]

Op_Code Regist. de Base

BX,BP

Desl.

Desl.

DadoEnder.

80

Paulo Maciel

Modos de Endereçamento de Dados

Base Indexado

Ex.: mov ch,[bx+si]

Op_Code Regist. de Base

BX,BP

Regist. de Índice

DadoEnder.

Regist. de Índice

81

Paulo Maciel

Modos de Endereçamento de Dados

Base Indexado com Deslocamento

Ex.: mov ch,[bx+si+03]

Op_Code Regist. de Base

BX,BP

Regist. de Índice

DadoEnder.

Regist. de Índice Desl.

Desl.

82

Paulo Maciel

Modos de Endereçamento de Dados

Porta

Ex.: in al,80h ;espaço de

in al,dx ; endereçamento = 256

out 90h,al ; espaço de

out dx,al ; endereçamento = 65536

Op_Code Ender. ou DX

83

Paulo Maciel

Modos de Endereçamento de Dados

Modo de Endereçamento de 32 bits

Reg. de Seg.

Reg. de Base

Reg. de Índice

Fator de Escala

Deslocamento

Endereço

*

CS,DS,ES,FS,GS,SS

EAX,EBX,ECX,EDX,EBP,ESI,EDI,ESP

EAX,EBX,ECX,EDX,EBP,ESI,EDI

{1,2,4,8}

Nada, 8 bits, 32 bits

Ex.:

MOV EAX,[EBX][ECX*4+6]

84

Paulo Maciel

Família Intel P5 e P6

Year Type Transistors Technology Clock Issue Word L1 cache L2 cache

(x1000) (mm) (MHz) format

1993 Pentium 3100 0.8 66 2 32-bit 2 X 8 kB

1994 Pentium 3200 0.6 75-100 2 32-bit 2 X 8 kB

1995 Pentium 3200 0.6/0.35 120-133 2 32-bit 2 X 8 kB

1996 Pentium 3300 0.35 150-166 2 32-bit 2 X 8 kB

1997 Pentium MMX 4500 0.35 200-233 2 32-bit 2 X 16 kB

1998 Mobile Pentium MMX 4500 0.25 200-233 2 32-bit 2 X 16 kB

1995 PentiumPro 5500 0.35 150-200 3 32-bit 2 X 8 kB 256/512 kB

1997 PentiumPro 5500 0.35 200 3 32-bit 2 X 8 kB 1 MB

1998 Intel Celeron 7500 0.25 266-300 3 32-bit 2 X 16 kB --

1998 Intel Celeron 19000 0.25 300-333 3 32-bit 2 X 16 kB 128 kB

1997 Pentium II 7000 0.25 233-450 3 32-bit 2 X 16 kB 256 kB/512 kB

1998 Mobile Pentium II 7000 0.25 300 3 32-bit 2 X 16 kB 256 kB/512 kB

1998 Pentium II Xeon 7000 0.25 400-450 3 32-bit 2 X 16 kB 512 kB/1 MB

1999 Pentium II Xeon 7000 0.25 450 3 32-bit 2 X 16 kB 512 kB/2 MB

1999 Pentium III 8200 0.25 450-1000 3 32-bit 2 X 16 kB 512 kB

1999 Pentium III Xeon 8200 0.25 500-1000 3 32-bit 2 x 16 kB 512 kB

2000 Pentium 4 42000 0.18 1500 3 32-bit 8kB / 12kµOps 256 kB

P5

P6

Incluindo cache L2

NetBurst

85

Paulo Maciel

Arquitetura do Pentium

Bus Unit

Page

Unit

8kb

instruction

cache

TLB

Branch

target

buffer

P b I d

r u n e

e f s c

f f t o

e e r d

t r u e

c t.

h

Control

ROM

C

o

n u

t n

r i

o t

l

8kb

data

cache

TLB

Floating

point registers

256

Data bus - 64 bitsAdd. Bus

32 bitsControl bus

Add. Data

32Address bus - 32 bits

Data bus - 64 bits

Add.

generate

V pipe

Add.

generate

U pipe

Integer

register

file

ALU

V pipe

ALU

U pipeShifter

Instruction pointer

Branch target address

32

Floating

point unit

Prefetch

address

86

Paulo Maciel

Arquitetura do Pentium

Dois pipelines de 5 estágios: U e V

Estágios

PF - prefetch

D1 - instruction decode

D2 - address generate

EX - execute, cache, ALU access

WB - writeback

87

Paulo Maciel

Arquitetura do Pentium

256 bits

P b I d

r u n e

e f s c

f f t o

e e r d

t r u e

c t.

h

Prefet.

Buffer

V32 bytes

Prefet.

Buffer

U32 bytes

256 bits

Decod.

D1

V

Decod.

D1

U

88

Paulo Maciel

Decod.

D2

V

Decod.

D2

U

Arquitetura do Pentium

Decod.

D1

V

Decod.

D1

U

Ger.

End.

V

Ger.

End.

U

Para o BTB

Para o

BTB

89

Paulo Maciel

Decod.

D2

V

Decod.

D2

U

Arquitetura do Pentium

Decod.

D1

V

Decod.

D1

U

Unidade de

Microcódigo

ALU

V

ALU

UREG

90

Paulo Maciel

Decod.

D2

V

Decod.

D2

U

Arquitetura do Pentium

Decod.

D1

V

Decod.

D1

U

Unidade de

Microcódigo

Conrole

ADD DIV MUL

FPU

Reg. File

Dados

91

Paulo Maciel

Arquitetura do Pentium

Execução Super-Escalar

Ambas as instruções devem ser

simples.

Sem dependência de dados.

As instruções não podem ter

modos de endereçamento

imediato e indireto.

Instruções com prefixo só

podem ser executadas no

pipelin U.

Não requerem micro-código para serem executadas. Normalmente levam 1 ciclo de clock para serem executadas.

ADD AX,BX (não podem ser executadas

ADD AX,CX em paralelo)

MOV TABLE[SI],7

MOV ES:[DI],AL

92

Paulo Maciel

Arquitetura do Pentium

Execução Super-EscalarCiclos 1 2 3 4 5

de clock

I1 I2 I3 I4 I5 I6 I7 I8 I9 I10

I1 I2 I3 I4 I5 I6 I7 I8

I1 I2 I3 I4 I5 I6

I1 I2 I3 I4

I1 I2

PF

D1

D2

EX

WB

93

Paulo Maciel

Previsão Dinâmica de Desvio

instruction

cache

TLB

Branch

target

buffer

P b I d

r u n e

e f s c

f f t o

e e r d

t r u e

c t.

h

256

Instruction pointer

Branch target address

Prefetch

address

H:11

P:TH:10

P:T

H:00

P:NT

H:01

P:T

NT

T

NTT

NT

T

NT

T

Address Instruction Targ. Add. History Prediction

.

.

.

94

Paulo Maciel

Barramento de Dados

Pentium

64 Bit

Dev.32 Bit

Dev. 16 Bit

Dev. 8 BitDev.

A31:A3

BE7:BE0 A2,BE3:

BE0A2,A1

BHE,BLEA2,A1,A0

.Add.

Trans

95

Paulo Maciel

Coerência de Cache em Sistemas

Multiprocessadores

Protocolo de coerência de Cache MESI

Modified - a linha corrente foi modificada (diferente da informação na memória principal) e pertence a uma única cache.

Exclusive - linha não modificada e exclusiva de uma única cache. Escrevendo-se nesta linha, esta passa para o estado Modified.

Shared - linha corrente

pertence a mais de uma

cache. Ao escrever-se

nesta linha, um

writethrough é gerado e

invalia-se as outras cópias

em outras caches.

Invalid - a linha corrente

está vazia. Uma leitura

desta linha gera um miss.

96

Paulo Maciel

Coerência de Cache em Sistemas

Multiprocessadores

Barramento

I

cache

I

cache

I

cache

I

cache

D

cache

D

cache

D

cache

D

cache

X=7

X=30X=10

P1

P2

p3

p4

Pentium III

Bus Interface Unit

Instruction Fetch Unit

(com I-cache)

Res

erva

tio

n S

tati

on

Un

it

Cache L2Bus externo

Memory

Reorder

Buffer

D-cache

Unit

Instruction

Decode

Unit

Memory

Interface

Unit

Functional

Units

Microcode

Instruction

SequencerReorder

Buffer

&

Retirement

Register

File

Branch

Target

Buffer

Register

Alias

Table

98

Paulo Maciel

Pentium III

A instruction fetch unit (IFU) lê a I-cache, baseado no IP, no BTB, e

interrupção.

Branch prediction:

BTB contêm 512 entradas com informações sobre a “história” e

endereços destino (previstos).

Penalidades devido a Branch misprediction: pelo menos 11 cíclos, em

média 15 cíclos

History bits: 4

99

Paulo Maciel

Previsão Dinâmica de Desvio

H:11

P:TH:10

P:T

H:00

P:NT

H:01

P:T

NT

T

NTT

NT

T

NT

T

Address Instruction Targ. Add. History Prediction

.

.

.

Instruction

Decode

Unit256

Instruction

cache

Branch

target

buffer

Instruction pointer

Branch target address

Prefetch

address

Instruction

Fetch

Unit

H:XXXX – No Pentium 2,3

I-cache

Instruction Fetch Unit

Next_IP

BranchTarget

Buffer

Microcode

Instruc.Sequencer

RegisterAlias

Table

Instruction

Decode

Unit

in-order section Pentium 3

Pentium

100

Paulo Maciel

Pentium III

A instruction decoder unit (IDU) é formada por três decodificadores:

As instruções IA-32 são “quebradas” em micro-operações (mops). Cada

mops possui dois operandos fonte e um operando destino. As mops têm

comprimento fixo.

A maioria das IA-32 são convertidas em uma única mops (por qualquer

um dos decodificadores).

Algumas instruções são transformadas (decodificadas) em até 4 mops

(1,2,3 e 4) pelo general decoder.

Instruções mais complexas apontam para micro-códigos no microcode

instruction sequencer (MIS) que gerará o fluxo apropriado de mops.

101

Paulo Maciel

Unidade de Busca e decodificação -

Fetch/Decode Unit

Sim

ple

Dec

od

er

IA-32

instructions

Alignment

Sim

ple

Dec

od

er

Gen

era

l D

eco

der

op1 op2 op3

I-cache

Instruction Fetch Unit

Next_IP

Branch

Target

Buffer

Microcode

Instruction

Sequencer

Register

Alias

Table

Instruction

Decode

Unit

in-order section instruction decoder unit (IDU)

102

Paulo Maciel

Pentium III

As mops são enviadas para register alias table (RAT), onde ocorre a

renomeação de registradores. As referências aos registradores lógicos (IA-32)

são convertidas em referências aos registradores físicos (40 registradores).

As mops prosseguem para reorder buffer (ROB, 40 entradas) e para

reservation station unit (RSU, 20 entradas).

Res

erva

tio

n S

tati

on

Un

itFunctional

Units

Reorder

Buffer

&

Retirement

Register

File

Register

Alias

Table

103

Paulo Maciel

Seção de Execução for a de ordem

O envio das mops ao ROB é feito na ordem do programa.

As mops são enviadas para RSU, que possui 20 reservation

stations (RS), cada uma capaz de executar uma mop.

As mops são enviadas às unidades funcionais de acordo com a

dependência de dados e de recursos, sem observar a ordem do

programa.

A RSU tem cinco portas e pode enviar até cinco mops por cíclo.

Issue/Execute Unit

to/from

Reorder

Buffer

Port 0

Port 1

Port 2

Port 3

Port 4

Res

erv

atio

n S

tati

on

Unit

MMX

Functional UnitFloating-point

Functional Unit

Integer

Functional Unit

MMX

Functional UnitJump

Functional Unit

Integer

Functional Unit

Load

Functional Unit

Store

Functional Unit

Store

Functional Unit

105

Paulo Maciel

Latência e throughtput no Pentium III FUs

RSU Port FU Latency Throughput

Integer arithmetic/logical 1 1

Shift 1 1

Integer mul 4 1

Floating-point add 3 1

Floating-point mul 5 0.5

Floating-point div long nonpipelined

MMX arithmetic/logical 1 1

MMX mul 3 1

Integer arithmetic/logical 1 1

MMX arithmetic/logical 1 1

MMX shift 1 1

2 Load 3 1

3 Store address 3 1

4 Store data 1 1

0

1

106

Paulo Maciel

Memória Cache

Princípio da Localidade

Instruções

Dados

Operação

Processador CacheMemória

MOV CX,1000

SUB AX,AX

Next: ADD AX,[SI]

MOV [SI],AX

INC SI

LOOP Next

107

Paulo Maciel

Memória Cache

Princípio da Localidade

Tacc=HitRate Tcache+(1- HitRate) (Tcache+Tmem)

Tcache=10 ns

Tmem= 70 ns

HitRate= 0,9 Tacc= 17 ns

Processador CacheMemória

108

Paulo Maciel

Memória Cache

Política de Busca

Usada para decidir quando e quais

informações buscar na CACHE

Demanda

Pré-busca

109

Paulo Maciel

Memória Cache

Política de Busca

Usada para decidir quando e quais

informações buscar na CACHE

Demanda

Busca uma linha i quando

esta se faz necessário

Pré-busca

Busca a linha i+1 quando a

linha i for referida

110

Paulo Maciel

Memória Cache

Política de Escrita

O momento em que uma palavra deve ser

alterada na memória principal, após

uma escrita, depende da política de

escrita.

Writethrough

Garante consistência dos dados

Aumenta o tráfego no

barramento

Writeback

Reduz o tráfego no barramento

Necessita de mecanismos para

manutenção de concist₨ncia

111

Paulo Maciel

Memória Cache

Política de Substituição

Define como uma linha da memória

CACHE deve ser substituída.

RAND - Aleatório

FIFO - First in First Out

LRU - Least Recently Used

112

Paulo Maciel

Memória Cache

Organização

Mapeamento Direto

Vantagem

Simplicidade do Hardware

Algoritmo de Substituição ₫ simples

Desvantagem

Não é flexível

Diversos blocos de memória são mapeados na

mesma linha da CACHE

20 7 5 Endereço de 32 bits

Tag Linha

TAG

TAG

TAG

Dado

Dado

Dado

.

.

.

.

.

.

0

1

127

25 = 32 bytes

Número de Linhas

27 = 128

113

Paulo Maciel

Memória Cache

Organização

Completamente Associativa

Vantagem

Flexibilidade

Desvantagem

Complexidade do Hardware

27 5 Endere₤o de 32 bits

Tag Linha

TAG

TAG

TAG

Dado

Dado

Dado

.

.

.

.

.

.

0

1

127

25 = 32 bytes

114

Paulo Maciel

Memória Cache

Organização

Associativa por Conjunto

(Set Associative)

TAG

TAG

TAG

Dado

Dado

Dado

.

.

.

.

.

.

0

1

63

25 = 32 bytes

TAG

TAG

TAG

Dado

Dado

Dado

.

.

.

.

.

.

25 = 32 bytes

21 6 5 Endereço de 32 bits

Tag Linha

115

Paulo Maciel

Memória Cache

Translation Lookaside Buffer

16 4 12 Endereço Linear

Tag LinhaEndereço linear

Endereço Físico

para

Cache

TLB T

T

T

End

End

End

.

.

.

.

.

.

0

1

T

T

T

End

End

End

.

.

.

.

.

.

T

T

T

End

End

End

.

.

.

.

.

.

0

1

15

T

T

T

End

End

End

.

.

.

.

.

.

20 12Endereço Físico

para Cache

116

Paulo Maciel

Coerência de Cache em Sistemas Multiprocessadores

Protocolo de coerência de Cache

MESI

Modified - a linha corrente foi

modificada (diferente da informação

na memória principal) e pertence a

uma única cache.

Exclusive - linha não modificada e

exclusiva de uma única cache.

Escrevendo-se nesta linha, esta passa

para o estado Modified.

Shared - linha corrente pertence a mais de

uma cache. Ao escrever-se nesta linha, um

writethrough é gerado e invalia-se as outras

cópias em outras caches.

Invalid - a linha corrente está vazia. Uma

leitura desta linha gera um miss.

117

Paulo Maciel

Coerência de Cache em Sistemas Multiprocessadores

Barramento

I

cache

I

cache

I

cache

I

cache

D

cache

D

cache

D

cache

D

cache

X=7

X=30X=10

P1

P2

p3

p4

118

Paulo Maciel

Dimensões das Caches

Pentium

Um nível de cache interno.

Cache de dados : 8kb

Cache de instruções: 8kb

Pentium MMX

Um nível de cache interno

Cache de dados: 16kb

Cache de Instruções: 16kb

Petium II

Dois níveis de cache internos.

Cache de dados nível 1: 16kb

Cache de instrução nível 1: 16kb

Cache nível 2: 512kb

Pentium Pro

Dois níveis de cache internos.

Cache dados nível 1: 8kb

Cache de instrução nível 1: 8kb

Cache nível 2: 256kb, 512kb, 1MB

Petium III

Dois níveis de cache internos.

Cache de dados nível 1: 16kb

Cache de instrução nível 1: 16kb

Cache nível 2: 512kb

119

Paulo Maciel

Operações de Barramento

M/IO D/C W/R Cache KEN Descrição

0 0 0 1 x Recon. Int.

0 0 1 1 x Ciclo Especial

0 1 0 1 x Leit. I/O

0 1 1 1 x Escr. I/O

1 0 0 1 x Leit. de Código ñ cache

1 0 0 x 1 Leit. de Código ñ cache

1 0 0 0 0 Leit. de Código em Rajada de 32 bytes

1 1 0 1 x Leit. Mem. Acima de 8 bytes ñ cache

1 1 0 x 1 Leit. Mem. Acima de 8 bytes ñ cache

1 1 0 0 0 Leit. Mem em Rajada de 32 bytes

1 1 1 1 x Escr. Mem. Acima de 8 bytes ñ cache

1 1 1 0 x Escrita de 32 bytes - writeback

120

Paulo Maciel

Operações de Barramento

Ciclos Especiais

BE7 BE6 BE5 BE4 BE3 BE2 BE1 BE0 Ciclo

1 1 1 1 1 1 1 0 shutdown

1 1 1 1 1 1 0 1 flush cache

1 1 1 1 1 0 1 1 halt

1 1 1 1 0 1 1 1 writeback

1 1 1 0 1 1 1 1 flush ack.

1 1 0 1 1 1 1 1 br. tr. mess

121

Paulo Maciel

Ciclos de Leitura/Escrita

Clk

ADS

Address

W/R

BRDY

Data

Válido Válido

P/ CPU da CPU

t1 t2 ti t1 t2 ti

122

Paulo Maciel

Barramento de Dados

Pentium

64 Bit

Dev.32 Bit

Dev. 16 Bit

Dev. 8 BitDev.

A31:A3

BE7:BE0 A2,BE3:

BE0A2,A1

BHE,BLEA2,A1,A0

.Add.

Trans

123

Paulo Maciel

Ciclos Burst

O pentium suporta ciclos de leitura e escrita em rajada de 32

bytes.

Cada oito bytes são transferidos a cada ciclo de clock.

O Processador passa o endereço inicial, os demais endereço devem ser

gerados pelo sistema de memória

1° end. 2 ° end. 3° end. 4° end.

0 8 10 18

8 0 18 10

10 18 0 8

18 10 8 0

124

Paulo Maciel

Ciclos Burst

Clk

ADS

Address

W/R

BRDY

CACHEKEN

Data

Válido

t1 t2 t2 t2 t2 ti

P/ CPU P/CPUP/ CPU P/ CPU

125

Paulo Maciel

Operações Locked e BOFF

Lock

Operacões atômicas não podem ser

quebradas em operações menores

Semáforos

Requerem leitura seguida de escrita

XCHG

LOCK é ativado indicando que o ciclo

no ciclo corrente o barramento está

bloqueado e não pode ser interrompido

BOFF

Este sinal de entrada prover uma

forma para que em sistemas

multiprocessados um Pentium possa

“tomar conta” do barramento.

Este terminal(BOFF) ₫ verificado a

cada ciclo de clock. Caso o seu valor

seja baixo, o barramento ₫ colocado

em alta impedância.

126

Paulo Maciel

Operações Bus Hold e Reconhecimento de Interrupção

Bus Hold

Uma segunda forma para que o

processador “tome conta”do

barramento.

A entrada HOLDé verificada a

cada ciclo de clock, caso seja alto,

no final do ciclo de barramento, o

barramento é colocado em alta

impedância.

A saída HLDA é ativada para

indicar que o Pentium está neste

estado.

Reconhecimento de Interrupção.

Dois destes ciclos são gerados em

reconhecimento a solicitação de

interrupção (INTR).

M/IO=D/C=W/R =0

CACHE = 1

127

Paulo Maciel

Reconhecimento de Interrupção

„148 „374

D Q

clk

Pentium

vcc

.

.

.

.

.

.

vcc

clr

D0

D7

M/IO

D/C

W/R

ADS

INTR

INT0

INT7

A2

A1

A0

GS

EI

128

Paulo Maciel

Cache Flush e Shutdown

Cache Flush

Como resposta a uma entrda ativa no

terminal FLUSH o Pentium executa o

writeback nas linhas modificadas e as

torna inválidas

BE1 =0

Quando o writeback é executado o

processador executa um cache ack. para

informar que na cache foi realizado um

flush.

BE4 =0

Shutdown

Se o processador detecta um

erro de paridade um ciclo

shutdown é gerado.

A execução é suspensa até o

processador que ocorrar um

NMI, INIT ou RESET

Cache internas permancem

inalteradas

BE0=0

129

Paulo Maciel

Halt e Inquire Cycles

Halt

Ciclo realizado quando da

execução de uma instrução

HLT

Similar ao shutdown exceto

que a execução só será

retomada pelo sinal INTR

BE2 = 0

Inquire Cycle

Usado para manter a coerência de

cache

Ao detectar-se (no snooping cycle)

um acesso, por outro processador, a

uma posição de memória, o

processador gera um inquire interno

para verificar se esta posição esta na

cache interna. Caso esteja, a cache

pode ser modificada.

130

Paulo Maciel

Tipo de Instruções

Transferência de dados

Aritmética

Manipulação de bit

Laços e saltos

Subrotinas e interrupções

Controle

String

131

Paulo Maciel

Tipo de Instruções

Instruções Monádicas

inst opr dest

opr dest - operando destino

Instruções Diádicas

– inst opr dest, opr fonte

opr dest - operando destino

opr fonte - operando fonte

132

Paulo Maciel

Transferência de Dados

Instruções

MOV movimentacao

MOVSX ext. sinal

MOVZX ext. c/ zero

PUSH empilhamento

PUSHW/PUSHD imedit./ 32 bits

PUSHA/PUSHAD todos reg/ 32 bits

PUSHF/PUSHFD 16 bits flags/32 bits

– POP desemp.

– POPA/POPAD todos reg/32 bits

– POPF/POPFD 16 bits flags/32 bits

– IN input

– OUT output

– XCHG permuta

– XLAT translate-table

– LEA carga de end. efetivo

– LDS e similares carga de ponteiro

– BSWAP troca

– LAHF carga de flags em AH

– SAHF arm. de AH nos flags

133

Paulo Maciel

Transferência de Dados

Sintaxe:

MOV OP_DEST,OP_DEST

EX.: MOV AL,01

MOV AX,[BX+2]

MOV AL,[0400H]

134

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

MOVSX OP_DEST,OP_DEST

EX.: MOVSX AX,AL

135

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

MOV OP_DEST,OP_FONT

EX.: MOVZX AX,AL

136

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

PUSH OP_FONTE

EX.: PUSH BX

137

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

PUSHW/PUSHD OP_FONTE (imedit./ 32 bits)

EX.: PUSHW 34ADh

PUSHD EAX - PUSHD pode ser usado para

empilhar valor de um reg. de 32 bits

138

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

PUSHA/PUSHAD (todos reg/ 32 bits)

EX.: PUSHA

PUSHAD

139

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

PUSHF/PUSHFD 16 bits flags/32 bits

EX.: PUSHF

PUSHFD

140

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

POP OP_DEST

EX.: POP BX

141

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

POPA/POPAD todos reg/32 bits

EX.: POPA

POPAD

142

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

POPF/POPFD 16 bits flags/32 bits

EX.: POPF

POPFD

143

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

IN ACUMULADOR,END/DX input

EX.: IN AL,60H

IN AL,DX

144

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

OUT END/DX,ACUMULADOR output

EX.: OUT DX,AL

OUT 80H,AX

145

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

XCHG OP_DEST,OP_FONTE permuta

EX.: XCHG AL,AH

XCHG AL[BX]

146

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

XLAT translate-table

O registrador BX deve ter o endere₤o inicial da

lista.

O valor de AL ₫ o índice.

EX.: MOV AL,3

MOV BX,0400H

XLAT

147

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

LEA OP_DEST,LABEL carga de end.

EX.: LEA BX,LISTA

148

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

LDS OP_DEST,OP_FONTE carga de ponteiro

OP_DEST - registrador

LES,LFS,LGS,LSS - s₧o similares

EX.: LDS BX,[SI]

LES DX,end_lista

149

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

BSWAP OP_DEST - troca (swapping)

- OP_DEST - registrador de 32 bits

EX.: MOV EAX,12345678H

BSWAP EAX

EAX = 78563412H

150

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

LAHF - Carrega AH com flags

EX.: POPF

LAHF

151

Paulo Maciel

Transfer₨ncia de Dados

Sintaxe:

SAHF - Armazena AH nos flags

EX.: MOV AH,0FFH

SAHF

152

Paulo Maciel

Aritmética

Instruções

– ADD adição

– ADC

– INC incremento

– SUB subtração

– SBB

– DEC decremento

– CMP comparação

– MUL multiplicação

– IMUL

– DIV divisão

– IDIV

– NEG complemento a 2

– CBW mudança de módulo

– CWD

– DAA ajuste BCD

– DAS

– AAA ajuste ASCII

– AAS

– AAM

– AAD

153

Paulo Maciel

Aritm₫tica

Sintaxe:

ADD OP_DEST,OP_DEST - adi₤₧o

EX.: ADD AL,CH

ADD CX,[SI]

ADD DX,4

154

Paulo Maciel

Aritm₫tica

Sintaxe:

ADC OP_DEST,OP_DEST - adi₤₧o com vai um

EX.: ADC AL,CH

ADC [BX],DX

ADC DX,4

155

Paulo Maciel

Aritm₫tica

Sintaxe:

INC OP_DEST - Incremento

EX.: INC AL

INC [BX]

INC [0400H]

156

Paulo Maciel

Aritm₫tica

Sintaxe:

SUB OP_DEST,OP_DEST - Subtra₤₧o

EX.: SUB AL,CH

SUB CX,[0300H]

SUB DX,4

157

Paulo Maciel

Aritm₫tica

Sintaxe:

SBB OP_DEST,OP_DEST - Subtra₤₧o com vem um

EX.: SBB AL,CH

SBB CX,[0300H]

SBB DX,4

158

Paulo Maciel

Aritm₫tica

Sintaxe:

DEC OP_DEST - Decremento

EX.: DEC AL

DEC [BX]

DEC [0400H]

159

Paulo Maciel

Aritm₫tica

Sintaxe:

CMP OP_DEST,OP_DEST - Compara₤₧o

EX.: CMP AL,CH

CMP CX,[0300H]

CMP DX,4

160

Paulo Maciel

Aritm₫tica

Sintaxe:

CMPXCHG OP_DEST, OP_FONTE - compara e permuta

Compara o operando destino com o acumulador e caso o acumulador seja igual ao operando destino, o operando fonte ₫ copiado no destino. Caso sejam diferentes, o valor do acumulador ₫ substituído pelo valor do destino.

EX.: CMPXCHG BL,CL

CMPXCHG CX,[0300H]

CMPXCHG EDX,EBX

10 10 30 10 30 30

AL BL CL AL BL CL

10 20 30

20 20 30

AL BL CL

AL BL CL

161

Paulo Maciel

Aritmética

Sintaxe:

MUL OP_FONTE - multiplicação

EX.: MUL BL

MUL DX

MUL ECX

162

Paulo Maciel

Aritmética

Sintaxe:

IMUL OP_FONTE - multiplicação sinalizada

EX.: IMUL BL

IMUL DX

IMUL ECX

163

Paulo Maciel

Aritmética

Sintaxe:

DIV OP_FONTE - divisão

EX.: DIV BL

DIV DX

DIV ECX

164

Paulo Maciel

Aritmética

Sintaxe:

IDIV OP_FONTE - divisão sinalizada

EX.: IDIV BL

IDIV DX

IDIV ECX

165

Paulo Maciel

Aritm₫tica

Sintaxe:

NEG OP-DEST - complemento de dois

EX.: NEG AL

NEG [0200H]

NEG DX

166

Paulo Maciel

Aritm₫tica

Sintaxe:

CBW - converte byte de AL em palavra etendendo-se o sinal

CWD - converte a palavra de AX em dupla-palavra

estendendo-se o sinal (DX:AX)

CWDE - converte a palavra de AX em dupla-palavra

estendendo-se o sinal (EAX)

CDQ - converte a dupla-palavra de EAX em quádrupla-

palavra estendendo-se o sinal (EDX:EAX)

EX.: CBW CWDE

CWD CDQ

167

Paulo Maciel

Aritm₫tica

Sintaxe:

DAA - ajuste decimal para adi₤₧o (BCD compactado)

EX.: MOV AL,15H

MOV BL,25H

ADD AL,BL ;AL=3AH

DAA ;AL=40H

168

Paulo Maciel

Aritm₫tica

Sintaxe:

DAS - ajuste decimal para subtra₤₧o (BCD-compactado)

EX.: MOV AL,10H

MOV BL,02H

SUB AL,BL ;AL=0EH

DAS ;AL=08H

169

Paulo Maciel

Aritm₫tica

Sintaxe:

AAA - ajuste ASCII para adi₤₧o

EX.: MOV AX,0033H

MOV BL,39H

ADD AL,BL ;AL=6CH

AAA ;AX=0102H

170

Paulo Maciel

Aritm₫tica

Sintaxe:

AAS - ajuste ASCII para subtra₤₧o

AAM - ajuste ASCII para multiplica₤₧o

AAD - ajuste ASCII para divis₧o

171

Paulo Maciel

Lógica e Manipulação de Bit

Instruções Lógicas

– NOT

– AND

– OR

– XOR

– TEST

Algumas Instruções Manipulação de bit

– SHL/SAL - desloc. esquerda

– SHR - deslc. direita

– SAR

– ROL - rotação

– ROR

– RCL

– RCR

172

Paulo Maciel

Lógicas

Sintaxe:

NOT OP-DEST - complemento de um

EX.: NOT AL

NOT [0200H]

NOT DX

173

Paulo Maciel

Lógicas

Sintaxe:

AND OP_DEST,OP_FONTE - opera₤₧o lógica e

EX.: AND AL,CH

AND CX,[SI]

AND DX,FFFFH

174

Paulo Maciel

Lógicas

Sintaxe:

OR OP_DEST,OP_FONTE - opera₤₧o lógica ou

EX.: OR AL,00H

OR CX,[SI]

OR DX,FFFFH

175

Paulo Maciel

Lógicas

Sintaxe:

XOR OP_DEST,OP_FONTE - opera₤₧o lógica ou exclusivo

EX.: XOR AL,CH

XOR CX,[SI]

XOR DX,DX

176

Paulo Maciel

Lógicas

Sintaxe:

TEST OP_DEST,OP_FONTE - opera₤₧o lógica e

EX.: TEST AL,CH

TEST CX,[SI]

TEST DX,FFFFH

177

Paulo Maciel

Lógicas

Sintaxe:

SETcc OP_DEST - atribui 01 a operando destino se a condi₤₧o

testada for verdadeira. Caso contrário, atribui-se 00.

EX.: SETZ AL

SETLE AX

SETNC DX

178

Paulo Maciel

Lógicas

Sintaxe:

BSF/BSR OP_DEST,OP_FONTE - procura pelo 1°bit igual a um no operando fonte a partir do LSB ou MSB. A posi₤₧o encontrada será informada em operando destino.

OP_DEST deve ser REG. de 16 ou 32 bits OP_FONTE deve ser REG. ou mem

de 16 ou 32 bits

EX.: BSF EAX,EBX

179

Paulo Maciel

Lógicas

Sintaxe:

BT/BTC,BTS,BTR OP_DEST,OP_FONTE - testa, complementa, seta ou reseta um bit do operando destino especificado no opernado fonte.

OP_DEST deve ser REG. de 16 ou 32 bits OP_FONTE deve ser REG. ou mem

de 16 ou 32 bits

EX.: BT AX,BX

BTC AX,15

BTS AX,1

BTR AX,0

180

Paulo Maciel

Lógica e Manipulação de Bit

Algumas Instruções Manipulação de bit

– SHL/SAL - desloc. esquerda

– SHR - deslc. direita

– SAR

– ROL - rotação

– ROR

– RCL

– RCR

181

Paulo Maciel

Lógica e Manipulação de Bit

Algumas Instruções Manipulação de bit

– SHL/SAL - desloc. esquerda

– SHR - deslc. direita

– SAR

– ROL - rotação

– ROR

– RCL

– RCR

182

Paulo Maciel

Lógica e Manipulação de Bit

Algumas Instruções Manipulação de bit

– SHL/SAL - desloc. esquerda

– SHR - deslc. direita

– SAR

– ROL - rotação

– ROR

– RCL

– RCR

183

Paulo Maciel

Laços, Desvios, Subrotinas e InterrupçõesLaços e Desvios

– JMP -desvio

incondicional

– Jcc - desvio condicional

– JCXZ

– LOOP - laço

– LOOPE

– LOOPNE

Subrotinas e Interrupções

– CALL - subrotinas

– INT - interrupções

– INTO

– RET - retorno

– IRET

184

Paulo Maciel

Laços, Desvios, Subrotinas e InterrupçõesDesvios

185

Paulo Maciel

Controle

– CLC - Limpa CF

– STC - Faz CF=1

– CMC - Complementa CF

– CLD - Limpa DF

– STD - Faz DF=1

– CLI - Limpa IF

– STI - Faz IF=1

186

Paulo Maciel

Controle

Sintaxe:

HLT - Parada

Para o sistema. O processador fica neste estado at₫ ocorrer um reset ou uma interrup₤₧o NMI ou

INTR.

187

Paulo Maciel

Controle

Sintaxe:

LOCK - Instru₤₧o prefixo

Bloqueia o barramento

EX.: LOCK XCHG

Sintaxe:

NOP - No operation

N₧o executa nada.

188

Paulo Maciel

Strings

Sintaxe:

REP - Instru₤₧o prefixo

Repete enquanto CX for diferente de zero. Deve ser usada

antes das instru₤ões MOVS, STOS, INS e OUTS

EX.: REP MOSVB

189

Paulo Maciel

Strings

Sintaxe:

REPE/REPZ - Instru₤₧o prefixo

Repete enquanto CX for diferente de zero e ZF = 1. Deve ser

usada antes das instru₤ões C,MPS e SCAS.

EX.: REPE CMPSB

190

Paulo Maciel

Strings

Sintaxe:

REPNE/REPNZ - Instru₤₧o prefixo

Repete enquanto CX for diferente de zero e ZF = 0. Deve ser

usada antes das instru₤ões C,MPS e SCAS.

EX.: REPNE SCASW

191

Paulo Maciel

Strings

Sintaxe:

MOVS/ MOVSB/ MOVSW/ MOVSD - move

Move o elemento apontado por SI no segmento de dados para área

apontada por dI no segmento de extra. DI e SI ser₧o

incrementados ou decrementados de 1, 2, 0u 4 dependendo do flag

DF e do tipo do dado.

EX.: MOV AX,0300H

MOV ES,AX

XOR DI,DIH

MOV AX,0500H

MOV DS,AX

XOR SI,SIH

MOV CX,5H

CLD

MOV AL,4EH

REP MOVSB

192

Paulo Maciel

Strings

Sintaxe:

CMPS/ CMPSB/ CMPSW/ CMPSD - compara

Compara o elemento apontado por DI no segmento extra com o

elemento apontado por SI no segmento de dados. DI e SI ser₧o

incrementados ou decrementados de 1, 2, 0u 4 dependendo do flag

DF e do tipo do dado.

EX.: MOV AX,0300H

MOV ES,AX

XOR DI,DIH

MOV AX,0500H

MOV DS,AX

XOR SI,SIH

MOV CX,5H

CLD

MOV AL,4EH

REPE CMPSB

193

Paulo Maciel

Strings

Sintaxe:

SCAS/ SCASB/ SCASW/ SCASD - scan

Compara o elemento apontado por DI no segmento extra com o

conteúdo do acumulador (AL,AX ou EAX). DI será incrementado

ou decrementado de 1, 2, 0u 4 dependendo do flag DF e do tipo do

dado.

EX.: MOV AX,0300H

MOV ES,AX

MOV DI,6H

MOV CX,6H

STD

MOV AL,4EH

REPNZ SCASB

194

Paulo Maciel

Strings

Sintaxe:

LODS/ LODSB/ LODSW/ LODSD - carrega

Carrega o elemento apontado por SI no segmento de dados no

acumulador (AL,AX ou EAX). SI será incrementado ou

decrementado de 1, 2, 0u 4 dependendo do flag DF e do tipo do

dado.

EX.: MOV AX,0510H

MOV DS,AX

MOV SI,5H

STD

LODSW

195

Paulo Maciel

Strings

Sintaxe:

STOS/ STOSB/ STOSW/ STOSD - armazena

Armazena na área apontada por DI no segmento de extra o conteúdo do acumulador

(AL,AX ou EAX). DI será incrementado ou decrementado de 1, 2, 0u 4 dependendo

do flag DF e do tipo do dado.

EX.: MOV AX,04A8H

MOV ES,AX

MOV DI,8H

CLD

MOV AL,‟M‟

REP STOSB

196

Paulo Maciel

Diretivas do Macro-Assembler

Programa .EXE Programa .COM

Tamanho: memória total 64 Kbytes

Ponto de Entrada: qualquer ponto offset 100h

Arquivo produzido deve ser convertido

pelo link: executável pelo EXE2BIN

PSP: apontado por DS nos 100h bytes iniciais

e ES do segmento

197

Paulo Maciel

Formato de um Programa .COM

C1 SEGMENT

ASSUMECS:C1, DS:C1,ES:C1,SS:C1

ORG 100H

I: JMP P1

DEFINIÇÃO DE VARIÁVEIS

P1 PROC NEAR

CORPO DO PROGRAMA

MOV AH,4CH

INT 21H

P1 ENDP

R1 PROC

CORPO DA ROTINA

RET

R1 ENDP

C1 ENDS

END

198

Paulo Maciel

Formato de um Programa .EXE

S1 SEGMENT STACK „STACK‟

DW 100 DUP(?)

S1 ENDS

D1 SEGMENT

DEFINIÇÃO DE VARIÁVEIS

D1 ENDS

C1 SEGMENT

ASSUME CS:C1, DS:D1,ES:D1,SS:S1

P1 PROC FAR

MOV AX,D1

MOV DS,AX

MOV ES,AX

CoRPO DO PROGRAMA

MOV AH,4CH

INT 21H

P1 ENDP

R1 PROC NEAR

CORPO DA ROTINA

RET

R1 ENDP

C1 ENDS

END P1

199

Paulo Maciel

Diretivas do Macro-Assembler

COMMENT - INSERÇÃO DE COMENTÁRIO

FORMATO: COMMENT * COMENTÁRIO *

EXEMPLO: COMMENT * MEU PRIMEIRO PROGRAMA*

ASSUME - INFORMA AO MONTADOR A FUNÇÃO DE CADA SEGMENTO.

FORMATO: ASSUME REG_SEG:NOME_SEG, ..., REG_SEG:NOME_SEG

EXEMPLO: ASSUME CS:C1,DS:D1,ES:D2,SS:S1

ORG - ESPECIFICA O ENDEREÇO PARA UMA INSTRUÇÃO OU DADO.

FORMATO: ORG EXPRESSÃO

EXEMPLO: ORG 100H

200

Paulo Maciel

Diretivas do Macro-Assembler

SEGMENT - DEFINE SEGMENTO

FORMATO: NOME SEGMENT [ALINHM.][COMB.][CLASSE]

ALINHAMENTO: Define onde inicia o segemento

BYTE - 1° byte livre

WORD - 1° endereço par livre

DWORD - 1° endereço divisível por 4 livre

PARA - 1° endereço divisível por 16 livre

PAGE - 1° endereço divisível por 256 livre

201

Paulo Maciel

Diretivas do Macro-Assembler

SEGMENT - DEFINE SEGMENTO

FORMATO: NOME SEGMENT [ALINHM.][COMB.][CLASSE]

COMBINAÇÃO: Define como combinar segmentos de mesmo nome

PUBLIC - concatena todos os segementos de mesmo nome

de forma a se obter um único segemento

STACK - O mesmo que o tipo PUBLIC. Para segementos

de pilha.

COMMOM - cria um segmento pela superposição de

segmentos com mesmo nome.

AT endereço - define o endereço inicial de um segemento.

Este segmento não contém inicialização de

dados o código. Usado para definir um

segmento em uma área de dados ou código

já existentes na memória.

202

Paulo Maciel

Diretivas do Macro-Assembler

SEGMENT - DEFINE SEGMENTO

FORMATO: NOME SEGMENT [ALINHM.][COMB.][CLASSE]

CLASSE: Define que os segmentos, embora de nomes diferente, mas de mesma

classe, devem ser agrupados na linkedição.

„CODE‟

„DATA‟

„STACK‟

203

Paulo Maciel

Diretivas do Macro-Assembler

ENDS - FINALIZAÇÃO DE SEGMENTO

FORMATO: NOME ENDS

EXEMPLO:

INICIO SEGMENT

P1 PROC FAR

....

...

RET

P1 ENDP

INICIO ENDS

204

Paulo Maciel

Diretivas do Macro-Assembler

END - Finalização do programa

FORMATO: END nome

nome é o ponto de entrada do programa.

205

Paulo Maciel

Diretivas do Macro-Assembler

DEFINIÇÃO DE ÁREA DE ARMAZENAMENTO

DB - DEFINE COMO BYTE

DW - DEFINE COMO WORD

DD - DEFINE COMO DOUBLE WORD

DQ - DEFINE COMO QUADWORD

DT - DEFINE COMO DEZ BYTES

FORMATO: NOME DB/DW/DD/DQ/DT VALOR/LISTA DEVALORES

EXEMPLO: X DB 2AH

LISTA DB 30D,43D,74D

Y DW 402BH

Z DB 01001110B

206

Paulo Maciel

Diretivas do Macro-Assembler

DEFINIÇÃO DE ÁREA DE ARMAZENAMENTO

DUP - Reserva área em memória

FORMATO: NOME (opcional) DB/DW/DD/DQ/DT número DUP(expressão)

EXEMPLO: X DB 10 DUP (2AH)

DQ 4 DUP(0)

Y DW 20 DUP (40)

Z DB 10 DUP(“Bom Dia”)

A DB 10 DUP(„A‟)

207

Paulo Maciel

Diretivas do Macro-Assembler

EQU - DEFINE CONSTANTE

FORMATO: NOME EQU VALOR

EXEMPLO:

CONST1 EQU 0

CONST2 EQU 4

CONST3 EQU CONST2 + 3

208

Paulo Maciel

Diretivas do Macro-Assembler

BYTE/WORD/..../NEAR/FAR PTR - FORÇA EXPRESSÃO A SER DE UM

TIPO BYTE, WORD, ....OU GERAR UM CÓDIGO DO TIPO NEAR OU FAR.

FORMATO:

BYTE/WORD/DWORD/QWORD/TBYTES/NEAR/FAR PTR

EXPRESSÃO

EXEMPLO:

X DB 02H

ROT PROC NEAR

MOV AX,WORD PTR X ....

CALL FAR PTR ROT

RET

ROT ENDP

209

Paulo Maciel

Diretivas do Macro-Assembler

BYTE/WORD/..../NEAR/FAR PTR - FORÇA EXPRESSÃO A SER DE UM TIPO BYTE, WORD, ....OU

GERAR UM CÓDIGO DO TIPO NEAR OU FAR.

FORMATO:

BYTE/WORD/DWORD/QWORD/TBYTES/NEAR/FAR PTR

EXPRESSÃO

EXEMPLO: X DB 02H ROT PROC NEAR

MOV AX,WORD PTR X ....

CALL FAR PTR ROT RET

... ROT ENDP

210

Paulo Maciel

Diretivas do Macro-Assembler

SHORT - USANDO-SE EM UMA INSTRUÇÃO JMP FAZ COM QUE

O MONTADOR GERE UM CÓDIGO SEJA DE APENAS DOIS BYTES.

O DESVIO NÃO PODE SER SUPERIOR A -128 OU +127 BYTES.

FORMATO: JMP SHORT NOME

211

Paulo Maciel

Diretivas do Macro-Assembler

OFFSET - FORNECE O DESLOCAMENTO DE UMA VARIÁVEL OU

RÓTULO DENTRO DO SEGMENTO ONDE ESTÁ DEFINIDO.

FORMATO: OFFSET EXPRESSÃO

EXEMPLO:

MENS DB „Bom Dia$

MOV DX,OFFSET MENS

212

Paulo Maciel

Diretivas do Macro-Assembler

SEG - FORNECE O SEGMENTO DE UMA VARIÁVEL OU RÓTULO.

FORMATO: SEG EXPRESSÃO

EXEMPLO :

MOV AX, SEG MENS

213

Paulo Maciel

Diretivas do Macro-Assembler

ESTRUTURAS - É uma coleção de objetos (dados) os quais podem ser lidos/escritos como um

único objeto. Os dados de uma estrutura podem ter diferentes tamanhos e podem acessados

simbolicamente.

FORMATO DA DECLARAÇÃO:

nome struc

declarações

nome ends

FORMATO DA DEFINIÇÃO DA VARIÁVEL

[nome] nome_da_estrutura <[valor_inicial [,valor_inicial]]>

214

Paulo Maciel

Diretivas do Macro-Assembler

ESTRUTURAS -

date STRUC

month db ?

day db ?

year dw ?

date ENDS

DADOS SEGMENT PARA 'DATA'

yesterday date <09,03,2000>

today date <09,04,2000>

tomorrow date <09,05,2000>

anotherday date <>

someotherdays date 20 DUP (<>)

DADOS ENDS

CODIGO SEGMENT PARA 'CODE'

ASSUME

CS:CODIGO,DS:DADOS,SS:PILHA

INICIO PROC FAR

MOV AX,DADOS

MOV DS,AX

MOV AL,yesterday.day

MOV AH,today.day

MOV DL,tomorrow.day

MOV anotherday.day,DL

LEA BX,someotherdays

MOV [BX].day,dl

215

Paulo Maciel

Diretivas do Macro-Assembler

MACRO - Possibilita atribuir um nome a um bloco de código e utiliza-lo, através deste

nome, no seu programa.

FORMATO DA DECLARAÇÃO:

nome macro [parâmetro[,parâmetro]]

statements

nome endm

FORMATO PARA CHAMAR A MACRO

nome [argumento [,argumento]]

216

Paulo Maciel

Diretivas do Macro-Assembler

MACRO -

DADOS SEGMENT PARA 'DATA'

RenataN1 db 06

RenataN2 db 08

Renatatpontos db ?

DADOS ENDS

totalpontos MACRO n1,n2

MOV AL,n1

MOV AH,n2

CLC

ADD AH,AL

ENDM

CODIGO SEGMENT PARA 'CODE'

ASSUME CS:CODIGO,DS:DADOS,SS:PILHA

INICIO PROC FAR

MOV AX,DADOS

MOV DS,AX

totalpontos RenataN1,RenataN2

MOV Renatatpontos,AH

MOV AH,4CH

INT 21H

INICIO ENDP

CODIGO ENDS

END INICIO

217

Paulo Maciel

Introdução ao NASMFormato de Arquivo Fonte para Geração de .com

; test source file for assembling to binary files

; build with:; nasm -f bin -o bintest.com

; bintest.asm;

;When run (as a DOS .COM file), this program

; Author: Paulo Maciel

; This file has .com structure

BITS 16 ORG 0x100

SECTION .text

start

Corpo do código

end mov ax,0x4c00

int 0x21

SECTION .data

Variárveis inicializadas

SECTION .bss

Variáveis não inicializadas

218

Paulo Maciel

Introdução ao NASMExemplo:Formato de Arquivo Fonte para Geração de .com

; test source file for assembling to binary files

; build with:; nasm -f bin -o bintest.com

; bintest.asm;

;When run (as a DOS .COM file), this program

; should print hello, world

; Author: Paulo Maciel

; This file has .com structure

; [x] Define a NASM local label

; [y] Reference a NASM local label

BITS 16 ORG 0x100

SECTION .text

start

mov byte [bss_sym],','

mov bx,[bssptr]

mov al,[bx]

mov bx,[dataptr]

mov [bx],al

mov cx,2.loop

mov dx,datasym ; [x]

mov ah,9

push cx

int 0x21

pop cx

loop .loop ; [y]

end mov ax,0x4c00

int 0x21

SECTION .data

datasym db 'hello world', 13, 10, '$' ;

bssptr dw bss_sym ;

dataptr dw datasym+5 ;

textptr dw end ;

SECTION .bssbss_sym resb 1 ;

219

Paulo Maciel

Introdução ao NASMFormato de Arquivo Fonte para Geração de .exe

; Demonstration of how to write an entire .EXE format program by

; using

; the `exebin.mac' macro package.

; NASM macro file to allow the `bin' output format to generate

; simple .EXE files by constructing the EXE header by hand.

; To build:

; nasm -fbin binexe.asm -o binexe.exe

; (; exebin.mac should be in current directory)

%include "exebin.mac"

EXE_begin

EXE_stack 64

section .text

mov ax,cs

mov ds,ax

Corpo do programa

mov ax,0x4c00

int 0x21

section .data

Variárveis inicializadas

SECTION .bss

Variáveis não inicializadas

EXE_end

220

Paulo Maciel

Introdução ao NASMExemplo:Formato de Arquivo Fonte para Geração de .exe

; Demonstration of how to write an entire .EXE format program by

; using

; the `exebin.mac' macro package.

; NASM macro file to allow the `bin' output format to generate

; simple .EXE files by constructing the EXE header by hand.

; To build:

; nasm -fbin binexe.asm -o binexe.exe

; (; exebin.mac should be in current directory)

; To test: binexe

; (should print `hello, world')

%include "exebin.mac"

EXE_begin

EXE_stack 64

section .text

mov ax,cs

mov ds,ax

mov dx,hello

mov ah,9

int 0x21

mov ax,0x4c00

int 0x21

section .data

hello: db 'hello, world', 13, 10, '$'

EXE_end

221

Paulo Maciel

Introdução ao NASM

• Segmento de código e dados:• Código

[SECTION] .text

• Dados

[SECTION] .data

• Exemplo:

global main

[SECTION .text]

main : MOV AL,[XYZ]

INC AL

MOV [XYZ],AL

RET

[SECTION] .data]

XYZ: db 3

•Definesx db 2

y dw 3

z dq 4

z1 dt 5

byte

2 bytes

4 bytes

10 bytes

222

Paulo Maciel

• Dados não inicializados

[SECTION .bss]

X resb 1

Y resb 128

Z resq 4

Reserva

x resb 1

y resw 1

z resd 1

z1 resq 1

z2 rest 1

Sintaxe:

res(b/w/d/q/t) #de ítens

byte

2 bytes

4 bytes

8 bytes

10 bytes

Introdução ao NASM

223

Paulo Maciel

• Dados não inicializados[SECTION .text]

global main

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

; sua funcionalidade

pop edi

pop esi

pop ebx

mov esp,ebp

pop ebp

ret

ABC db “Entre um número”,0AH,0

BCD db “%d \x0”, 0AH,0

CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

[SECTION .bss]

X resb 1

Y resb 128

Introdução ao NASM

224

Paulo Maciel

• Inicialização Múltipla

Formato:

nome TIMES numero tipo valor

Exemplo:

L1 TIMES 8 DW 0

ABC db “Entre um número”,0AH,0

BCD db “%d \x0”, 0AH,0

CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

L1 TIMES 8 DB 0

[SECTION .bss]

X resb 1

Y resb 128

Introdução ao NASM

225

Paulo Maciel

• Constante

Formato:

nome EQU expressão

Exemplo:

c1 EQU 0

MOV EAX, C1

Introdução ao NASM

226

Paulo Maciel

• NASM

L1 DW 2300H,0045H,...

LEA BX,[L1] ;SÃO EQUIVALENTES

MOV BX, L1 ;CARREGA O ENDEREÇO EFETIVO EM BX

• MASM/TASM

L1 DW 2300H,0045H,...

LEA BX,L1 ;SÃO EQUIVALENTES

MOV BX,OFFSET L1 ;CARREGA O ENDEREÇO EFETIVO EM BX

MOV BX,L1 ;BX=2300H

Introdução ao NASM

227

Paulo Maciel

MACRO - Possibilita atribuir um nome a um bloco de código e utiliza-

lo, através deste nome, no seu programa.

FORMATO DA DECLARAÇÃO:

%nome macro numero_de_parametros

statements

%nome endmacro

FORMATO PARA CHAMAR A MACRO

nome argumentos

Introdução ao NASM

228

Paulo Maciel

MACRO - Possibilita atribuir um nome a um bloco de código e utiliza-

lo, através deste nome, no seu programa.

Introdução ao NASM

Ex.:

Ex.:

Ex.:

229

Paulo Maciel

Unidade de Ponto Flutuante

PF - pré-busca

D1 - decodificação de instrução

D2 - geração de endereço

EX - leitura de memória e registradores. Conversão do formato de ponto flutuante em formato de memória. Escrita em memória.

X1 - primeiro estágio de execução. Dados da memória são convertidos no formato ponto flutuante. Escreve o operando para os registradores de ponto flutuante.

X2 - segundo estágio de execução.

WF - arrendonda o resultado e

escreve nos registradores de ponto

flutuante.

ER - sinalização de erro e

atualização da palavra de status.

230

Paulo Maciel

Unidade de Ponto Flutuante

PF D1 D2 EX

X1X2WFER

Bypass

Fluxo de

instruções

e de dados

Pipeline U

Fluxo de

dados

ST(0)ST(1)ST(2)ST(3)ST(4)ST(5)ST(6)ST(7)

Registradores

de

Ponto Flutuante

80 bits

232

Paulo Maciel

Registradores de Dados

Ponto Flutuante

MantissaExpoente

064 6379 78

S

Formato IEEE 754

= magnitude

233

Paulo Maciel

Tipos de Dados

Word integer: Magnitude = 15 bits, Sinal =1 bitShort integer: Magnitude = 31 bits, sinal =1 bitLong integer: Magnitude = 63 bits, sinal =1 bitPacked BCD: Magnitude = 72 bits, sinal =1 bit (de um byte um único

bit é usado)Short real: Mantissa = 23 bits, Expoente = 8 bits, Sinal = 1 bitLong real: Mantissa = 52 bits, expoente = 11 bits, sinal = 1 bitExtended real: Mantissa = 64 bits, expoente = 15 bits, sinal = 1 bit

234

Paulo Maciel

Tipos de Dados

Equação para Representação do Formato Short Real

N = -1S2E-127 1.M

Exemplo: transforme o número 209,8125 no formato

Short Real do Pentium.

1. Converter para binário: 11010001,1101b

2. Normalizar: 1,10100011101b (consistiu em deslocar, neste

caso, a vírgula decimal 7 posições à esquerda (+7).

3. Como 23 bits são utilizados para representar a mantissa (no

Short Real), preenche-se os demais bits com zero (0):

1,10100011101000000000000b.

4. O bit mais significativo não é representado, pois sempre é 1:

M=10100011101000000000000b

235

Paulo Maciel

Tipos de Dados

Equação para Representação do Formato Short Real

N = -1S2E-127 1.M

Exemplo: transforme o número 209,8125 no formato

Short Real do Pentium.

5. Soma-se 127 ao expoente obtido na normalização: E=127+

7=134 = 10000110b.

6. Calcule -1S =(-1) 0 = 1 (S=0 pois o número é positivo).

7. Compõem-se as partes e gera-se o número:

01000011010100011101000000000000b = 43 51 D0 00H

S E M

Obs.:para os demais tipos de dados o processo é similar.

Ver exemplo FNFormat.asm

236

Paulo Maciel

Registrador de Controle

Ponto Flutuante

1 – Mascara0 – Não mascara

237

Paulo Maciel

Registrador de Status

Ponto Flutuante

C1= 0 – underflow

C1=1 - overflow

238

Paulo Maciel

Registrador de Status

Ponto Flutuante

Os bits de 0 a 5 do registrador de status são “setados” se as respectivas condições são verdadeiras.

O bit 6 indica um erro na pilha. O bit C1 indica se ocorreu um overflow(c1=1) ou underflow (c1=0).

O bit 7 indica a ocorrência de qualquer das condições de erro. É um OU das condições apresentadas nos bits de 0 a 5.

Os bits de 11 a 13 indica o registrador da pilha que está no topo.

O bit 15 é “setado” quando o processador está sendo utilizado.

239

Paulo Maciel

Registrador de Status

Ponto Flutuante

240

Paulo Maciel

Registrador de Status

Ponto Flutuante

241

Paulo Maciel

Opções de Compilação

Para compilar com opção de depuração simbólica

No MASM e TASM : /zi

Ex.: tasm /zi ex1.asm

No TLINK: /v

Habilita processamento de 32 bits: /3

Ex.:tlink /3 /v ex1;

No LINK: /co

No NASM nome.asm –f bin –o nome.com

(real mode flat model)

Obs: use o td (TurboDebugger) para depurar.

242

Paulo Maciel

Programação a FPU

Utilizando Operandos Implícitos (Formato pilha)

A forma clássica de endereçamento acessa os

registradores via o formato “pilha”.

Os operandos não são especificados. O (primeiro)

operando é o registrado ST(0) – fonte – e o segundo

operando (se houver) é o registrado ST(1).

O resultado da operação é armazenado no operando

destino e o operando fonte é desempilhado.

Portanto, o resultado fica no topo da pilha de

registradores.

243

Paulo Maciel

.486

pilha segment stack

dw 10 dup(?)

pilha ends

dados segment

dados ends

codigo segment

assume

cs:codigo,ds:dados,ss:pilha

inicio proc far

mov ax,dados

mov ds,ax

fld1

fldpi

fadd

mov ah,4ch

int 21h

inicio endp

codigo ends

end inicio

Programação a FPU

Utilizando Operandos Implícitos

1 3.14

1

4.14 ST

ST(1)

fld1 fldpi fadd

244

Paulo Maciel

Programação a FPU

Utilizando Operando em Memória

Os elementos são carregados no topo da pilha ou

desempilhados na memória.

Utilizando Operandos na forma de Registradores.

Nesta forma os operandos são especificados através

dos seus nomes.

O primeiro operando é o destino.

O segundo operando é a fonte.

245

Paulo Maciel

Instruções de Ponto Flutuante

Movimentação

Instrução FLD

• Carrega um número de 32, 64 ou 80 bits na pilha.

• De fato, FLD, inicialmente decrementa o TOS (bits 11,12 e

13 do registrador de status) e posteriormente armazena a

informação no registrador apontado por TOS.

• Esta instrução converte o número do formato de memória

para o formato de ponto flutuante.

• fld mem

• fld st(i) ; No NASM: fld sti (sem parêntese)

Label1

246

Paulo Maciel

Instruções de Ponto Flutuante

Movimentação

Instrução FLD.486

pilha segment stack

dw 10 dup(?)

pilha ends

dados segment

d1 dd 3.0

d2 dt 4.0

dados ends

codigo segment

assume

cs:codigo,ds:dados,ss:pilha

inicio proc far

mov ax,dados

mov ds,ax

fld d1

fld d2

fld st(1)

mov ah,4ch

int 21h

inicio endp

codigo ends

end inicio

247

Paulo Maciel

Instruções de Ponto Flutuante

Movimentação

Instrução FST e FSTP

• Copia valor do topo da pilha em um registrador ST(i) ou posição de memória (32, 64 ou 80 bits).

• A instrução FSTP desempilha o valor do topo da pilha.

d1 dd 3.0

d2 dd ?

...

fld d1

fst d2

248

Paulo Maciel

Instruções de Ponto Flutuante

Movimentação

Instrução FXCH

• Permuta valores entre registradores de de ponto flutuante.

Tem-se duas formas: um operando e dois operandos

• fxch ; permuta valores entre st e st(1)

• fxch st(i) ; permuta valores entre st e st(i).

Instrução FILD

• Carrega um operando inteiro de 16, 32, 64 bits

(complemento de dois) no ST.

• fild mem

249

Paulo Maciel

Instruções de Ponto Flutuante

Movimentação

Instrução FIST

• Copia o valor do registrado ST para região de memória (no

formato inteiro).O destino pode ser de 16, 32 ou 64 bits.

• fist mem

Instrução FISTP

• Copia o valor do registrado ST para região de memória (no

formato inteiro) e desempilha o valor de ST. O destino

pode ser de 16, 32 ou 64 bits.

• fist mem

250

Paulo Maciel

Instruções de Ponto Flutuante

Movimentação

[BITS 16]

[ORG 0100H]

[SECTION .text]

START:

mov dx, msg

mov ah,9

int 21H

fld DWORD [m4]

fld DWORD [m3]

fld DWORD [m1]

fld st2

fst DWORD [m2]

fxch st2

fstp DWORD [m1]

mov ax, 04C00H

int 21H

[SECTION .data] ;

msg db "Load and Store - Float Point

Registers - Ex.2!", 13, 10, "$"

m1 dd 1.0

m2 dd 2.0

m3 dd 3.0

m4 dd 4.0

251

Paulo Maciel

Instruções de Ponto Flutuante

Movimentação

Instrução FBLD

• Carrega informação de 80 bits (formato BCD) da memória para o registrador ST

• fbld mem

Instrução FBSTP

• Armazena informação contida no ST na posição de memória (o operando destino deve ser de 80 bits). A informação armazenada na memória estará no formato BCD e desempilha o valor de ST.

• fbstp mem

Label1

252

Paulo Maciel

Instruções de Ponto Flutuante

Carga de constantes

Instrução FLDZ

• Carrega informação 0 no ST

Instrução FLD1

• Carrega informação 1 no ST

Instrução FLDPI

• Carrega informação no ST

Instrução FLDL2E

• Carrega log2e no ST

Instrução FLDL2T

• Carrega informação log210 no ST

Instrução FLDLG2

• Carrega informação log102 no

ST

Instrução FLDLN2

• Carrega informação loge2 no ST

253

Paulo Maciel

Instruções de Ponto Flutuante

Carga de constantes; Description : A simple example of a DOS .COM file programmed using

[BITS 16] ; Set 16 bit code generation

[ORG 0100H] ; Set code start address to 100h (COM file)

[SECTION .text] ; Section containing code

START:

mov dx, msg ; Mem data ref without [] loads the ADDRESS!

mov ah,9 ; Function 9 displays text to standard output.

int 21H ; INT 21H makes the call into DOS.

fldpi

fldln2

fstp DWORD[m1]

fstp DWORD[m2]

mov ax, 04C00H ; This DOS function exits the program

int 21H ; and returns control to DOS.

[SECTION .data] ; Section containing initialised data

msg db "Load Constants - Ex.3!", 13, 10, "$" ;Here's our message

m1 dd 1.0

m2 dd 2.0

254

Paulo Maciel

Instruções de Ponto Flutuante

Adição

Formas:

FADD

Soma ST e ST(1), armazena em ST(1) e desempilha o valor de ST (portanto o resultado vai para ST).

FADD ST(i),ST

FADD ST, ST(i)

FADD mem

Resultado é armazenado em ST.

FIADD mem

Soma inteira. Resultado armazenado em ST.

FADDP ST(i), ST

Soma ST(i) e ST, armazena o resultado em ST(i).

255

Paulo Maciel

Instruções de Ponto Flutuante

Adição

[BITS 16] ; Set 16 bit code generation

[ORG 0100H] ; Set code start address to 100h (COM file)

[SECTION .text] ; Section containing code

START:

mov dx, msg ; Mem data ref without [] loads the ADDRESS!

mov ah,9 ; Function 9 displays text to standard output.

int 21H ; INT 21H makes the call into DOS.

fld1

fldpi

fadd st0,st1

mov ax, 04C00H ; This DOS function exits the program

int 21H ; and returns control to DOS.

[SECTION .data] ; Section containing initialised data

msg db "Load Constants and Add - Float Point Registers - Ex.1!", 13, 10, "$" ;Here's our message

256

Paulo Maciel

Instruções de Ponto Flutuante

Adição

257

Paulo Maciel

Instruções de Ponto Flutuante

Subtração

Formas:

FSUB

SUBTRAI ST de ST(1) (ST-ST(1)), armazena em ST(1) e desempilha o valor de ST (portanto o resultado vai para ST).

FSUB ST(i),ST

FSUB ST, ST(i)

FSUB mem

Resultado é armazenado em ST.

FISUB mem (ST – [mem])

Subtração inteira. Resultado armazenado em ST.

FSUBP ST(i), ST

Subtrai ST de ST(i) (ST(i)-ST), armazena o resultado em ST(i) e desempilha ST.

258

Paulo Maciel

Instruções de Ponto Flutuante

Subtração Reversa

Formas:

FSUBR

SUBTRAI ST(1) de ST (ST(1)-ST), , armazena em ST e desempilha o valor de ST (portanto o resultado vai para ST).

FSUBR ST(i),ST (ST – ST(i))

FSUBR ST, ST(i) (ST(i) – ST)

FSUBR mem

Resultado é armazenado em ST.

FISUBR mem ([mem] - ST)

Subtração inteira. Resultado armazenado em ST.

FSUBPR ST(i), ST

Subtrai ST(i) de ST (ST-ST(i)), armazena o resultado em ST e desempilha ST.

259

Paulo Maciel

Instruções de Ponto Flutuante

Multiplicação

Formas:

FMUL

Multiplica ST e ST(1) (ST*ST(1)), armazena em ST(1) e desempilha o valor de ST (portanto o resultado vai para ST).

FMUL ST(i),ST

FMUL ST, ST(i)

FMUL mem

Resultado é armazenado em ST.

FIMUL mem (ST * [mem])

Multiplicação inteira. Resultado armazenado em ST.

FMULP ST(i), ST

Multiplica ST e ST(i) (ST(i)*ST), armazena o resultado em ST(i) e desempilha ST.

260

Paulo Maciel

Instruções de Ponto Flutuante

Multiplicação

[BITS 16] ; Set 16 bit code generation

[ORG 0100H] ; Set code start address to 100h (COM file)

[SECTION .text] ; Section containing code

START:

mov dx, msg ; Mem data ref without [] loads the ADDRESS!

mov ah,9 ; Function 9 displays text to standard output.

int 21H ; INT 21H makes the call into DOS.

fld1

fldpi

fadd st1,st0

fld dword [d1]

fmulp st0,st1

mov ax, 04C00H ; This DOS function exits the program

int 21H ; and returns control to DOS.

[SECTION .data] ; Section containing initialised data

msg db "Load Constants and Add - Float Point Registers - Ex.1!", 13, 10, "$" ;Here's our message

d1 dd 2.0

261

Paulo Maciel

Instruções de Ponto Flutuante

Divisão

Formas:

FDIV

Divide ST(1) por ST, armazena em ST(1) e desempilha o valor de ST (portanto o resultado vai para ST).

FDIV ST(i),ST

FDIV ST, ST(i)

FDIV mem

Resultado é armazenado em ST.

FIDIV mem (ST / [mem])

Divisão inteira. Resultado armazenado em ST.

FDIVP ST(i), ST

Divisão ST(i) por ST (ST(i)/ST), armazena o resultado em ST(i) e desempilha ST.

262

Paulo Maciel

Instruções de Ponto Flutuante

Divisão Reversa

Formas:

FDIVR

Divide ST por ST(1), armazena em ST(1) e desempilha o valor de ST (portanto o resultado vai para ST).

FDIVR ST(i),ST

FDIVR ST, ST(i)

FDIVR mem

Resultado é armazenado em ST.

FIDIVR mem ([mem]/ST)

Divisão inteira. Resultado armazenado em ST.

FDIVRP ST(i), ST

Divisão ST por ST(i) (ST/ST(i)), armazena o resultado em ST(i) e desempilha ST.

263

Paulo Maciel

Outras Instruções Aritméticas

FSQRT

• Calcula a raiz quadrada do valor do registrador apontado por TOS e armazena o resultado em ST.

FSCALE

• Armazena no topo da pilha (ST) o valor ST 2ST(1)

FRNDINT

• Arredonda o valor de ST para inteiro, segundo especificado no registrador de controle.

FABS

• Torna o sinal de ST como positivo.

FCHS

• Inverte o sinal de ST.

264

Paulo Maciel

Exemplo

Raiz Quadrada

[BITS 16]

[ORG 0100H]

[SECTION .text]

START:

mov dx, msg

mov ah,9

int 21H

fld DWORD[m1]

fld st0

fmulp st1,st0

fld DWORD[m2]

fld st0

fmulp st1,st0

faddp st1,st0

fsqrt

fst DWORD[m3]

mov ax, 04C00H

int 21H

[SECTION .data]

msg db "Square Root - Ex.3!", 13, 10,

"$"

m1 dd 1.0

m2 dd 2.0

m3 dd 0.0

265

Paulo Maciel

Instruções de Comparação

FCOM

• ST – ST(1). Afeta C3, C2 e C1.

FCOM ST(i)

• ST – ST(i)

FCOM mem

• ST – [mem]

FICOM mem

• ST – [mem]; [mem] é um inteiro de 16 ou 32 bits.

Após

FCOM

C3 C2 C1

ST>fonte 0 0 0

ST<fonte 0 0 1

ST=fonte 1 0 0

N. Comp. 1 1 1

266

Paulo Maciel

Instruções de Controle

FINIT

• “Reseta” o FPU.

FCLEX

• Limpa flags de erro.

FSTSW [mem]

• Armazena o registrador de status na memória.

FSTSW AX

• Armazena o registrador de status em AX

FSTCW [mem]

• Armazena registrado de controle na memória

FLDCW [mem]

• Carrega o registrador de controle.

267

Paulo Maciel

Instruções de Ponto Flutuante

Não há desvios condicionais que permitam verificar se os flags do

registrador de status de ponto flutuante.

Pode-se armazenar os conteúdo do registrador de status de ponto

flutuante para memória e posteriormente carrega-lo no registrador de

flags padrão (via SAHF) ou testar as informações armazenadas na

memória com instruções TEST e usar Jcc.

fstsw mem

mov ax,mem

sahf

268

Paulo Maciel

Instruções de Ponto Flutuante

Instruções Transcendentais

FPTAN

• Calcula o tangente do valor de ST. O resultado é

uma razão X/Y. Y é devolvido em ST e X em

ST(1)

FPATAN

• Calcula o arco-tangente da relação Y/X. X deve

estar em ST e Y em ST(1). O resultado é devolvido

em ST.

269

Paulo Maciel

Instruções de Ponto Flutuante

Instruções Transcendentais

FSIN

• Calcula o seno do valor de ST (radianos) e devolve em ST o resultado.

FCOS

• Calcula o cosseno do valor de ST (radianos) e devolve em ST o resultado.

FSINCOS

• Calcula o seno e o cosseno do valor de ST (radianos). O resultado do cosseno é devolvido em ST. O seno é devolvido em ST(1).

270

Paulo Maciel

Exemplo

Instruções Transcendentais[BITS 16] ; Set 16 bit code generation

[ORG 0100H] ; Set code start address to 100h (COM file)

[SECTION .text] ; Section containing code

START:

fld dword [y]

fld dword [x]

fpatan

fst dword [ang]

fsincos

fstp dword [sin]

fstp dword [cos]

fld dword [ang]

fptan

fstp dword [tan]

mov ax, 04C00H ; This DOS function exits the program

int 21H ; and returns control to DOS.

[SECTION .data] ; Section containing

;initialised data

x dd 1.0

y dd 1.0

ang dd 0.0

sin dd 0.0

cos dd 0.0

tan dd 0.0

271

Paulo Maciel

Cálculo do Volume de um Cilindro

[BITS 16] ; Set 16 bit code generation

[ORG 0100H] ; Set code start address to 100h

(COM file)

[SECTION .text] ; Section containing code

START: fldpi

fld dword [radio]

fmul st0,st0

fmul st0,st1

fld dword [height]

fmul st0,st1

fst dword [vol2]

fld dword [vol2]

fbstp [vol]

mov ax, 04C00H ; This DOS function exits the program

int 21H ; and returns control to DOS.

[SECTION .data] ; Section containing initialised data

radio dd 2.0

height dd 3.0

[SECTION .bss]

vol resd 8

vol2 resd 2

272

Paulo Maciel

Registradores MMX

Registradores

de

Ponto Flutuante

80 bits

64 bits

MM7

MM6

MM5

MM4

MM3

MM2

MM1

MM0

Registradores

MMX

79 63 0

1

1

1

1

•Acesso direto

•Mudança automática

ao se executar uma

instrução MMX

•Executar instrução EMMS

para retorno ao acesso dos

reg. de ponto flutuante.

ST(0)

ST(1)

ST(2)

ST(3)

ST(4)

ST(5)

ST(6)

ST(7)

274

Paulo Maciel

Entrada/Saída

Técnicas para Controle de I/O

Varredura

Baseado em Interrupções

Baseado em DMA

275

Paulo Maciel

Entrada/Saída

Modelo de Genérico de Dispositivo de I/O

Módulo I/O

Disp. Externo

Bus de end.Bus de dados

Bus de controle

status e

controledados

Dados do/para o ambiente

276

Paulo Maciel

Entrada/Saída

Categorias de Dispositivo Externo

Para Interação com Pessoas (Teclado, vídeo etc)

Para Interação com Máquinas (Unidade de disco)

Para Comunicações (Dispositivo remoto)

277

Paulo Maciel

Entrada/Saída

Modelo Genérico de um Dispositivo Externo

Lógica

de

ControleTransdutor

Buffer

Dados de/para o ambiente

Dados de/para o módulo I/OStatus para módulo I/OControle do módulo I/O

278

Paulo Maciel

Entrada/Saída

Modelo Genérico do Módulo I/O

Reg. de dados

Regs. Status e de Controle

Lógica

de I/O

Interface

com

Disp.

Externos

Interface

com

Disp.

Externos

Dados

Endereço

Controle

Dados

Controle

Status

Dados

Controle

Status

279

Paulo Maciel

Entrada/Saída

Técnicas para Controle de I/O

Varredura

Comandos

Controle - informa ao periférico o que fazer

Teste - testa condições

Leitura - ler dados do periférico

Escrita - escreve dados no periférico

280

Paulo Maciel

Entrada/Saída

Técnicas para Controle de I/O

Varredura

Envia Comando

de Leitura

para Módulo I/OLê status do

Módulo I/O

Lê palavra do

Módulo I/O

Escreve

palavra na

Memória

Ver.

status

Feito ?

Não está

pronto

Condição de

erro

pronto

não

sim

Próxima Instrução

281

Paulo Maciel

Entrada/Saída

Técnicas para Controle de I/O

Baseado em Interrupção

Envia Comando

de Leitura

para Módulo I/OLê status do

Módulo I/O

Lê palavra do

Módulo I/O

Escreve

palavra na

Memória

Ver.

status

Feito ?

Condição de

erro

pronto

não

sim

Próxima Instrução

Vai fazer qualquer coisa

Interrupção

282

Paulo Maciel

Entrada/Saída

PUSH FLAGS

PUSH IPFETCH ISR ADDRESS

POP IP

POP FLAGS

INTERRUPT

SERVICE

PROCEDURE

Restaura Estado

Retorno

•Técnicas para Controle de I/O - Baseado em Interrupção

Hardware SoftwareControlador ou Periférico solicita

Interrupção

Processador Finaliza

Execução de Instrução Corrente

Processador Reconhece Interrupção

Salva Estado

Processa Interrupção

Processamento

da Interrupção

283

Paulo Maciel

Entrada/Saída

Técnicas para Controle de I/O

Baseado em DMA

Quantidade

de Dados

Reg. de

Dados

Reg. de

Endereço

Lógica

de

Controle

DMA_Req

DMA_Ack

Int_reqRd

Wr

Bus de Dados

Bus de Endereço

Diagrama Genérico

do Controlador de

DMA

284

Paulo Maciel

Entrada/Saída

Técnicas para Controle de I/O

Baseado em DMA

Escreve na

Memória ou

no Dispositivo

Feito ?não

sim

Próxima Instrução

Solicitação

de DMA

Vai fazer

qualquer coisaSuspensão

Reconhecimento

da solicitação DMA

Retira

Solicitação de DMA

Processador

Controlador DMAEnvia

Solicitação

de DMA

Aguarda

Reconh.

Solicitação

de DMA

Envia

Reconh. DMA

Envia Comando

de Leitura/Escrita

DMA

para Módulo I/O

Lê dados do

Dispositivo ou

da Memória

285

Paulo Maciel

Interrupções

O que é uma interrupção?

É um evento interno ou externo ao processador provocado porum usuário que solicita sua atenção.

Quais os tipos de interrupção?

Interrupções por softwareInstruções INT

Interrupções por hardwareNMI

IRQ’s conectadas ao pino INTR

Exception Handlers (Int. Excepcionais)

286

Paulo Maciel

Arquitetura de Computadores

Interrupções na Arquitetura x86

Hardware Internas

Externas Mascarável

Não-Mascarável

Software Sistema Operacional

Usuário

287

Paulo Maciel

Interrupções

Exemplos de Exception Handlers

Erro irrecuperável de HW;

Divisão por zero;

Breakpoint;

Passo a Passo;

Overflow;

Violação dos limites da memória.

288

Paulo Maciel

Resposta do Processador

a uma Interrupção Mascarável

PUSH FLAGS

CLEAR IFCLEAR TFPUSH CSPUSH IPFETCH ISR ADDRESS

POP IP

POP CSPOP FLAGS

INTERRUPT

SERVICE

PROCEDURE

PUSH REGISTERS

POP REGISTERS

IRET

289

Paulo Maciel

Vetores de Interrupção

Processadores da Família x86

INT (Hex) IRQ COMMON USES

00 - 01 Exeption Handlers -

02 Non-Maskable IRQ Non-Maskable IRQ (Parity Errors)

03 - 07 Exeption Handlers -

08 Hardware IRQ0 System Timer

09 Hardware IRQ1 Keyboard

0A Hardware IRQ2 Redirected

0B Hardware IRQ3 Serial Comms. COM2/COM4

0C Hardware IRQ4 Serial Comms. COM1/COM3

0D Hardware IRQ5 Reserved / Sound Card

0E Hardware IRQ6 Floppy Disk Controller

0F Hardware IRQ7 Parallel Comms.

10 - 6F Software Interrups -

70 Hardware IRQ8 Real Time Clock

71 Hardware IRQ9 Redirected IRQ2

72 Hardware IRQ10 Reserved

73 Hardware IRQ11 Reserved

74 Hardware IRQ12 PS/2 Mouse

75 Hardware IRQ13 Math's Co-Processor

76 Hardware IRQ14 Hard Disk Drive

77 Hardware IRQ15 Reserved

78-FF Software Interrups -

290

Paulo Maciel

Controlador de Interrupção Programável - PIC 8259

Foi projetado para permitir priorização e tratamento deinterrupções de dispositivos periféricos, multiplexandovários sinais de interrupção na entrada de interrupçãodo processador.

291

Paulo Maciel

Diagrama em Blocos - PIC 8259

292

Paulo Maciel

Interrupções do BIOS

Interrupções do BIOS

INT 5h - Print screen

Imprime conteúdo da tela

INT 10h - Vídeo

Interrupção do BIOS que trata o vídeo

Os serviços são passados através do registrador AH

293

Paulo Maciel

Interrupções do BIOS

INT 10h - Vídeo

Especificação do modo

Chama-se com:

AH = 0

AL = Modo

Modo Resolução Caract.

0h 40×25 tx, preto/branco

1h 40×25 tx, 16 cores

2h 80×25 tx, preto/branco

3h 80×25 tx, 16 cores

4h 320×200 gr, 4 cores

5h 320×200 gr, preto/branco

6h 640×200 gr, 2 cores

..........

12h 640×480 gr, 16 cores

..........

294

Paulo Maciel

Interrupções do BIOS

INT 10h - Vídeo

Ajusta formato do cursor

Chama-se com:

AH = 1

CH = linha inicial

CL = linha final

- número de linhas = 7

Posiciona o cursor

Chama-se com:

AH = 2

DH = linha

DL = coluna

BH = número da página

295

Paulo Maciel

Interrupções do BIOS

INT 10h - Vídeo

Ler posição do cursor

Chama-se com:

AH = 3

BH = número da página

Recebe-se em:

DH = linha inicial

DL = linha final

CX = tipo do cursor

Selecionar página

Chama-se com:

AH = 5

AL = página

Páginas Modos

0-7 0-3 (placas SVGA)

* Modos gráficos

* - depende dos modos suportados por cada placa.

296

Paulo Maciel

Interrupções do BIOS

INT 10h - Vídeo

Rolar para cima a janela de vídeo

Chama-se com:

AH = 6

AL = número de linhas a serem roladas (Zero

(0) rola todas)

CH = linha do canto superior esquerdo

CL = coluna do canto superior esquerdo

DH = linha do canto inferior direito

DL = coluna do canto inferior direito

BH = atributo a ser usado nas novas linhas

Rolar para baixo a janela de vídeo

Chama-se com:

AH = 7

AL = número de linhas a serem roladas (Zero (0) rola todas)

CH = linha do canto superior esquerdo

CL = coluna do canto superior esquerdo

DH = linha do canto inferior direito

DL = coluna do canto inferior direito

BH = atributo a ser usado nas novas linhas

297

Paulo Maciel

Interrupções do BIOS

INT 10h - Vídeo

Ler o caracter e o atributo da posição do

cursor

Chama-se com:

AH = 8

BH = número da página

Recebe-se em:

AL = caracter

AH = atributo do

caracter

Escreve caracter e atributo

Chama-se com:

AH = 9

BH = número da página

AL = caracter

BL = atributo do

caracter

CX = número de repetições

298

Paulo Maciel

Interrupções do BIOS

INT 10h - Vídeo

Escreve caracter

Chama-se com:

AH = 10

BH = número da página

AL = caracter

CX = número de repetições

Escreve um ponto (pixel)

Chama-se com:

AH = 12

AL = cor do pixel. Caso o bit 7 de AL seja 1,

a cor do pixel será o ou-exclusivo com a cor

atual.BH = página

CX = coordenada X (coluna)

DX = coordenada Y (linha)

299

Paulo Maciel

Interrupções do BIOS

INT 10h - Vídeo

Ler um ponto (pixel)

Chama-se com:

AH = 13

BH = página

CX = coordenada X (coluna)

DX = coordenada Y (linha)

Recebe-se em:

AL = cor do pixel

Escreve caracter em modo TTY

Chama-se com:

AH = 14

BH = número da página

AL = caracter

BL = cor do 2º plano

* Avança posição do cursor automaticamente.

** Aceita caracteres de controle como bell, avanço de linha, carriage return e backspace.

300

Paulo Maciel

Interrupções do BIOS

INT 10h - Vídeo

Obtém o modo do vídeo

Chama-se com:

AH = 15

Recebe-se em:

AH = número de colunas

da tela

AL = modo

BH = página ativa

Escreve caracter em modo TTY

Chama-se com:

AH = 14

BH = número da página

AL = caracter

BL = cor do 2º plano

* Avança posição do cursor automaticamente.

** Aceita caracteres de controle como bell, avanço de linha, carriage return e backspace.

301

Paulo Maciel

Interrupções do BIOS

INT 13h - DISCO

Reseta sistema de dico

Chama-se com:

AH = 00h

DL = número do driver

00 - 7Fh floppy disk

80 - FFh hard disk

Recebe-se em:

CF = 0 sem erro

1 erro

AH = código do erro

Código do Erro

00h - sem erro

01h - comando inválido

02h - “address mark” não encontrado

03h - disco protegido

04h - setor não encontrado

05h - falha de reset

06h - disco removido

08h - erro de DMA

09h - erro de limite de DMA

10h - setor com erro

20h - falha do controlador

40h - trilha não encontrada

80h - time-out

302

Paulo Maciel

Interrupções do BIOS

INT 13h - DISCO

Obtém status

Chama-se com:

AH = 01h

Recebe-se em:

AL = código do erro

Ler/Escreve/Verifica/Formata

Chama-se com:

AH=02h/03h/04h/05h

AL= número de setores

CH= número do cilindro

CL= número do setor

(1, se AH=5)

DH= número da cabeça

DL= número da unidade

ES:BX= buffer

Recebe-se em:

CF= 0 sem erro

1 erro

AH= código do erro

303

Paulo Maciel

Interrupções do BIOS

INT 13h - DISCO

Se AH=05h (Formatar)

ES:BX = 4 campos de entrada para cada setor

byte 0 - número do cilindro

byte 1 - número da cabeça

byte 2 - número do setor

byte 3 - código do tamanho do setor

00h - 128 b/s

01h - 256 b/s

02h - 512 b/s

03h - 1024 b/s

304

Paulo Maciel

Interrupções do BIOS

INT 16h - TecladoAguarda a digitação de um caracter e o lê

Chama-se com:

AH = 0hSe um caractere ASCII foi digitado Recebe-se em

AH = código de varreduraAL = código ASCII

Se um caractere especial foi digitadoRecebe-se em

AH = código ASCII estendidoAL = 00h

Verifica se um caracter está prontoChama-se com:

AH = 1h

Se um caractere ASCII foi digitado ZF=0 e AH = código de varredura

AL = código ASCII

Caso contrário, ZF=1

Obs.: Não remove do buffer

305

Paulo Maciel

Interrupções do BIOS

INT 16h - TecladoObtêm status do tecladoChama-se com:

AH = 2h

Recebe-se emAL = status01h - shift direito ativo02h - shift esquerdo ativo04h - crtl ativo08h - alt ativo10h - num lock ativo20h - scroll lock ativo40h - caps lock ativo80h - inserção ativa

306

Paulo Maciel

Interrupções do BIOS

INT 17h - ImpressoraImprime caractere

Chama-se com:

AH = 00hAL = caractere

DX = número da impressora

Recebe-se emAH = status

Inicializa impressora

Chama-se com:AH = 01hDX = número da impressora

Obtêm status da impressora

Chama-se com:

AH = 02h

DX = número da impressora

Recebe-se em

AH = status01h - time-out

08h - erro de I/O

10h - impressora selecionada

20h - sem papel

40h - reconhecimento

80h - impressora desocupada

307

Paulo Maciel

Interrupções do BIOS

INT 19h - Warm Start

INT 1Ah - Obtém / atualizatempo / data

Ler contador do relógio

Chama-se com:AH = 00h Recebe-se em:

AL = 0, se não se passaram 24h da última leitura

CX = parte de alta-ordem do contadorDX = parte de baixa-ordem do

contador

Atualiza contador do relógio

Chama-se com:AH = 01h

CX = parte de alta-ordem do contadorDX = parte de baixa-ordem do contador

Ler relógio

Chama-se com:AH = 02h Recebe-se em:

CH = horas em BCDCL = minutos em BCDDH = segundos em BCD

DL = milesegundos em BCD

308

Paulo Maciel

Interrupções do BIOS

INT 1Ah - Obtém / atualizatempo / data

Atualiza relógio

Chama-se com:AH = 03h

CH = horas em BCDCL = minutos em BCDDH = segundos em BCD

DL = milesegundos em

BCD

Ler dataChama-se com:AH = 04h Recebe-se em:

CH = século (19, 20,21) em BCDCL = ano em BCDDH = mês em BCD

DL = dia em BCDAtualiza data

Chama-se com:AH = 05h

CH = século (19,20,21) em BCDCL = ano em BCDDH = mês em BCDDL = dia em BCD

309

Paulo Maciel

Interrupções

INT 14h - serial (BIOS)

INT 21hCONSOLE:SERVIÇOS 01 - 0Ch

AJUSTE DE INTERRUPÇÃO: 25h,35h

DATA E HORA: 2Ah-2Dh

FINALIZAÇÃO DE PROGRAMA: 4Ch,31h

DIRETÓRIO E ARQUIVO:39h-43h

310

Paulo Maciel

INT 21h - DOSLeitura teclado eco

Chama-se com:

AH = 01hSe um caractere ASCII foi digitado

Recebe-se emAL = código ASCII

Se AL =0, a função deve ser repetida para se obter

o código de varredura, pois uma tecla especial foi

digitada.

Se um caracter não foi digitado, aguarda.Sensível a control-c e control-break

ex.: char db ?

mov ah,1int 21hmov char,al

Mostra caracter em tela

Chama-se com:AH = 02hDL = código ASCII do caracter.

Ex.:

mov ah,02mov dl,´*´int 21h

Interrupções

311

Paulo Maciel

INT 21h - DOSLeitura de entrada auxiliar (serial 1)

Chama-se com:

AH = 03hRecebe-se em

AL = código ASCIISe um caracter não foi digitado, aguarda.Sensível a control-c

A INT 14h e o controle direto são mais adequados

para leitura onde não tolere a perda de dados.ex.: char db ?

mov ah,3int 21hmov char,al

Transmite caracter via saída auxiliarChama-se com:AH = 04hDL = código ASCII do caracter.

A INT 14h e o controle direto são mais adequados para

leitura onde não tolere a perda de dados.

Ex.:

mov ah,04mov dl,´*´int 21h

Interrupções

312

Paulo Maciel

INT 21h - DOSImprime caracter

Chama-se com:AH = 05hDL = código ASCII do caracter.

A INT 17h e o controle direto são mais

adequados para leitura onde não tolere a

perda de dados.

Ex.:

mov ah,05mov dl,´*´int 21h

Leitura e escrita direta no console.Chama-se com:AH = 06hDL = 00h – FEh – mostra em telaDL = FFh – entrada

RetornoSe DL = 00h - FEh, nada.Se DL = FFh e um caracter está pronto (ZF=0), AL = ASCII do caracter.Se DL = FFh e um caracter não está pronto, ZF=1.

Não é sensível a control-c e control-break

Para ler teclas especiais, a função deve ser chamada duas vezes e se obtém o código de varredura.

Interrupções

313

Paulo Maciel

INT 21h - DOS Leitura e escrita direta no console.

Chama-se com:AH = 06hDL = 00h – FEh – mostra em telaDL = FFh – entrada

Ex1.:

mov ah,06 ; escrita em telamov dl,´*´int 21h

Ex2.:char db ?

wait: mov ah,06 ; leitura do teclado

mov dl,0ffhint 21hjz waitmov char,al

Leitura teclado sem eco (sem filtro)

Chama-se com:

AH = 07hSe um caractere ASCII foi digitado Recebe-se em

AL = código ASCII

Se AL =0, a função deve ser repetida para se

obter o código de varredura, pois uma tecla

especial foi digitada.

Se um caracter não foi digitado, aguarda.Não é sensível a control-c e control-breakex.: char db ?

mov ah,7int 21hmov char,al

Interrupções

314

Paulo Maciel

Leitura teclado sem eco

Chama-se com:

AH = 08hSe um caractere ASCII foi digitado Recebe-se em

AL = código ASCII

Se AL =0, a função deve ser repetida para se

obter o código de varredura, pois uma tecla

especial foi digitada.

Se um caracter não foi digitado, aguarda.Sensível a control-c e control-breakex.: char db ?

mov ah,8int 21hmov char,al

Mostra cadeia de caracter em tela

Chama-se com:

AH = 09h

DS:DX = apontam para o endereço do início da cadeia de caracter.

A cadeia dever ser finalizada com ´$´

ex.: cr equ 0dhlf equ 0ahmens db ´Bom Dia´, cr, lf,´$´

mov dx, seg mensmov ds,dxlea dx, mensmov ah,9int 21h

Interrupções

315

Paulo Maciel

Leitura teclado com buffer

Chama-se com:

AH = 0Ah

DS:DX = apontam para o endereço do

início do buffer.

Formato do buffer:

byte conteúdo

0 máximo número de carateres a

serem lidos.

1 número de caracteres que de

fato foram lidos.

2+ cadeia de caracteres lida.

Terminada com cr (0dh)

Ex.:buff db 81

db 0db 81 dup(0)

mov ah,0ahmov dx,seg buffmov ds,dxlea dx,buffint 21h

Interrupções

316

Paulo Maciel

Define vetor de interrupção

Chama-se com:

AH = 25h

AL = número da interrupção

DS:DX = segmento e offset do serviço de

tratamento da interrupção.ex.:

mov ah,25hmov al,0

mov dx,seg DIVZmov ds,dxlea dx,DIVZ

int 21h

DIVZ proc far…iret

DIVZ endp

Obtém vetor de interrupção

Chama-se com:

AH = 35h

AL = número da interrupção

Retorno:

ES:BX = segmento e offset do serviço de tratamento da

interrupção.ex.:

OldDivZS dw ?OldDivZO dw ?

mov ah,35hmov al,0

int 21h

mov OldDivZO,bxmov bx,esmov OldDivZS,bx

Interrupções

317

Paulo Maciel

Obtém data

Chama-se com:

AH = 2Ah

Retorno

CX = ano

DH = mês (1-12)

DL = dia ( 1-31)

Retorno:

AL = Dia da semana (0= dom, …7=sab)

Define data

Chama-se com:

AH = 2Bh

CX = ano

DH = mês (1-12)

DL = dia ( 1-31)

Retorno:

AL = 0, se definido com sucesso

AL = FFh, caso contrário.

Interrupções

318

Paulo Maciel

Obtém tempoChama-se com:

AH = 2Ch

Retorno

CH = hora (0 – 23)

CL = minutos (0-59)

DH = segundos ( 0-59)

DL = milisegundos (0 – 99)

Define tempo

Chama-se com:

AH = 2Dh

CH = hora (0 – 23)

CL = minutos (0-59)

DH = segundos ( 0-59)

DL = milisegundos (0 – 99) Retorno:

AL = 0, se definido com sucesso

AL = FFh, caso contrário.

Interrupções

319

Paulo Maciel

Cria arquivoChama-se com:

AH = 3Ch

CX = atributo

bit significado

0 somente leitura

1 invisível

2 sistema

DS:DX apontam para o endereço que

contem o caminho (string terminada por 0)

e o nome do arquivo a ser criado.

Retorno

CF = 0 e AX = manipulador, se sucesso.

CF = 1 e AX = código de erro, caso contrário.

EX.:fname db ´C:\MYDIR\MYFILE.DAT´,0fhandle dw ?

mov ah,3chxor cx,cx; atributo normalmov dx,seg fnamemov ds,dxlea dx,fnameint 21hjc erromov fhandle,ax

Interrupções

320

Paulo Maciel

Abri arquivoChama-se com:

AH = 3Dh

AL = modo de acesso

0 – leitura

1 – escrita

2 – leitura e escrita

DS:DX apontam para o endereço que

contem o caminho (string terminada por 0)

e o nome do arquivo a ser criado.

Retorno

CF = 0 e AX = manipulador, se sucesso.

CF = 1 e AX = código de erro, caso contrário.

EX.:fname db ´C:\MYDIR\MYFILE.DAT´,0fhandle dw ?

mov ah,3dhmov al,2; leitura e escritamov dx,seg fnamemov ds,dxlea dx,fnameint 21hjc erromov fhandle,ax

Interrupções

321

Paulo Maciel

Fechar arquivoChama-se com:

AH = 3Eh

BX = manipulador

Retorno

CF = 0, se sucesso.

CF = 1, caso contrário.

EX.:fhandle dw ?

mov ah,3Ehmov bx,fhandle int 21hjc erro

Interrupções

322

Paulo Maciel

Ler arquivoChama-se com:

AH = 3Fh

BX = manipulador

CX = número de bytes a ser lido

DS:DX = endereço inicial do buffer

Retorno

CF = 0, se sucesso. AX = bytes lidos

CF = 1, caso contrário. AX = código de erro.

EX.:fhandle dw ?buff db 1024 dup(?)

mov ah,3Fhmov dx, seg buffmov ds,dxlea dx,buffmov bx,fhandlemov cx,1024int 21hjc errocmp ax,cxjl done

Interrupções

323

Paulo Maciel

Escrever em arquivoChama-se com:

AH = 40h

BX = manipulador

CX = número de bytes a ser escrito

DS:DX = endereço inicial do buffer

Retorno

CF = 0, se sucesso. AX = bytes escritos

CF = 1, caso contrário. AX = código de erro.

EX.:fhandle dw ?buff db 1024 dup(?)

mov ah,40hmov dx, seg buffmov ds,dxlea dx,buffmov bx,fhandlemov cx,1024int 21hjc errocmp ax,cxjl done

Interrupções

324

Paulo Maciel

Apaga arquivoChama-se com:

AH = 41h

DS:DX apontam para o endereço que contem o caminho (string terminada por 0) e o nome do arquivo a ser apagado.

Retorno

CF = 0 , se sucesso.

CF = 1 e AX = código de erro, caso contrário.

EX.:fname db ´C:\MYDIR\MYFILE.DAT´,0

mov ah,41hmov dx,seg fnamemov ds,dxlea dx,fnameint 21hjc erro

Interrupções

325

Paulo Maciel

Escrever em arquivoChama-se com:

AH = 40h

BX = manipulador

CX = número de bytes a ser escrito

DS:DX = endereço inicial do buffer

Retorno

CF = 0, se sucesso. AX = bytes escritos

CF = 1, caso contrário. AX = código de erro.

EX.:fhandle dw ?buff db 1024 dup(?)

mov ah,40hmov dx, seg buffmov ds,dxlea dx,buffmov bx,fhandlemov cx,1024int 21hjc errocmp ax,cxjl done

Interrupções

326

Paulo Maciel

Posicionar Ponteiro de ArquivoChama-se com:

AH = 42h

BX = manipulador

AL = método de posicionamento

CX:DX = deslocamento

Retorno

CF = 0, se sucesso. DX:AX = nova posição

CF = 1, caso contrário. AX = código de erro.

Método

0 - (absoluto) começo do arquivo

1 - relativo a posição atual

2 - (absoluto) fim do arquivo

EX.:fhandle dw ?

mov ah,42hmov bx,fhandlemov cx,0Mov dx,1024int 21hjc erro

Interrupções

327

Paulo Maciel

Conexao ProtoBoard

Vamos aqui mostar como foi implementada a conexão

entre o porta Paralela e o Prot Board.

O computador geralmente possui 3 portas: LPT1, LPT2 e

LPT3 (alguns possuem LPT4). Cada porta dessas possui 3

endereços: data, status e control. Esses endereços estão numa

ordem sequencial. Isso quer dizer que se a porta data tem o

endereço 0x0378, então o endereço correspondente de status é

0x0379 e o control é 0x037a.

328

Paulo Maciel

Conexao entre a Porta Paralela e o ProtoBoard

Endereços de Acesso a Porta Paralela

Hoje em dia, os computadores estão basicamente configurados da

seguinte maneira:

Printer Data Port Status Control

LPT1 0x0378 0x0379 0x037a

LPT2 0x0278 0x0279 0x027a

LPT3 0x03bc 0x03bd 0x03be

Obs: A porta normalmente utilizada e a LPT1

329

Paulo Maciel

Conexao entre a Porta Paralela e o ProtoBoard

Abaixo temos a a função dos pinos no conector DB25:

330

Paulo Maciel

Conexao entre a Porta Paralela e o ProtoBoard

Na figura temos a direção dos pinos de acordo com função

331

Paulo Maciel

Endereços da Porta Paralela

Porta Reg de Dados Reg de Status Reg de Controle

LPT1 378h 379h 37AhLPT2 278h 279h 27Ah

D7

D6

D5

D4

D3

D2

D1

D0

Busy (LI)

#Ack

PE

SELECT

#ERROR

#IRQ

Reservado

Reservado

Reservado (Todos são LI)

Reservado

Direction

IRQ ENABLE (não conctado)

# SELECT INPUT

INIT

#AUTOFEED

#STROBE

Lógica Invertida:

escrevendo-se 0,

tem-se 1 na saída

2

3

4

5

6

7

8

9

11

10

12

13

15 17

16

14

1

332

Paulo Maciel

Teste de Presença de Porta Paralela

MOV AH,3MOV AL,AH

MOV DX,378HOUT DX,ALXOR AL,ALIN AL,DXCMP AH,ALJNZ PortNotPresent

(Verificar o endereço 0040:0008h)

333

Paulo Maciel

Controle sobre a Porta Paralela

D0

9

BUSY 11

(378h)

(379H)

330

10K

+5V

+5V

334

Paulo Maciel

Controle sobre a Porta Paralela

Varredura

..................MOV AL,01h ;apaga LED

MOV DX,378hOUT DX,AL

T: MOV DX,379hIN AL,DX ; lê reg de status

TEST AL,80h ; e verifica se tecla foi

JNZ T1 ; pressionada

MOV AL,00h ; se foi, acende-se o LED

MOV DX,378h OUT DX,ALCALL DELAY

T1:MOV AL,01h; apaga-se o LED

OUT DX,ALMOV AH,01h ; verifica-se

INT 16h; se uma tecla foi pres-

JNZ T2; sionada

JMP TT2:MOV AH,4CH

INT 21h ; fim

335

Paulo Maciel

Exercício Controle sobre a Porta Paralela

Pc0Pc1Pc2Pc3

Pa0Pa1Pa2

V1

V2

V3

M

S0

S1

S2

PPI 8255LPT1

Vi – ValvulasM – MisturadorSi - Sensores

D0

D7

RdWrA0

A1

CS

#select_input

init

#autofeed

#strobe

direction

D0

D7

336

Paulo Maciel

Controle sobre a Porta Paralela

Interrupção

Inicialização

Redirecionamentoda

Interrupção

Serviçode Interrupção

Restauraçãoda

Interrupção

•A interrupção ocorre quando há uma subida de pulso do ACK

337

Paulo Maciel

Controle sobre a Porta Paralela

InterrupçãoDataPort equ 0378h

ControlPort equ 037Ah

StatusPort equ 0379h

IntNumber equ 0Fh; irq7

IntMask equ 10000000b

start Proc far

mov ax, data

mov ds, ax

mov es, ax

...

call LoadInt

...

start endp

Inicialização

RedirecionamentoDa

Interrupção

; Caregar a interrupcao paralela

LoadInt proc near

push ds

push es

push ax

push bx

push dx

; salvar o antigo vetor de

;interrupcao

mov ah, 35h

mov al, IntNumber

int 21h

mov word ptr IntVectSave, bx

mov word ptr IntVectsave+2, es

; substituir o vetor de

;interrupcao pelo novo

mov dx, seg ParallelInt

mov ds, dx

lea dx, ParallelInt

mov ah, 25h

mov al, IntNumber

int 21h

;Desmascarar o Pic

in al, 21h ;Ler o mascara de

;interrupcao

;existente.

or al, 0FFh ; IntMask

;Habilitar o IRQ 7

out 21h, al ;Gravar o

resultado no PIC.

; Habilitar o IRQ via ACK

mov dx, ControlPort

in al, dx; recuperar o antigo

; valor de Controle

or al, 10h; habilitar o bit 4

out dx, al

pop dx

pop bx

pop ax

pop es

pop ds

ret

LoadInt endp

338

Paulo Maciel

Controle sobre a Porta Paralela

InterrupçãoDataPort equ 0378h

ControlPort equ 037Ah

StatusPort equ 0379h

IntNumber equ 0Fh; irq7

IntMask equ 10000000b

start Proc far

....

call RestoreInt

mov ax, 4ch

int 21h

start endp

RestauraçãoDa

Interrupção

; Restaurar o antigo vetor de

interrupcao

RestoreInt proc near

push es

push ds

push dx

push ax

;Desabilitar o IRQ via ACK

mov dx, ControlPort

in al, dx; recuperar o antigo

;valor de Controle

and al, 0EFh; desabilitar o

;bit 4

out dx, al

;Mascarar o Pic

in al, 21h ;Read existing

;interrupt mask

;bits.

or al, 10000000b ;Desligar o

;IRQ 7

out 21h, al ;Gravar o

;resultado no PIC.

; Restaurar o antigo vetor de

interrupcao

mov dx, seg IntVectSave

mov ds, dx

lea dx, IntVectSave

mov ah, 25h

mov al, IntNumber

int 21h

pop es

pop ds

pop dx

pop ax

ret

RestoreInt endp

339

Paulo Maciel

Controle sobre a Porta Paralela

Interrupção

Serviço de Interrupção

ParallelInt proc far

push bx

push ax

push dx

push ds

pushf

mov ax, es

mov ds, ax

SERVIÇO

; mandar o comando "end of

;interrupt" para o PIC

mov al, 20h

out 20h, al

popf

pop ds

pop dx

pop ax

pop bx

iret

ParallelInt endp

340

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Read/

Write

Control

Logic

Data

Bus

Buffer

Group

A

Control

Group

B

Control

GroupA

PortA

Group B

PortB

Group A

4 MSB

Port C

Group B

4 LSB

Port C

8-bit

Internal

Data bus

Power

GND

RDWRA1A0Reset

CS

Bidiretional

Data bus

PA7-PA0

PC7-PC4

PC3-PC0

PB7-PB0

341

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Read/

Write

Control

Logic

Data

Bus

Buffer

Group

A

Control

Group

B

Control

GroupA

PortA

Group B

PortB

Group A

4 MSB

Port C

Group B

4 LSB

Port C

8-bit

Internal

Data bus

Power

GND

RDWRA1A0Reset

CS

Bidiretional

Data bus

PA7-PA0

PC7-PC4

PC3-PC0

PB7-PB0

•Grupo A

Porta A

Porta C 4MSB

•Grupo B

Porta B

Porta C 4LSB

Portas Endereço

A1 A0

A 0 0

B 0 1

C 1 0

Controle 1 1

342

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Modos de |Operação• Modo 0

Programado como entrada ou saída sem protocolo.Porta A, B e C

• Modo 1Programado com entrada ou saída com protocolo.Porta A e B (dados)Porta C (controle)

• Modo 2Bidirecional com protocolo.Porta A (dados)Porta C (controle)

343

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Palavra de Controle de Definição de Modo

D7 D6 D5 D4 D3 D2 D1 D0 Grupo B

Porta C (4 LSB)

1 – entrada

0 – saída

Porta B

1 – entrada

0 – saída

Seleção do Modo

0 – modo 0

1 – modo 1

Modo Porta A Porta C (4 MSB)

0 0 - modo 0 1 – entrada 1 - entrada

0 1 - modo 1 0 – saída 0 - saída

1 X – modo 2

Grupo A

Definição de

Modo

Ativo =1

344

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Palavra de Controle para `setar/resetar` a Porta C

D7 D6 D5 D4 D3 D2 D1 D0

Bit set/reset

1 – set

0 - reset

Seleção do bit

0 1 2 3 4 5 6 7 bit

0 1 0 0 0 1 0 1 D0

0 0 1 1 0 0 1 1 D1

0 0 0 1 1 1 1 1 D2

´setar/resetar´

Ativo =0 Don´t care

345

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Palavra de Contro para `setar/resetar` a Porta C

D7 D6 D5 D4 D3 D2 D1 D0

Bit set/reset

1 – set

0 - reset

Seleção do bit

0 1 2 3 4 5 6 7 bit

0 1 0 0 0 1 0 1 D0

0 0 1 1 0 0 1 1 D1

0 0 0 1 1 1 1 1 D2

´setar/resetar´

Ativo =0 Don´t care

346

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Modo 0 – Entrada

RD

Entrada

CS, A1,A0

D0-D7

347

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Modo 0 – Saída

WR

D0-D7

CS, A1,A0

Saída

348

Paulo Maciel

Controlador Paralelo Programável

PPI 8255

Modo 1 – Entrada

STB

IBF

INTR

Entrada

do I/O

RD

pc

4

pc

4

pc

5

pc

3

pc 6,7

pa7-0

STB

IBF

INTRa

I/O

INTEa

RD

pc

2

pc

2

pc

1

pc

0

pb7-0

STB

IBF

INTRa

INTEb

RD

Porta A

Porta B

349

Paulo Maciel

ACK

OBF

ACK

Controlador Paralelo Programável

PPI 8255

Modo 1 – Saída

WR

OBF

INTR

ACK

pc

6

pc

7

pc

6

pc

3

pc 4,5

pa7-0

OBF

INTRa

I/O

INTEa

WR

pc

2

pc

1

pc

2

pc

0

pb7-0

INTRa

INTEb

WR

Porta A

Porta B

Saída

350

Paulo Maciel

Conexao entre a Porta Paralela e o ProtoBoard

Desta forma utilizamos para a montagem os bits de dados

D0 ~ D4 como saída, e como entrada Ack no pino 10, Busy no

pino 11, Paper end no pino 12, Slct out no pino 13 e Error no pino

15.

A saídas foram conectadas nas 4 entrada do 2º display de

sete segmentos da Placa (que possui decodificador), de acordo

com a sequência;

D0 -> I0 ; D1 -> I1 etc... A saída D4 não está sendo utilizada e de

D5~D7 não foram conectadas.

351

Paulo Maciel

Conexao entre a Porta Paralela e o ProtoBoard

As Entradas estão conectadas as primeiras chaves da placa

e ligada também ao 1º display de sete segmentos, não lembro qual

foi bit foi utilizado como mais significativo e qual como menos

significativo.

Desta forma quando se comuta as chaves de entrada,

verifica-se a alteração no valor do 1º display na placa.

O pino 25 do conector estar servindo de com sinal de

referência(GND) para a Placa.

Obs: o Lembrando que o sinal de Controle BUSY invertido pelo

hardware da Porta Paralela

352

Paulo Maciel

C com Assembly

/* C com Assembly - Inline -

Teste de Presenca de Paralela - */

#include <stdio.h>

int main()

{

printf("Teste da Paralela \n");

asm mov dx,0x378

asm mov al,0xf0

asm mov ah,al

asm out dx,al

asm xor al,al

asm mov dx,0x378

asm in al,dx

asm xor al,ah

asm jnz t

printf("LPT1 presente!\n");

t:

return 0;

}

353

Paulo Maciel

Convenção de Chamada a Funções C no

DOS

As funções devem preservar os valores dos registradores E(BP)

Os valores são retornados em EAX e EAX/EDX. Valores float

retornam no topo dos registradores de ponto flutuante. Strings,

estruturas são retornado por referência e EAX é o ponteiro.

Parâmetros passados em ordem reversa.

A função não remove os parâmetros da pilha. A função

chamadora deve ajustar o valor do E(SP).

354

Paulo Maciel

C com Assembly

/* C com Assembly - Inline -

Teste de Presenca de Paralela - */

#include <stdio.h>

extern int xplusy(int x, int y);

int main()

{

int a,b

a=5;

b=7;

printf(“A soma é %d”,xplusy(a,b));

return 0;

.MODEL SMALL

.CODE

PUBLIC xplusy

xplus PROC NEAR

PUSH BP

MOV BP,SP

SUB SP,02

MOV AX,[BP+04]

ADD AX,[BP+06]

MOV [BP-02],AX

MOV SP,BP

POP BP

RET

xplusy ENDP

END

355

Paulo Maciel

C com Assembly

.MODEL SMALL

.CODE

PUBLIC xplusy

xplus PROC NEAR

PUSH BP

MOV BP,SP

SUB SP,02

MOV AX,[BP+04]

ADD AX,[BP+06]

MOV [BP-02],AX

MOV SP,BP

POP BP

RET

xplusy ENDP

END

.

1004/5 12 z

1005/6 valor de BP

1007/8 endereço de retorno

1009/A 5 a

100B/C 7 bTopo da Pilha

do Main

356

Paulo Maciel

C com Assembly

/* C com Assembly - Inline -

Teste de Presenca de Paralela - */

#include <stdio.h>

extern int xplusy(int x, int y);

int main()

{

int a,b

a=5;

b=7;

printf(“A soma é %d”,xplusy(a,b));

return 0;

.MODEL SMALL,C

.CODE

PUBLIC xplusy

xplus PROC NEAR C, x:word,

y:word

LOCAL z:word

MOV AX,x

ADD AX,y

MOV z,AX

RET

xplusy ENDP

END

357

Paulo Maciel

C com Assembly

/* C com Assembly - Inline -

Teste de Presenca de Paralela - */

#include <stdio.h>

extern int xplusy(int x, int y);

int main()

{

int a,b

a=5;

b=7;

printf(“A soma é %d”,xplusy(a,b));

return 0;

Código gerado para xplusy:

PUSH BP

MOV BP,SP

SUB SP,02

MOV AX,[BP+04]

ADD AX,[BP+06]

MOV [BP-02],AX

MOV SP,BP

POP BP

RET

358

Paulo Maciel

C com Assembly

bcc -S nome.asm nome.c

- converte arquivo C em assembly

bc - BorlandC

tasm – TurboAssembler (ex.:tasm testS.asm /MX,

onde a opção /MX possibilita o acesso a variáveis

externas)

td - TurboDebugger

359

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Linux Boot Time Programming – Uma Primeira

Visão

• Modos de Operação dos Processadores da família x86

atuais:

• Modo Real

• Modo Protegido

• Modo Virtual

• Modo de Gerenciamento

360

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Linux Boot Time Programming – Uma Primeira

Visão

• Modos de Operação dos Processadores da família x86

atuais:

• Modo Real

• Modo Protegido

• Modo Virtual

• Modo de Gerenciamento

• Na inicialização, o processador está no Modo Real

361

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Linux Boot Time Programming – Uma Primeira

Visão

• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Armazenar código em local apropriado, pois quando houver a

mudança para o modo protegido os endereços físicos serão

gerados de maneira completamente diferente.

• Prepara a Interrupt Descriptor Table (IDT), pois os vetores da

IDT são de 8 bytes e os vetores da tabela de vetores de

interrupção do DOS são de apenas 4 bytes.

• Executar o código de mudança para o modo protegido.

362

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Linux Boot Time Programming – Uma Primeira

Visão

• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• O Processador tem um registrador de base e um de limite para a

Global Descriptor Table. Estes registradores são carregados

com a instrução LGDT mem.

• mem é o endereço base de uma região de 6 bytes que armazena:

2 bytes de limite + 4 bytes de endereço base para Global

Descriptor Table.

363

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Linux Boot Time Programming – Uma Primeira

Visão

• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Suponha que queiramos definir uma Global Descriptor Table

com 10 descritores e que o endereço base da GDT é 10000H.

• Como cada descritor tem 4 palavras (8 bytes), a GDT terá 80

bytes (50H). Portanto, o limite é 80-1= 79 (50H – 1H = 4FH).

364

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Linux Boot Time Programming – Uma Primeira Visão

• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Desta forma, usaremos uma área de memória para armazenar estas informações (limite e endereço base).

MOV AX,2000H

MOV DS,AX

MOV AX,4FH

MOV [DS:0],AX ;armazena o limite

MOV EAX,100000H

MOV [DS:2],EAX ; armazena o endereço base

LGDT [DS:0] ; carrega os rgistradores de base e de limite

365

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Linux Boot Time Programming – Uma Primeira

Visão

• Preparação para mudar para Modo Protegido:

• Executa código de mudança para o modo protegido.

• Os processadores da família x86 têm um registrador de controle

denominado CR0. Quando o bit 0 deste registrador é feito 1, o

processador muda para o Modo Protegido.

MOV EAX,CR0

OR EAX,1

MOV CR0,EAX ; muda para o modo protegido

366

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Linux Boot Time Programming – Uma Primeira Visão

• Preparação para mudar para Modo Protegido:

• Ao mudar para o Modo Protegido o processador não inicia a paginação. Tornando o bit 31 do CR0 igual a 1, faz com que se inicie o processo de paginação.

• 31 - PG = Paginação habilitada

• 30 - CD = Cache Desabilitada

• 29 - NW = No Writethrough

• 15 - WP = Write Protection

• 2 - EM = Emulate Math chip

• 1 - MP = Math chip Present

• 0 - PE = Protect Mode Enable

367

Paulo Maciel

Programação de Baixo Nível em

Linux• Programas de Usuário

• Pentium suporta segmentação e paginação

• As versões atuais do Linux suportam apenas paginação.

Aplicaçãodo Usuário

SO

Memória e

I/O

368

Paulo Maciel

Programação de Baixo Nível em

Linux

• Task State Segment

CR3 (PDBR)EIP

EFLAGSEAXECXEDXEBXESPEBPESIEDI

...

242832364044485256606468

Task register (TR)aponta para o TSS da tarefa executada no momento.

CR3 = Control registerPDBR = Page DiretoryBase Register

369

Paulo Maciel

Programação de Baixo Nível em

Linux• Paginação

Não é usada nas operações de acesso a I/O.

Memória Virtual no Linux

Espaço de endereçamento: 0 – 4Gb

T1

T2

Tn

Sistemade

Paginação

Mem

Disco

0

4Gb0

4Gb

0

4Gb

370

Paulo Maciel

Programação de Baixo Nível em

Linux• Paginação

Não é usada nas operações de acesso a I/O.

Memória Virtual no Linux

Espaço de endereçamento: 0 – 4Gb

Kernel

T1

Tn

Sistemade

Paginação

Mem

Disco

3

4Gb0

3Gb

0

3Gb

Espaçodo

Usuário

Kernel

0

3Gb

4Gb

Visão da Memóriade um processo

371

Paulo Maciel

Programação de Baixo Nível em

Linux

• Paginação

• O espaço de endereçamento é dividido em blocos denominados páginas.

• É comum chamar este espaço na memória física (silicio) de page frames.

• Em máquinas x86 as páginas são de 4096 bytes (4Kb)

• Caso a página não se encontre na memória física, um page fault (interrupção)

ocorre. O serviço desta interrupção efetua a leitura do disco, o correspondente

armazenamento/substituição.

Kernel

T1

Tn

Sistemade

Paginação

Mem

Disco

3

4Gb0

3Gb

0

3Gb

372

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido:

MOV EAX,[DS:00080000H]Seletor de 16 bits Offset de 32 bits

Global/LocalDescriptor Table

GDT/LDT = registradores

Segment Descriptor

0H

8H

10H

18H

FFF8H

0

12

3

8191

32 bitbase address

Endereço Linear – 32 bits

Endereço Lógico

PagingTranslation

Endereço Físico – 32 bits

373

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido

• Registradores Seletores:

• CS,DS,ES,FS,GS,SS

• Layout do Seletor:

Índice – 13 bits RPLTI

Indicador de Tabela

0 – GDT

1 - LDT Privilégio

00 – mais alto011011 – mais baixo

374

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido

• Layout do Seletor:

• Ex.:

MOV AX,33H

MOV DS,AX

MOV EAX,[DS:00080000H]

Índice – 13 bits RPLTI

Indicador de Tabela

0 – GDT

1 - LDT Privilégio

00 – mais alto011011 – mais baixo

Como cada segment descriptor tem 8 bytes, o 3 bits LSB dos seletores são desprezados.

375

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido

• Layout do Seletor:

• Ex.:

MOV AX,33H

MOV DS,AX

MOV EAX,[DS:00080000H]

Índice – 13 bits RPLTI

Indicador de Tabela

0 – GDT

1 - LDT Privilégio

00 – mais alto011011 – mais baixo

0 0 3 3 H

0000 0000 0011 0011 b

0000 0000 0011 0000 = 0030 H

376

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido:

MOV EAX,[DS:00080000H]Seletor de 16 bits Offset de 32 bits

Global/LocalDescriptor Table

GDT/LDT = registradores

Segment Descriptor

0H

8H

10H

18H

FFF8H

0

12

3

8191

32 bitbase address

Endereço Linear – 32 bits

Endereço Lógico

PagingTranslation

Endereço Físico – 32 bits

377

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido:

Segment Descriptor Base Address

15 0

Segment limit

Base Address(16-23)

Base Address(24-31)

P DPL Outras Inform.

Outras Inform.

P – segmento presente em memóriaDPL – nível de privilégio

Palavra 0

Palavra 1

Palavra 2

Palavra 3

378

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido:

Endereço0000000H

2000000H

20FFFFFH

3FFFFFFH

Base: 2000000HLimite: 00FFFFFH

64Mb RAM

Segmento de 1MB

MOV EAX,[DS:80000H]

2080000H...

2080003H

80003H < FFFFFH OK

379

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido:

Endereço0000000H

2000000H

20FFFFFH

3FFFFFFH

Base: 2000000HLimite: 00FFFFFH

64Mb RAM

Segmento de 1MB

MOV EAX,[DS:180000H]

2180000H...

2180003H

180003H > FFFFFH General Protection Fault

380

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido:

• No LINUX atual a base é 0H e o limite é FFFFFFFFH, ou

seja 4GB.

• Na prática: temos um único segmento.

Base: 00000000HLimite: FFFFFFFFH

381

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido:

Base: 00000000HLimite: FFFFFFFFH

MOV EAX,[DS:180000H]

00180000H...

00180003H

180003H < FFFFFFFFH OK

382

Paulo Maciel

Endereçamento de Memória

• Segmentação no Modo Protegido:

MOV EAX,[DS: 801C3400H]Seletor de 16 bits Offset de 32 bits

Global/LocalDescriptor Table

GDT/LDT = registradores

Segment Descriptor

0H

8H

10H

18H

FFF8H

0

12

3

8191

32 bitbase address=00000000H

Endereço Linear – 32 bits

Endereço Lógico

PagingTranslation

Endereço Físico – 32 bits

Endereço Virtual= 801C3400H

383

Paulo Maciel

Programação de Baixo Nível em

Linux

• Paginação

• A memória física é dividida em page frames. Dado que cada página tem 4096 byte = 212 =4 Kb = 1000H, toda página inicia em um endereço que tem 3 zeros.

• O espaço virtual de cada tarefa é também dividido em páginas:

4Gb † 4Kb = (4 × 230) † (4 × 212) = 220 = 1 Megapáginas.

• A área do disco usada para paginação é também dividida em páginas. Esta área é denominada área de swap. Dado que a maioria dos discos são formatados em setores de 512 bytes, portanto são necessários 8 setores para armazenar cada página (8 × 512 = 4096).

A área de memória reservada para o kernel será compartilhada por todas as tarefas.

384

Paulo Maciel

Endereçamento de Memória

• Paginação

• Exemplo: enderço virtual 801C3400H

Endereço Virtual

CR3Page Table Table (Page Directory) Page Table

1000000000 0111000011 010000000000

E4000+”000”

01234+”000”

200H1C3H

400H

+ 01234400H

Endereço Físico

385

Paulo Maciel

Programação de Baixo Nível em

Linux

• Paginação

• Entradas das Page (Table) Table

Endereço da página US

WR

PP

31 12 11 2 1 0

Como cada page frame tem três zeros (000H) na parte inferior do endereço, podemos definir o endereço usando apenas os 20 bitsmais significativos do endereço.

PP – página presente. Quando em 1, significa que a página está na RAMCaso PP=0, podemos ter duas situações: a página pode estar no disco (ocorre page fault)

endereço inválido (ocorre segmentation fault).

386

Paulo Maciel

Programação de Baixo Nível em

Linux

• Paginação

• Entradas das Page (Table) Table

Endereço da página US

WR

PP

31 12 11 2 1 0

•O fato do espaço de endereçamento do kernel ser compartilhadopor todas as tarefas, pode dar a impressão que a memória do kernel pode ser usada por estas tarefas. Código do usuário só pode ter acessoa esta área via system calls.•O código do usuário é bloqueado por US (user-supervisor) bit.US=1 não bloqueia o acesso. Se US=0, dois bits de pivilégio (do registrador CPL) são analisados. Código do usuário tem CPL=3.•No Linux: CPL = 0 – tarefas do kernel• CPL = 3 – tarefas do usuário.

387

Paulo Maciel

Programação de Baixo Nível em

Linux

• Paginação

• Entradas das Page (Table) Table

Endereço da página US

WR

PP

31 12 11 2 1 0

•Memória onde é próibido a escrita WR =0•Memória onde é possível a escrita WR =1

388

Paulo Maciel

Programação de Baixo Nível em

Linux

• Paginação

• Tradução do Endereço (hardwired)

Endereço Virtual

CR3Page Table Table (Page Directory) Page Table 4kb page frame

10 bits 10 bits 12 bits

389

Paulo Maciel

Programação de Baixo Nível em

Linux

• Paginação

• Exemplo: enderço virtual 801C3400H

Endereço Virtual

CR3Page Table Table (Page Directory) Page Table

1000000000 0111000011 010000000000

E4000+”000”

01234+”000”

200H1C3H

400H

+ 01234400H

Endereço Físico

390

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Segmento de código e dados:

• Código

[SECTION] .text

• Dados

[SECTION] .data

•Definesx db 2y dw 3z dq 4z1 dt 5

byte2 bytes4 bytes10 bytes

391

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Segmento de código e dados:

• Exemplo:

global main

[SECTION .text]

main : push ebp

mov ebp,esp

push ebx; Program a dever

push esi; preservar ebp, ebx, esi, edi

push edi

MOV AL,[XYZ]

INC AL

MOV [XYZ],AL

pop edi ; Restaurapop esi ; registradorespop ebxmov esp,ebppop ebp

RET

[SECTION] .data]XYZ: db 3

392

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Dados não inicializados

[SECTION .bss]X resb 1Y resb 128Z resq 4

Reservax resb 1y resw 1z resd 1z1 resq 1z2 rest 1

Sintaxe:res(b/w/d/q/t) #de itens

byte2 bytes4 bytes8 bytes10 bytes

393

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Dados não inicializados

[SECTION .text]

global main

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

; sua funcionalidade

pop edi

pop esi

pop ebx

mov esp,ebp

pop ebp

retABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

[SECTION .bss]X resb 1Y resb 128

394

Paulo Maciel

• Inicialização Múltipla

Formato:

nome TIMES numero tipo valor

Exemplo:

L1 TIMES 8 DW 0

ABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]XYZ db 4 * 0 L1 TIMES 8 DB 0

[SECTION .bss]X resb 1Y resb 128

Introdução ao NASM

395

Paulo Maciel

• Constante

Formato:

nome EQU expressão

Exemplo:

c1 EQU 0

MOV EAX, C1

Introdução ao NASM

396

Paulo Maciel

• NASM

L1 DW 2300H,0045H,...

LEA BX,[L1] ;SÃO EQUIVALENTES

MOV BX, L1 ;CARREGA O ENDEREÇO EFETIVO EM BX

• MASM/TASM

L1 DW 2300H,0045H,...

LEA BX,L1 ;SÃO EQUIVALENTES

MOV BX,OFFSET L1 ;CARREGA O ENDEREÇO EFETIVO EM BX

MOV BX,L1 ;BX=2300H

Introdução ao NASM

397

Paulo Maciel

MACRO - Possibilita atribuir um nome a um bloco de

código e utiliza-lo, através deste nome, no seu programa.

FORMATO DA DECLARAÇÃO:

%nome macro numero_de_parametros

statements

%nome endmacro

FORMATO PARA CHAMAR A MACRO

nome argumentos

Introdução ao NASM

398

Paulo Maciel

• MACRO - Possibilita atribuir um nome a um bloco

de código e utilizá-lo, através deste nome, no seu

programa.

Introdução ao NASM

Ex.:

Ex.: Ex.:

399

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux• Vimos que os programas têm segmentos que devem ser salvos

em página diferentes devido aos requisitos de escrita (áreas que podem ser escritas ou não).

• Portanto, estas localizações devem ficar explícitas no arquivo executável para que o SO possa carregar estas áreas em páginas de memória física que respeitem estas restrições.

• Por estas razões, os arquivos executáveis devem ter um formato definido.

• Desde a versão 2.0 do Linux o formato adotado tem sido o ELF.

400

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux• Arquivos Executáveis em ELF

• ELF – Executable and Linking Format

• SO Unix consideram três formatos para arquivos executáveis: COFF

(Commom Object File Format), a.out (não há relação com o arquivo

gerado pelo compilador C) e ELF.

• Nas versões atuais dos SO Unix ELF é o formato mais comum.

401

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux• Formato ELF

ELF Header

Segment 1

Segment 2

Segment 3

Segment 4

Program Header Table

Section Header Table

Section 1

Section n

402

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Formato ELF

o Arquivos executáveis do Linux 2.0 têm normalmente pelo menos 5 segmentos (lembrem que estamos falando de áreas e não de segmentação de memória):

o o Segmento 0 é o Program Header.

o Os outros são:o Um para código e informações que não possam/precisem ser alteradas

em tempo de execução,

o Um para dados inicializados e que precisam ser alterados ao longo da execução do programa,

o Um para dados não inicializados e

o Um para dados cujo espaço de memória será alocado dinamicamente.

403

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux• ELF Header

o Identifica o arquivo como um arquivo ELF e especifica o seu tipo. Também define o tamanho e localização do Program Header Table e da Section Header Table.

o O formato do ELF Header é:o Primeiro entrada: string de identificação contendo ELF.

o Segunda entrada: número que especifica o tipo do arquivo:

1 – arquivo objeto

2 – arquivo executável

3 – arquivo objecto compartilhado

4 – arquivo core

o Terceira entrada: especifica a arquitetura – 3 = arquitetura x86.

o Tem-se 11 entradas a mais.

404

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Program Header Tableo O Program Header Table tem uma entrada para cada

segmento. Cada entrada contém oito ítens de informação.o Type: 1 se o segmento deve ser carregado quando o arquivo é

executado. Os outros tipos não são carregados .

o File Offset: fornece a localização do segmento dentro do arquivo –número de bytes a partir do início do arquivo.

o Virtual Address: o endereço onde deve ser armazenado o primeiro byte do segmento.

o Phisical Address: não é considereado na arquitetura x86.

o File Size: número de bytes no segmento antes de ser carregado.

o Memory Size: número de bytes no segmento depois da carga.

o Permissions: este código contém informações relacionadas a permissões de leitura, escrita e execução.

o Aligment: o segmento deve começar em um múltiplo deste número.

405

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Program Header Table

o Permissions

r w x

1 1 0 = 6 leitura e escrita

1 0 1 = 5 leitura e execução

1 = habilita opção

0 = desabilita opção

O programa ob fornece o Program Header Table de um arquivo

406

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Section Header Table• Fornece informações sobre todas as seções do arquivo. As informações

são atibutos sobre permissão (leitura, escrita e execução), tipo

(programa, tabela de símbolos, informação dinâmica etc)

• Seções

• Quando o linker cria segmento de texto/dados (código/dados),

combina seções de texto/dados (código/dados) dos arquivos objeto.

• Quando linker liga os arquivos objeto é necessário definir o endereço

onde a execução deve ser iniciada. O programador pode faze-lo

utilizando o label main e tornando-o visível para todas as seções

(linker) através da diretiva global.

407

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Ponto de Entrada

[SECTION .text]

global main

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

; sua funcionalidade

pop edi

pop esi

pop ebx

mov esp,ebp

pop ebp

retABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

[SECTION .bss]X resb 1Y resb 128

408

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Como o gcc constrói arquivos executáveis Linux

gcc

cpp

gas

ld

.c

executável

.c

.s

.o

gcc exe1.c –o exe1

409

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Como usar o gcc em trabalhos com assembly

• Evitamos o gas, devido a sintaxe dos mnemônicos AT&T.

• Usaremos Nasm (assembler) + ferramentas gcc como linker.

• nasm –f elf exe1.asm - assembler

• gcc exe1.o –o exe1 - linker

410

Paulo Maciel

Introdução ao NASM e a

programação em ambiente Linux

• Outra informação:

• gcc –S nome.c

• O comando acima gera um arquivo nome.s que é um assembly no formato AT&T (você pode investigar este arquivo para compreender como o C “funciona”)

• Exemplo1:

no Vmware em /mnt/hgfs/C/teste_pont , verifique os arquivos t1.c e t1.s

• Exemplo1:

no Vmware em /mnt/hgfs/C/teste_pont , verifique os arquivos t2.c e t2.s

411

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Passagem de Parâmetros em Funções C

sum(a,b,c,d)

Padrão C

412

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Passagem de Parâmetros em Funções C

413

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Passagem de Parâmetros em Funções C

• Em geral os registradores EBP, EBX, ESI e EDI

são preservados (ou seja, não são usados nas funções),

mas isto não é uma regra.

414

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Retorno de Valores de Funções C

• Valores de 8, 16 e 32 bits são devolvidos em EAX,

• Valores de 64 bits são devolvidos em EDX:EAX,

• Valores de ponto flutuante são devolvidos em ST0,

• Endereços (ponteiros) são devolvidos em EAX.

415

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

#include <stdio.h>

extern int increm(int z);

int main(void)

{

int x,y;

x=1;

y=increm(x);

printf("x 'e %d e y e„ %d\n",x,y);

(0);

}

push ebx ; Program must preserve ebp, ebx, esi, &edipush esipush edi

push dword msg; Push a 32-bit pointer to the message on thestackcall puts ; Call the C library function for displaying stringsadd esp, 4 ; Clean stack by adjusting esp back 4 bytes

pop edi ; Restore saved registerspop esipop ebx

pop eax ; recovering eax

mov esp,ebp ; Destroy stack frame before returningpop ebpret ; Return control to Linux

[SECTION .data] ; Section containing initialised data

msg: db "Teste!",0

[SECTION .bss] ; Section containing uninitialized data

[SECTION .text] ; Section containing code

extern puts ; Simple "put string" routine from C libraryglobal increm ;Required so linker can find entry pointincrem:

push ebp ; Set up stack frame for debuggermov ebp,espmov eax,[ebp+8]inc eax ; incrementing the parameter valuepush eax ; pushing the result, since puts might use

eax

Não considere o código em vermelho

416

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Veja exemplo em:

/mnt/hgfs/C/teste

(teste.c e increm.asm)

no VMWare Linux

Veja o arquivo CompilarExecutar:

>mnt/hgfs/Nasm/nasm-0.98/nasm -f elf /mnt/hgfs/C/teste/increm.asm>gcc -c teste.c -o teste.o>gcc teste.o increm.o -o teste>/mnt/hgfs/C/teste/teste

- c informa ao gcc para para após a compilação (não linkar).

417

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Veja exemplo em:

/mnt/hgfs/C/teste

(teste.c e increm.asm)

no VMWare Linux

Veja o arquivos makefile:

teste: teste.o increm.ogcc teste.o increm.o -o teste

teste.o: teste.cgcc -c teste.c -o teste.o

increm.o: increm.asm/mnt/hgfs/Nasm/nasm-0.98/nasm -f elf /mnt/hgfs/C/teste/increm.asm

- c informa ao gcc para para após a compilação (não linkar).

418

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Passagem de Parâmetros em Funções C

• Instrução enter

• enter bytes,level

• bytes – número de bytes relativos as variáveis locais da

função (procedimento).

• level – nível de aninhamento do procedimento.

419

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Passagem de Parâmetros em Funções C

• Instrução enter

Exemplo:

enter xx,0

420

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Passagem de Parâmetros em Funções C

• Instrução leave

Exemplo:

leave

421

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

422

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Assembly chama bibliotecas C – Escrita em Tela

; nasm –f elf exe1.asm

;gcc exe1.o –o exe1

[SECTION .text]

extern puts

global main

main :

push ebp

mov ebp,esp

push ebx

push esi

push edi

push dword mens1

call puts

add esp,4

pop edipop esipop ebxmov esp,ebppop ebpret

[SECTION .data]mens1 db “Bom Teste”,0AH,0

[SECTION .bss]

423

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Assembly chama bibliotecas C –

Escrita Formatada em Tela[SECTION .text]

global main

extern printf

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

push dword ABC

call printf

add esp,4

mov eax,[XYZ]add eax,eaxinc eaxpush eaxpush dword CDEcall printf add esp,8pop edipop esipop ebxmov esp,ebp

pop ebpret

ABC db “Bom Dia”,0AH,0CDE db “O valor e’ %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4

424

Paulo Maciel

• Inserindo Sub-rotina em Bibliotecas

• Crie um arquivo com código fonte e insira a sub-rotina neste

arquivo. O arquivo deve ter a extensão .asm. Este arquivo não deve

ter ponto de entrada (main).

• Associe o termo global a todos os lables associados as rotinas que

serão chamadas e todos os demais lables que venha ser utilizados

por programas chamadores.

• Caso as sub-rotinas chamem rotinas em bibliotecas C ou outras

rotinas em outras bibliotecas que você mesmo tenha criado, ou ainda

usem variáveis ou identificadores definidos fora da rotina, declare

tais identificadores como extern.

Introdução à Integração C e

Assembly em ambiente Linux

425

Paulo Maciel

• Inserindo Sub-rotina em Bibliotecas

• Utlitário make realiza um conjunto de atividade descritas

no makefile, contudo executando apenas o que foi alterado

(verificado pela data de alteração dos arquivos) desde a

última execução.

Introdução à Integração C e

Assembly em ambiente Linux

426

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Inserindo Sub-rotina em Bibliotecas

• Quando adicionar rotinas de uma biblioteca ao seu programa,

atualize o makefile deste programa de maneira que o executável

tenha as dependências das bibliotecas.

• Exemplo de makefile:

textfile: textfile.o linlib.o - dependência

gcc textfile.o linlib.o –o textfile - como obter textfile

textfile.o: testfile.asm -dependência

nasm –f elf textfile.asm - como obter textfile.o

linlib.o: linlib.asm - dependência

nasm –f elf linlib.asm - como obter linlib.o

427

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Veja exemplo em:

/mnt/hgfs/C/eagtlinux

(eagtlinux.asm)

no VMWare Linux

Veja os arquivos makefile, o fonte ( .asm) e os arquivos CompilarExecutar

428

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

; Build using these commands:

; nasm -f elf eatlinux.asm

; gcc eatlinux.o -o eatlinux

;

[SECTION .text] ; Section containing code

extern puts ; Simple "put string" routine from C

; library

global main ; Required so linker can find entry

point

main:

push ebp ; Set up stack frame for debugger

mov ebp,esp

push ebx ; Program must preserve ebp, ebx, esi, & edi

push esi

push edi

push dword eatmsg ; Push a 32-bit pointer to the message on the stack

call puts ; Call the C library function for displaying strings

add esp, 4 ; Clean stack by adjusting esp back 4

; bytes

pop edi ; Restore saved registers

pop esi

pop ebx

mov esp,ebp ; Destroy stack frame before returning

pop ebp

ret ; Return control to Linux

[SECTION .data] ; Section containing

; initialised

data

eatmsg: db "Eat at Joe's!",0

[SECTION .bss] ; Section containing

uninitialized data

429

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Veja exemplo em:

/mnt/hgfs/C/eagtlinux

(eagtlinux.asm)

no VMWare Linux

Veja o arquivo CompilarExecutar

>/mnt/hgfs/Nasm/nasm-0.98/nasm -f elf /mnt/hgfs/C/eatlinux/eatlinux.asm>gcc eatlinux.o -o eatlinux>/mnt/hgfs/C/eatlinux/eatlinux

430

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Veja exemplo em:

/mnt/hgfs/C/eagtlinux

(eagtlinux.asm)

no VMWare Linux

Veja o arquivo makefile:

eatlinux: eatlinux.ogcc eatlinux.o -o eatlinux

eatlinux.o: eatlinux.asm/mnt/hgfs/Nasm/nasm-0.98/nasm -f elf

/mnt/hgfs/C/eatlinux/eatlinux.asm

431

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Inserindo Sub-rotina em Bibliotecas

• Quando chamar rotinas assembly contidas em um arquivo de um

programa C (em outro arquivo), atualize o makefile de maneira que

o executável tenha as dependências das bibliotecas.

• Exemplo de makefile:

textfile: textfile.o linlib.o - dependência

gcc textfile.o linlib.o –o textfile - como obter textfile

textfile.o: testfile.c -dependência

gcc –c textfile.c –o textfile.o - como obter textfile.o

linlib.o: linlib.asm - dependência

nasm –f elf linlib.asm - como obter linlib.o

- c informa ao gcc para para após a compilação (não linkar).

432

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Veja exemplo em:

/mnt/hgfs/C/teste

(teste.c e increm.asm)

no VMWare Linux

Veja os arquivos makefile os fontes (.c e .asm) e os arquivos CompilarExecutar

433

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Assembly chama bibliotecas C – Leitura do Teclado com

fgets

• Manipuladores de Arquivo Padrão:

• stdin (teclado)

• stdout (tela)

• stderr (tela)

• Para utilizar um manipulador no seu código assembly, declare-o

com externo.

434

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Assembly chama bibliotecas C – Leitura do Teclado com

fgets

• Como usar o fgets

• Declare: extern fgets e extern stdin

• Declare um buffer (use a diretiva resb) em uma seção [.bss] de tamanho

suficiente para armazenar o dado.

• Empilhe o manipulador, o valor que representa o número máximo de

carateres a serem lidos e o endereço do buffer onde queremos armazenar as

informações.

435

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Assembly chama bibliotecas C –

Leitura do Teclado com fgets[SECTION .text]

global main

extern stdin

extern fgets

main :

push ebp

mov ebp,esp

push ebx

push esi

push edi

push dword [stdin]

push dword 72

push instring

call fgets

add esp,12

ret

[SECTION .data]

[SECTION .bss]instring resb 96

436

Paulo Maciel

Introdução à Integração C e Assembly em

ambiente Linux Leitura do Teclado com scanf

[SECTION .text]

global main

extern printf

extern scanf

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

push dword ABC

call printf

add esp,4

push dword XYZ

push dword BCD

call scanf

add esp,8mov eax,[XYZ]

add eax,eaxinc eaxpush eaxpush dword CDEcall printf add esp,8pop edipop esipop ebxmov esp,ebp

pop ebpret

ABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

437

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Chamando C do Assembler[SECTION .text]

global main

extern printf

extern scanf

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

push dword ABC

call printf

add esp,4

push dword XYZ

push dword BCD

call scanf

add esp,8mov eax,[XYZ]

add eax,eaxinc eaxpush eaxpush dword CDEcall printf add esp,8pop edipop esipop ebxmov esp,ebp

pop ebpret

ABC db “Entre um número”,0AH,0BCD db “%d \x0”, 0AH,0CDE db “Voce obteve %d. \x0”,0AH,0

[SECTION .data]

XYZ db 4 * 0

438

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Usando Funções de Tempo do C

• Está estabelecido que a “Era” Unix iniciou-se em 1 de Janeiro de 1970 as 00:00:00 hs

• A cada segundo que se passa adiciona-se 1 a este valor.

• Quando você ler o tempo ou uma data através de bibliotecas do C, você obtêm o número atual desta associado a uma variável.

• Esta variável é denominada time_t.

• Para obter o valor de time_t, chama-se a funçãotime.

439

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Usando Funções de Tempo do C

• A função time pode retornar valores de duas

maneiras:

• em EAX

• em um buffer que você tenha definido

• Para ter o tempo armazenado no buffer você tem

que passar o ponteiro do endereço inicial do buffer

como parâmentro (via pilha).

• Se você não quer armazenar o tempo no buffer,

você tem que passar um ponteiro nulo (0) como

parâmetro.

440

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Usando Funções de Tempo do C[SECTION .text]

global main

extern time

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

push dword 0

call time

add esp,4

mov [oldtime],eax

pop edipop esipop ebxmov esp,ebp

pop ebpret

[SECTION .data]

…[SECTION .bss]oldtime resb 4

441

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Usando Funções de Tempo do C

• Existe uma função que converte o valor obtido

por time em uma string formatada como o

exemplo: Thu Dec 2 13:59:20 1999

• Esta função é ctime.

• Para usa-la você deve passar o endereço da

variável que tem a informação do tempo.

• ctime devolve em EAX um ponteiro para string.

442

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Usando Funções de Tempo do C[SECTION .text]

global main

extern time

extern ctime

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

push dword 0

call time

add esp,4

mov [oldtime],eax

push dword oldtime ;empilha-se o endereço; de oldtime

call ctime ; retorna um ponteiro; para a string em EAX

add esp,4…

pop edi pop esipop ebxmov esp,ebp

pop ebpret[SECTION .data]

…[SECTION .bss]oldtime resb 4

443

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Usando Funções de Tempo do C

• Há uma estrutura que agrupa nove informações de 32 bits relacionadas com o tempo: a estrutura tm.

• Valores contidos na estrutura tm:• offset em bytes C library name Definição

0 tm_sec segundos

4 tm_minminutos

8 tm_hourhoras

12 tm_mday dia do mês

16 tm_mon mês

20 tm_year ano

24 tm_wday dia da semana

28 tm_yday dia do ano

32 tm_isdst flag para daylight savings

444

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Usando Funções de Tempo do C

• Há uma estrutura que agrupa nove informações de 32 bits

relacionadas com o tempo: a estrutura tm.

• Para obter as informações de tempo através da estrutura

tm, chama-se a função localtime.

• Passa-se o endereço da variável que tem a informação do

tempo (o valor de time_t) como parâmetro (via pilha).

• localtime retorna um ponteiro em EAX que aponta para o

endereço base da estrutura tm.

445

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

• Usando Funções de Tempo do C[SECTION .text]

global main

extern time

extern localtimeextern printf

main :

push epb

mov ebp,esp

push ebx

push esi

push edi

push dword 0

call time

add esp,4

mov [oldtime],eax

push dword oldtimecall localtimeadd esp,4mov edx, dword[eax+20]push edxpush dword yrmsgcall printfadd esp,8…pop edi pop esipop ebxmov esp,ebp

pop ebpRet[SECTION .data]yrmsg db “O ano e’19%d.”,10,0[SECTION .bss]oldtime resb 4

446

Paulo Maciel

Introdução à Integração C e

Assembly em ambiente Linux

Ponto Flutuante

447

Paulo Maciel

Endereçamento de Interrupções

• Interrupções no Modo Protegido

• No Petium o reconhecimento de uma interrupção é

sinalizada por D/C# = 0, M/IO# = 0 e W/R# = 0.

• Após o reconhecimento o Contolador coloca na parte

menos significativa do barramento de dados um número

de 8 BITS.

• O processador utiliza este número como um índice para

uma tabela denominada Interrupt Descriptor Table (ITD).

Esta tabela contém os endereços para os serviços de

interrupção.

448

Paulo Maciel

Endereçamento de Interrupções

• Interrupções no Modo Protegido

• Dado que o número de uma interrupção é uma informação

de 8 bits, os números válidos de uma interupção variam de

0 a 255.

• A criação e carga desta tabela é responsbilidade do SO.

Esta tarefa é executa na inicialização do sistema (boot

time)

• Processadores da arquitetura x86 têm um registrador

específico que armazena o endereço da ITD, o registrador

IDT.

449

Paulo Maciel

Endereçamento de Interrupções

• Interrupções no Modo Protegido

• Existem instruções especiais para manipular o registrador

IDT:

• LIDT mem

Carrega o registrador com um enderço.

Esta instrução é utilizada na inicialização do sistema, após a

IDT ter sido criada, de maneira que o registrador IDT terá o

endereço base da tabela IDT.

• SIDT mem

Armazena o valor do registrador na memória.

450

Paulo Maciel

Endereçamento de Interrupções

• Interrupções no Modo ProtegidoEndereço

b gate # 0

b+8 gate # 1

b+16 gate # 2

b+24 gate # 3

.

.

.

b+2040 gate # 255

Registrador IDT tem valor igual a b

451

Paulo Maciel

Endereçamento de Interrupções

• Interrupções no Modo Protegido

• Uma vez obtido o endereço da rotina de serviço de

interrupção (ISR), o processador empilha o endereço da

próxima instrução e o registrador EFLAGS.

• Quando o ISR é finalizada, o que é feito através do IRET,

o registrador EFLAGS são desempilhados, assim como o

endereço de retorno.

• As solicitações de interrupção só serão aceitas se IF =1.

As instruções STI e CLI habilitam e desabilitam as

interrupções, respectivamente.

452

Paulo Maciel

Interrupções

• Interrupções no Modo Protegido

• No final da execução do serviço de interrupção, no PC – que usa um PIC 8259 -, o programador envia um comando de fim de interrupção (EOI) para o PIC. Este comando é executado escrevendo-se no endereço 20h um valor informando a finalização da interrupção de número especificado. Podemos efetuar uma finalização genérica (sem determinar uma interrupção específica). Fazemos isto enviando o valor 20h (ver datasheet do PIC 8259).

• Ex.: mov dx,20h ; um endereço de controle da 8259 mestre no PC

out dx,20h ; EOI genérica

mov dx,0A0h ;um endereço de controle do 8259 escravo.

out dx,20h ; EOI genérica

453

Paulo Maciel

Interrupções

• Interrupções no Modo Protegido

• NMI (non maskable interrupt) é a interrupção de número

2.

• É não mascarável (não considera o IF).

• No PC é utilizada para tratar erros de paridade.

• O RESET pode ser considerado uma interrupção.

• Quando ocorre, executa-se o código do endereço FFFFFFF0h,

endereço contido na BIOS.

454

Paulo Maciel

Interrupções

• Interrupções no Modo Protegido

Circuito Controlador de Interrupção ISA

8259Mestre 8259

Escravo

IRQ0IRQ1IRQ3IRQ4IRQ5IRQ6IRQ7

IRQ8IRQ9IRQ10IRQ11IRQ12IRQ13IRQ14IRQ15

455

Paulo Maciel

Interrupções

• Interrupções no Modo Protegido

• Interrupções de Software

• INT imm

imm é um valor de 8 bits que é usado para obter o enderço da

ISR correspondente.

456

Paulo Maciel

Interrupções

• Interrupções no Modo Protegido

• Interrupções de Hardware Internas (Exceptions)• Quando uma interrupção de hardware ou de software é finalizada, a próxima

instrução a ser executada é aquela instrução subseqüente a insturção interrompida. Com as Exceptions nem sempre é assim.

• Quando se encerra a execução da maioria das Exeptions, a instrução interrompida é novamente executada. Estas Exceptions são denominadas de faults.

• Faults: quando uma instrução de movimentação tenta ler uma informação qua não se encontra na memória principal (se encontra no disco), ocorre uma fault. Após a execução da ISR correspondente, a instrução de movimentação é novamente executada.

• Poucas Exceptions se comportam com intrrupções ordinárias, ou seja passam o controle para a próxima instrução. Estas são chamadas de traps.

• Traps: um exemplo típico é a Exception overflow.

457

Paulo Maciel

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

• Interrupções no Modo Protegido

• System Calls

• Uma das funções básicas de SO é prover acesso a dispositivos

de hardware.

• No UNIX todo acesso a dispositivos de hardware é feito via

chamada a system calls.

• Normalmente, os usuários têm acesso a estes dispositivos

através de comandos UNIX tais quais ls, cp etc ou via funções C

– printf, scanf etc. Contudo, tanto os comandos UNIX, assim

como as funções C utilizam system calls para se ter acesso ao

hardware.

458

Paulo Maciel

• Interrupções no Modo Protegido

• System Calls

Funções C

ComandosUNIX

SystemCalls

SO Hardware

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

459

Paulo Maciel

• Interrupções no Modo Protegido

• System Calls

os comandos read() e write() são exemplos de system calls,

embora pareçam ser funções ordinárias do C.

• Exemplo:

void main(void) {

char s[] = “Hello World! \n”;

write(1,s,13);

}

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

460

Paulo Maciel

• Como todas as system calls em LINUX, write() usa INT 80h para

transferir o controle para o kernel.

• Toda system call no LINUX tem um número

• A lista destas chamadas e os respectivos números podem ser

encontradas em /usr/include/bits/syscall.h

• Sites: http://linux.about.com/od/commands/l/blcmdl_2a.htm

http://asm.sourceforge.net/syscall.html#p32

• man –S 2 sys_call_name

Ex.: man –S 2 write

man –S 2 ioperm

mans –S 2 iopl

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

syscall unistd

461

Paulo Maciel

• Interrupções no Modo Protegido

• System Calls

void main(void) {

char s[] = “Hello World! \n”;

write(1,s,13);

}

• No LINUX a system calls write() tem número 4.

• Para executar esta system call em assembly o valor 4 deve ser armazenado em EAX antes de chamar INT 80h.

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

462

Paulo Maciel

• Interrupções no Modo Protegido

• System Calls

void main(void) {

char s[] = “Hello World! \n”;

write(1,s,13);

}

• Para usar as system calls em assembly, é necessário conhecer o padrão para passagem de parâmetros. Este padrão está estabelecido em macros localizadas em /usr/include/bits/syscall.h

• De acordo com a norma utilizada desde o LINUX 2.2, os parâmentros são armazenados, da esquerda para a direita, nos registradores EBX,ECX,EDX,ESI e EDI.

• Em caso de mais argumentos, um ponteiro em EBX é passado para uma estrutura com os argumentos.

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

463

Paulo Maciel

• Interrupções no Modo Protegido• System Calls

void main(void) {

char s[] = “Hello World! \n”;

write(1,s,13);

} systemcall\asmtut\quickstart.html

global mainsystemcall\asmtut\syscalls.html

main: …

mov eax,4 Uma lista das macro de chamadas

mov ebx,1 das funções pode ser encontrada no

mov ecx, dword ABC arquivo /usr/include/bits/syscall.h

mov edx,13 (pode ser alterado dependendo

int 80h da versão e distribuição).

ret

ABC db “Hello World!”,0Ah,0

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

Ver exemplos em SysCall:

write.coutro1.asm, outro2.asm,outro3.asm eponteiro.asm

464

Paulo Maciel

[section .data]

hello db 'Hello, world!',10

helloLen equ $ - hello[section .text]global _start

_start:

pop ebx

pop ebx

pop ebx

mov eax,8

mov ecx,00644Q

int 80h

test eax,eax

js skipWrite

call fileWrite

skipWrite: mov ebx,eax

mov eax,1

int 80h

; proc fileWrite - write a string to a file

fileWrite:

mov ebx,eax

mov eax,4

mov ecx,hello

mov edx,helloLen

int 80h

mov eax,6

int 80h

ret

; endp fileWrite

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

465

Paulo Maciel

Acesso ao I/O

int ioperm(unsigned long from,unsigned long num, int turn_on);

unsigned long from : endereço inicial dos endereços das portas

unsigned long num : deslocamento

int turn_on : 1 = habilita e 0 = desabilita

Faixa de Endereço das portas: até 3FFh

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

466

Paulo Maciel

Acesso ao I/OC:

ioperm(0x378,4,1); // ativa permissão

ioperm(0x378,4,0); // desativa permissão

Assembly:

mov eax,101 mov eax,101

mov ebx,0x378 mov ebx,0x378

mov ecx,4 mov ecx,4

mov edx,1 mov edx,0

int 0x80 int 0x80

Ativa permissão Desativa permissão

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

467

Paulo Maciel

Acesso ao I/OC:

ioperm(0x378,4,1); // ativa permissão

outb(0x10,0x378);

ioperm(0x378,4,0); // desativa permissão

Assembly:

mov eax,101 mov eax,101

mov ebx,0x378 mov ebx,0x378

mov ecx,4 mov ecx,4

mov edx,1 mov edx,0

int 0x80 int 0x80

mov al,0x10

out 0x378,al

Ativa permissão e escreve Desativa permissão

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

468

Paulo Maciel

Acesso ao I/O

int iopl(int level);

int level = nível

Endereço das portas: todas as portas (65 535 endereços)

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

469

Paulo Maciel

• Interrupções no Modo Protegido

• System Calls

• Quando uma system call é executada pelo processador é porquê

o programa necessita utilizar o kernel para realizar alguma tarefa

que não está habilitado a faze-lo. Por exemplo, ler um arquivo,

escrever no monitor etc.

• O programa é incapaz de realizar estas tarefas, pois o

processador está bloqueado para realiza-las enquanto estiver

executando código de usuário.

• A diferença entre código de usuário e código do kernel é a

diferença de nível de privilégio.

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

470

Paulo Maciel

• Interrupções no Modo Protegido

• System Calls - Privilégios

• Desde o 286 o sistema de proteção é baseado em 4 níveis de

privilégio:

• 0 – privilégio no nível de sitema – usado pelo kernel do

LINUX

• 1 – não usado no LINUX

• 2 – não usado no LINUX

• 3 – privilégio de usuário- usado por programas de usuário do

LINUX.

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

471

Paulo Maciel

• Interrupções no Modo Protegido

• System Calls - Privilégios

• O nível de privilégio do código em execução é denominado

current privilege level. Esta informação é armazenada em um

registrador de 2 bits denominado registrado CPL.

• Alterar o valor do registrador CPL para 0 “destroi” a proteção do

sistema.

• Atibui-se 0 ao registrador CPL toda vez que uma system call é

executada.

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

472

Paulo Maciel

• Interrupções no Modo Protegido

• System Calls - Privilégios

• O uso da instrução LIDT pode alterar o valor do registrador

IDT, alterando o acesso a tabela de interrupções para uma outra

tabela de interrupções (no novo endereço do registrador IDT).

Este é um exemplo de uma instrução privilegiada. Instruções

privilegiadas só podem ser executadas se CPL=0.

• Caso se tente executar uma instrução privilegiada com CPL>0,

uma Exception é gerada (general protection error).

Introdução à Integração C e Assembly e

chamadas às System Calls em ambiente

Linux

473

Paulo Maciel

Endereçamento de Interrupções

• Interrupções no Modo Protegido – Gate LayoutEndereço

b gate # 0

b+8 gate # 1

b+16 gate # 2

b+24 gate # 3

.

.

.

b+2040 gate # 255

Registrador IDT tem valor igual a b

End. ISR 2Bytes MSB

TipoEnd. ISR 2Bytes LSB

Gate Layout

63 48 44 43 40 39 16 15 0

474

Paulo Maciel

Endereçamento de Interrupções

• Interrupções no Modo Protegido

• Valor de 4 bits que define o tipo (bits 40-43)

• Endereço da ISR é obtido nas duas faixas: bits 48-63 e 0-15, totalizando 32 bits de

endereço.

• Interrupt gates são usadas para interrupções de hardware. Trap gates são usadas

para system calls (INT 80h).

• Os valores do campo tipo podem ser 14 = interrupt gate ou 15 = trap gate.

• Se o valor do campo tipo é 14 então IF = 0. Caso o valor do campo tipo seja 15, o

IF não é resetado.

End. ISR 2Bytes MSB

TipoEnd. ISR 2Bytes LSB

Gate Layout

63 48 44 43 40 39 16 15 0

475

Paulo Maciel

Interrupções

• Interrupções no Modo Protegido

• O próximo passo no processamento de uma interrupção é armazenar

0 no registrado CPL.

• O valor original do registrador CPL é restaurado quando o IRET for

executado.

• Antes de desviar para a ISR, o endereço de retorno é emplilhado. O

novo valor de EIP é carregado dos campos de endereço do

respectivo gate.

476

Paulo Maciel

Linux Boot Time

Programming

• Uma Primeira Visão

• Modos de Operação dos Processadores da família x86

atuais:

• Modo Real

• Modo Protegido

• Modo Virtual

• Modo de Gerenciamento

477

Paulo Maciel

Linux Boot Time

Programming

• Uma Primeira Visão

• Modos de Operação dos Processadores da família x86

atuais:

• Modo Real

• Modo Protegido

• Modo Virtual

• Modo de Gerenciamento

• Na inicialização, o processador está no Modo Real

478

Paulo Maciel

Linux Boot Time

Programming

• Uma Primeira Visão

• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Armazenar código em local apropriado, pois quando houver a

mudança para o modo protegido os endereços físicos serão

gerados de maneira completamente diferente.

• Prepara a Interrupt Descriptor Table (IDT), pois os vetores da

IDT são de 8 bytes e os vetores da tabela de vetores de

interrupção do DOS são de apenas 4 bytes.

• Executar o código de mudança para o modo protegido.

479

Paulo Maciel

Linux Boot Time

Programming

• Uma Primeira Visão

• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• O Processador tem um registrador de base e um de limite para a

Global Descriptor Table. Estes registradores são carregados

com a instrução LGDT mem.

• mem é o endereço base de uma região de 6 bytes que armazena:

2 bytes de limite + 4 bytes de endereço base para Global

Descriptor Table.

480

Paulo Maciel

Linux Boot Time

Programming

• Uma Primeira Visão

• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Suponha que queiramos definir uma Global Descriptor Table

com 10 descritores e que o endereço base da GDT é 10000H.

• Como cada descritor tem 4 palavras (8 bytes), a GDT terá 80

bytes (50H). Portanto, o limite é 80-1= 79 (50H – 1H = 4FH).

481

Paulo Maciel

Linux Boot Time

Programming

• Uma Primeira Visão

• Preparação para mudar para Modo Protegido:

• Preparar a Global Descriptor Table

• Desta forma, usaremos uma área de memória para armazenar

estas informações (limite e endereço base).

MOV AX,2000H

MOV DS,AX

MOV AX,4FH

MOV [DS:0],AX ;armazena o limite

MOV EAX,100000H

MOV [DS:2],EAX ; armazena o endereço base

LGDT [DS:0] ; carrega os rgistradores de base e de limite

482

Paulo Maciel

Linux Boot Time

Programming

• Uma Primeira Visão

• Preparação para mudar para Modo Protegido:

• Executa código de mudança para o modo protegido.

• Os processadores da família x86 têm um registrador de controle

denominado CR0. Quando o bit 0 deste registrador é feito 1, o

processador muda para o Modo Protegido.

MOV EAX,CR0

OR EAX,1

MOV CR0,EAX ; muda para o modo protegido

483

Paulo Maciel

Linux Boot Time

Programming

• Uma Primeira Visão

• Preparação para mudar para Modo Protegido:

• Ao mudar para o Modo Protegido o processador não inicia a

paginação. Tornando o bit 31 do CR0 igual a 1, faz com que se

inicie o processo de paginação.

• 31 - PG = Paginação habilitada

• 30 - CD = Cache Desabilitada

• 29 - NW = No Writethrough

• 15 - WP = Write Protection

• 2 - EM = Emulate Math chip

• 1 - MP = Math chip Present

• 0 - PE = Protect Mode Enable