BIOS Basic Input/Output System BIOS e System Calls Prof. Eduardo Tavares eagt@cin.ufpe.br Primeira instrução a ser executada (0xFFFF0-0xFFFFF) Configuração inicial do sistema Inicialização do boot loader Diversas rotinas para comunicação com dispositivos de I/O Migração da BIOS para Extensible Firmware Interface (Ex: algumas versões reconhecem modo longo diretamente) INT 5h - Print screen Imprime conteúdo da tela Interrupção do BIOS que trata o vídeo Os serviços são passados através do registrador AH Especificação do modo 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... Ajusta formato do cursor AH = 1 CH = linha inicial CL = linha final - número de linhas = 7 Posiciona o cursor AH = 2 DH = linha DL = coluna Ler posição do cursor AH = 3 DH = linha DL = coluna CX = tipo do cursor Selecionar AH = 5 AL = Páginas Modos 0-7 0-3 (placas SVGA) * Modos gráficos * - depende dos modos suportados por cada placa. 1
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 Ler o caracter e o atributo da posição do cursor AH = 8 AH = atributo do caracter Escreve caracter e atributo Chama-se com: AH = 9 BL = atributo do caracter CX = número de repetições Escreve caracter AH = 10 CX = número de repetições Escreve um ponto (pixel) AH = 12 (0CH) AL = cor do pixel. Caso o bit 7 de AL seja 1, a cor do pixel será o ouexclusivo com a cor atual. BH = CX = coordenada X (coluna) DX = coordenaday (linha) Ler um ponto (pixel) AH = 13 BH = CX = coordenada X (coluna) DX = coordenada Y (linha) AL = cor do pixel Escreve caracter em modo TTY AH = 14 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. Obtém o modo do vídeo AH = 15 AH = número de colunas da tela AL = modo BH = ativa Escreve caracter em modo TTY AH = 14 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. INT 13h - DISCO Reseta sistema de disco AH = 00h DL = número do driver 00-7Fh floppy disk 80 - FFh hard disk 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 2
INT 13h - DISCO Obtém status AL = código do erro Ler/Escreve/Verifica/Formata 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 CF= 0 sem erro 1 erro AH= código do erro 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 INT 16h - Teclado Aguarda a digitação de um caracter e o lê AH = 0h Se um caractere ASCII foi digitado AH = código de varredura Se um caractere especial foi digitado AH = código ASCII estendido AL = 00h Verifica se um caracter está pronto AH = 1h Se um caractere ASCII foi digitado ZF=0 AH = código de varredura Caso contrário, ZF=1 Obs.: Não remove do buffer INT 16h - Teclado Obtêm status do teclado AH = 2h AL = status 01h - shift direito ativo 02h - shift esquerdo ativo 04h - crtl ativo 08h - alt ativo 10h - num lock ativo 20h - scroll lock ativo 40h - caps lock ativo 80h - inserção ativa INT 17h - Impressora Imprime caractere AH = 00h e DX = número da impressora AH = status Inicializa impressora DX = número da impressora Obtêm status da impressora AH = 02h DX = número da impressora AH = status 01h - time-out 08h - erro de I/O 10h - impressora selecionada 20h - sem papel 40h - reconhecimento 80h - impressora desocupada INT 19h - Warm Start INT 1Ah - Obtém / atualiza tempo / data Ler contador do relógio AH = 00h AL = 0, se não se passaram 24h da última leitura CX = parte de alta-ordem do contador DX = parte de baixa-ordem do contador Atualiza contador do relógio CX = parte de alta-ordem do contador DX = parte de baixa-ordem do contador Ler relógio AH = 02h CH = horas em BCD CL = minutos em BCD DH = segundos em BCD DL = milesegundos em BCD 3
e System Calls INT 1Ah - Obtém / atualiza tempo / data Atualiza relógio AH = 03h CH = horas em BCD CL = minutos em BCD DH = segundos em BCD DL = milesegundos em BCD Ler data AH = 04h CH = século (19, 20,21) em BCD CL = ano em BCD DH = mês em BCD DL = dia em BCD Atualiza data AH = 05h CH = século (19,20,21) em BCD CL = ano em BCD DH = mês em BCD DL = dia em BCD INT 14h - serial (BIOS) INT 21h CONSOLE: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 INT 21h - DOS Leitura teclado eco Se um caractere ASCII foi digitado 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 char db? mov ah,1 mov char,al Mostra caracter em tela AH = 02h DL = código ASCII do caracter. Ex.: mov ah,02 mov dl, * INT 21h - DOS Leitura de entrada auxiliar (serial 1) AH = 03h Se 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. char db? mov ah,3 mov char,al Transmite caracter via saída auxiliar AH = 04h DL = 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,04 mov dl, * Leitura teclado sem eco AH = 08h Se um caractere ASCII foi digitado 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 char db? mov ah,8 mov char,al Mostra cadeia de caracter em tela AH = 09h DS:DX = apontam para o endereço do início da cadeia de caracter. A cadeia dever ser finalizada com $ cr equ 0dh lf equ 0ah mens db Bom Dia, cr, lf, $ mov dx, seg mens lea dx, mens mov ah,9 Leitura teclado com buffer 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 0 db 81 dup(0) mov ah,0ah mov dx,seg buff 4
Define vetor de interrupção AH = 25h AL = número da interrupção DS:DX = segmento e offset do serviço de tratamento da interrupção. mov ah,25h mov al,0 mov dx,seg DIVZ lea dx,divz DIVZ proc far iret DIVZ endp Obtém vetor de interrupção AH = 35h AL = número da interrupção : ES:BX = segmento e offset do serviço de tratamento da interrupção. OldDivZS dw? OldDivZOdw? mov ah,35h mov al,0 mov OldDivZO,bx mov bx,es mov OldDivZS,bx Obtém data AH = 2Ah CX = ano DH = mês (1-12) DL = dia ( 1-31) : AL = Dia da semana (0= dom, 7=sab) Define data AH = 2Bh CX = ano DH = mês (1-12) DL = dia ( 1-31) : AL = 0, se definido com sucesso AL = FFh, caso contrário. Obtém tempo AH = 2Ch CH = hora (0 23) CL = minutos (0-59) DH = segundos ( 0-59) DL = milisegundos (0 99) Define tempo AH = 2Dh CH = hora (0 23) CL = minutos (0-59) DH = segundos ( 0-59) DL = milisegundos (0 99) AL = 0, se definido com sucesso AL = FFh, caso contrário. : Alocação de Memória AH = 48h BX = N. de parágrafos Se CF=0, AX segmento alocado Offset 0 é a primeira localização Caso contrário, AX contém o código do Erro e BX contem o maior bloco de parágrafos disponível Liberação de Memória AH = 49h ES = Segmento a ser liberado Se CF=0, a memória foi liberada Caso contrário, AX terá o código de erro Ajuste de bloco de memória AH = 4Ah ES = Endereço do segmento a ser ajustado BX = novo tamanho * 1 parágrafo = 16 bytes Se CF=0, a memória foi liberada Caso contrário, AX terá o código de erro e BX contém o n. máximo de parágrafos disponíveis para um aumento na alocação Cria arquivo 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. CF = 0 e AX = manipulador, se sucesso. CF = 1 e AX = código de erro, caso contrário. fname db C:\MYDIR\MYFILE.DAT,0 mov ah,3ch xor cx,cx; atributo normal mov dx,seg fname lea dx,fname mov fhandle,ax Abri arquivo 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. CF = 0 e AX = manipulador, se sucesso. CF = 1 e AX = código de erro, caso contrário. fname db C:\MYDIR\MYFILE.DAT,0 mov ah,3dh mov al,2; leitura e escrita mov dx,seg fname lea dx,fname mov fhandle,ax 5
Fechar arquivo AH = 3Eh CF = 0, se sucesso. CF = 1, caso contrário. mov ah,3eh Ler arquivo AH = 3Fh CX = número de bytes a ser lido DS:DX = endereço inicial do buffer CF = 0, se sucesso. AX = bytes lidos CF = 1, caso contrário. AX = código de erro. buff db 1024 dup(?) mov ah,3fh mov dx, seg buff mov cx,1024 cmp ax,cx jl done Escrever em arquivo AH = 40h CX = número de bytes a ser escrito DS:DX = endereço inicial do buffer CF = 0, se sucesso. AX = bytes escritos CF = 1, caso contrário. AX = código de erro. buff db 1024 dup(?) mov ah,40h mov dx, seg buff mov cx,1024 cmp ax,cx jl done Apaga arquivo 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. CF = 0, se sucesso. CF = 1 e AX = código de erro, caso contrário. fname db C:\MYDIR\MYFILE.DAT,0 mov ah,41h mov dx,seg fname lea dx,fname Escrever em arquivo AH = 40h CX = número de bytes a ser escrito DS:DX = endereço inicial do buffer CF = 0, se sucesso. AX = bytes escritos CF = 1, caso contrário. AX = código de erro. buff db 1024 dup(?) mov ah,40h mov dx, seg buff mov cx,1024 cmp ax,cx jl done Posicionar Ponteiro de Arquivo AH = 42h AL = método de posicionamento CX:DX = deslocamento 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 mov ah,42h mov cx,0 Mov dx,1024 6