Entrada e Saída (Input/Output – I/O)
(12)
• Entrada e saída por interrupção
Linguagem de Montagem
Interrupções e Chamadas
de Sistema
Prof. João Paulo A. Almeida
([email protected])
2007/01 - INF02597
– O dispositivo E/S solicita o serviço de transferência apenas
quando este estiver pronto para enviar/receber o(s) dado(s)
– A interrupção causa um desvio no fluxo do programa via
hardware
• A interrupção para o programa que está rodando e desvia o fluxo
para a Rotina de Tratamento da Interrupção
–
Rotina de Tratamento da Interrupção
• Software que realiza o serviço de transferência daquele dispositivo
externo que solicitou a interrupção.
• Verifica a ocorrência de possíveis erros na transferência de dados
– Quando finaliza a rotina de tratamento da interrupção, o
processador retoma a execução do programa interrompido
(inclui slides de
Roberta Lima Gomes e Camilo Calvi)
Entrada e Saída
(Input/Output – I/O)
(13)
Entrada e Saída (Input/Output – I/O)
(14)
• Entrada e saída por interrupção (cont.)
Dispositivo ativa uma linha
do barramento de controle
(interrupt request) da CPU
solicitando um serviço de
interrupção
Fluxograma de
E/S controlada
por interrupção
para uma
transferência
de disco
Assim que pronta, a CPU ativa
uma linha do barramento de
controle (interrupt acknowledge)
indicando ao dispositivo que seu
serviço será atendido.
Entrada e Saída (Input/Output – I/O)
•
(15)
Entrada e saída por interrupção (cont.)
– O sinal de interrupção de cada interface é ligado ao controlador de
interrupção.
• Um número e uma prioridade são atribuídos a cada um destes sinais
– Quando um pedido de interrupção acontece, o controlador de interrupção
envia para o processador, através do barramento de dados, o número do
pedido.
– É comum existirem várias interfaces diferentes que fazem
pedidos de interrupção ao processador
– Cada interface deve ser atendida por uma rotina de serviço de
interrupção específica
• Assim, ao receber um pedido de interrupção, o processador deve
determinar qual a rotina de serviço a ser executada
• Além disso, quando duas ou mais interfaces fazem pedidos de
interrupção simultâneos, é necessário decidir qual o pedido de
interrupção que será atendido
– Estas duas funções são suportadas por um componente chamado
controlador de interrupção (interrupt controller).
Entrada e Saída (Input/Output – I/O)
(16)
• Interrupções na família 80x86
– 8259A permite até 8 interrupções com prioridade (IRQ0 até
IRQ7)
• Se for necessário controlar mais do que 8 dispositivos?
R: Os chips 8259A podem ser ligados em cascata INT: Pedido de
interrupção
– INTA: Reconhecimento de interrupção
– No caso de dois ou mais
pedidos
simultâneos,
o
controlador decide qual é o
pedido com maior prioridade e
envia para o processador o
número correspondente.
1
Interrupções de Software
Entrada e Saída (Input/Output – I/O)
(17)
• Interrupções na família 80x86 (cont.)
– Quando um dispositivo necessita efetuar alguma operação ele
envia um sinal IRx
– 8259A ativa a linha INT indicando uma interrupção ao
processador
– Quando pronto, o processador envia um sinal (INTA) de volta ao
8259A
– Ao receber o sinal, o controlador coloca um número inteiro no
barramento de dados identificando o tipo de dispositivo
– A CPU então usa este número para indexar uma tabela de
256 entradas (vetor de interrupções) para encontrar o
endereço da rotina de tratamento de interrupção a ser
executada
– Se uma interrupção subseqüente ocorrer:
(1)
• Interrupções de software podem ser ativadas
diretamente por nossos programas assembly
• Dois tipos de interrupções
– Interrupções do Sistema Operacional (DOS,
Linux, etc.)
– Interrupções da BIOS
• Para gerar interrupções do DOS use: INT 21h
• Quando usamos esta instrução, o DOS chama
uma rotina de tratamento específica, dependendo
do tipo de interrupção
• O tipo de interrupção será definido em função do
valor que estiver armazenado no registrador AL
• Para gerar interrupções do Linux use: INT 80h
• De maior prioridade: o 8259A interrompe a CPU pela segunda vez
• Prioridade menor, ela é suspensa até a primeira terminar
– Para isto, uma rotina de interrupção deve enviar explicitamente um
comando para o 8259A para informar quando ela terminar
Interrupções de Software (DOS)
•
INT 21h (Entrada: AH <- 01h , Saída: caracter ->AL)
–
–
Lê um caracter da console e coloca o seu código ASCII no
registrador AL
Como gerar este tipo de Interrupção
mov dx,msg
mov ah,9
int 21h
Imprime o caracter ou o executa, se for do tipo beep, line
feed ou assemelhados
Como gerar este tipo de Interrupção
mov ah,4Ch
int 21h
; "terminate program" sub-function
; call dos services
1. Copie o valor 02h dentro do registrador AH
2. Copie o código ASCII do caracter que deseja imprimir dentro
do registrador DL
3. Chame a instrução “INT 21h”
msg db 'Hello, World!',0Dh,0Ah,'$'
INT 21h (Entradas: AH <- 02h , DL<- caracter)
–
–
; hi.asm - simple "hello world" program
; assemble with "nasm -f bin -o hi.com hi.asm"
; inform Nasm this is a .com file
; int 21h is going to want...
; the address of or message in dx
; ah=9 - "print string" sub-function
; call dos services
1. Copie o valor 08h dentro do registrador AH
2. Chame a instrução “INT 21h”
Após esta chamada, assim que for digitado um caracter, seu
código ASCII será colocado dentro de AL
•
Arquivo .com (DOS, 16-bit)
org 100h
; $-terminated message
Tabela de Chamadas de Sistema (DOS)
Exemplos de chamada (DOS)
AH
Description
AH
Description
01
Read character from STDIN
02
Write character to STDOUT
05
Write character to printer
06
Console Input/Output
07
Direct char read (STDIN), no echo
08
Char read from STDIN, no echo
09
Write string to STDOUT
0A
Buffered input
0B
Get STDIN status
0C
Flush buffer for STDIN
0D
Disk reset
0E
Select default drive
19
Get current default drive
25
Set interrupt vector
2A
Get system date
2B
Set system date
2C
Get system time
2D
Set system time
2E
Set verify flag
30
Get DOS version
35
Get Interrupt vector
36
Get free disk space
39
Create subdirectory
3A
Remove subdirectory
3B
Set working directory
3C
Create file
3D
Open file
AH = 01h - READ CHARACTER FROM
STANDARD INPUT, WITH ECHO
Return: AL = character read
Notes:
^C/^Break are checked
^P toggles the DOS-internal echo-to-printer flag
^Z is not interpreted, thus not causing an EOF if
input is redirected character is echoed to
standard output
3E
Close file
3F
Read file
40
Write file
41
Delete file
42
Seek file
43
Get/Set file attributes
47
Get current directory
4C
Exit program
4D
Get return code
54
Get verify flag
56
Rename file
57
Get/Set file date
2
Exemplos de chamada (DOS)
Exemplos de chamada (DOS)
• AH = 02h -WRITE CHARACTER TO
STANDARD OUTPUT
• Entry: DL = character to write
• Return: AL = last character output
• Notes:
• ^C/^Break are checked
• the last character output will be the character in
DL unless DL=09h on entry, in which case
AL=20h as tabs are expanded to blanks
• if standard output is redirected to a file, no error
checks (write- protected, full media, etc.) are
performed
• AH = 09h - WRITE STRING TO STANDARD
OUTPUT
• Entry: DS:DX -> '$'-terminated string
• Return: AL = 24h
• Notes: ^C/^Break are checked
Exemplos de chamada (DOS)
Exemplos de chamada (DOS)
• AH = 2Ah - GET SYSTEM DATE
• Return: CX = year (1980-2099) DH = month DL
= day AL = day of week (00h=Sunday)
• AH = 2Bh - SET SYSTEM DATE
• Entry: CX = year (1980-2099) DH = month DL
= day
• Return:
• AL = 00 successful
• FFh invalid date, system date unchanged
• AH = 39h - "MKDIR" - CREATE
SUBDIRECTORY
• Entry: DS:DX -> ASCIZ pathname
• Return:
• CF clear if successful AX destroyed
• CF set on error AX = error code (03h,05h)
Chequem
http://spike.scu.edu.au/~barry/interrupts.html
#ah01 para uma lista completa
Tabela de Interrupção (BIOS)
Tabela de Interrupção (BIOS) (cont.)
Interrupt
Description
Interrupt
Description
INT 00h
CPU: Division by Zero
INT 01h
CPU: Single Step for debugging
AH=00h Reset Disk Drives
INT 02h
CPU: NMI, used e.g. by POST for memory errors
AH=01h Check Drive Status
INT 03h
CPU: Breakpoint for debugging
AH=02h Read Sectors From Drive
INT 04h
CPU: Numeric Overflow
AH=03h Write Sectors To Drive
INT 05h
Print Screen
AH=04h Verifies Sectors On Drive
INT 08h
IRQ0: Called by system timer 18.2 times per second
AH=05h Format Track On Drive
INT 09h
IRQ1: Called by keyboard
AH=08h Get Drive Parameters
INT 0Bh
IRQ3: Called by 2nd serial port COM2
INT 0Ch
IRQ4: Called by 1st serial port COM1
INT 0Dh
IRQ5: Called by hard disk controller (PC/XT) or 2nd parallel port LPT2 (AT)
INT 0Eh
IRQ6: Called by floppy disk controller
INT 0Fh
IRQ7: Called by 1st parallel port LPT1 (printer)
INT 13h
Low Level Disk Services
AH=09h Init Fixed Drive Parameters
AH=0Ch Seek To Specified Track
AH=0Dh Reset Fixed Disk Controller
AH=15h Get Drive Type
AH=16h Get Floppy Drive Media Change Status
• http://en.wikipedia.org/wiki/BIOS_call
3
Chamadas de Sistema (Linux)
section .data
hello:
db 'Hello world!',10 ; 'Hello world!' plus a linefeed
character
helloLen: equ $-hello
; Length of the 'Hello world!' string
section .text
global _start
_start:
mov eax,4
; The system call for write (sys_write)
mov ebx,1
; File descriptor 1 - standard output
mov ecx,hello
; Put the offset of hello in ecx
mov edx,helloLen ; helloLen is a constant
int 80h
; Call the kernel
mov eax,1
mov ebx,0
int 80h
; The system call for exit (sys_exit)
; Exit with return code of 0 (no error)
Chamadas de Sistema (Linux)
%eax
Name
Source
%ebx
%ecx
%edx
1
sys_exit
kernel/exit.c
int
-
-
2
sys_fork
arch/i386/kernel/process.c
struct pt_regs
-
-
3
sys_read
fs/read_write.c
unsigned int
char *
size_t
4
sys_write
fs/read_write.c
unsigned int
const char *
size_t
5
sys_open
fs/open.c
const char *
int
int
6
sys_close
fs/open.c
unsigned int
-
-
7
sys_waitpid
kernel/exit.c
pid_t
unsigned int *
int
8
sys_creat
fs/open.c
const char *
int
-
9
sys_link
fs/namei.c
const char *
const char *
-
10
sys_unlink
fs/namei.c
const char *
-
-
11
sys_execve
arch/i386/kernel/process.c
struct pt_regs
-
-
Chamadas de Sistema (Linux)
http://asm.sourceforge.net/
4
Download

slides