book chapter 1 - cin.ufpe.brdpam/arquivos/inthwsw10.pdf · para calcular automaticamente tabelas...
TRANSCRIPT
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.
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
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.
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
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²
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.
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)
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.
Lê
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
61
Paulo Maciel
Arquitetura de Computadores
Diagrama de Estado do Ciclo de Instrução com Interrupção
Busca
Inst.
Cal. End.
Prox. Inst.
Lê
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
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]
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
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
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
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
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
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
162
Paulo Maciel
Aritmética
Sintaxe:
IMUL OP_FONTE - multiplicação sinalizada
EX.: IMUL BL
IMUL DX
IMUL 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
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
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
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.
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
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)
273
Paulo Maciel
Entrada/Saída
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.
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)
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
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
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
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