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