domingo, 12 de dezembro de 2010

S.O key

 A lista de todas as interrupções que atualmente são suportados pelo montador 8086 emuladoressas interrupções devem ser compatíveis a IBM PC e todas as gerações de 86, original Intel 8086 e microprocessadores AMD compatível, porém o Windows XP pode substituir algumas das interrupções original.Referência rápida:
10h/00h INT10h/01h INT10h/02h INT10h/03h INT10h/05h INT10h/06h INT10h/07h INT10h/08h INT10h/09h INT10h/0Ah INT10h/0Ch INT10h/0Dh INT10h/0Eh INT10h/13h INT10h/1003h INTINT 11hINT 12h13h/00h INT13h/02h INT13h/03h INT15h/86h INT16h/00h INT16h/01h INTINT 19hINT 1Ah/00hINT 20hINT 21hINT 33h


a lista curta de interrupções suportados com descrições:

  
INT 10h / AH = 0 - modo de vídeo definido.

    
entrada:
    
AL = desejado modo de vídeo.

    
estes modos de vídeo são suportados:

    
00h - em modo texto. 40x25. 16 cores. 8 páginas.

    
03h - em modo texto. 80x25. 16 cores. 8 páginas.

    
13h - modo gráfico. 40x25. 256 cores. 320x200 pixels. Página 1.
exemplo:

mov al, 13hmov ah, 0Int 10h

  
10h INT / AH = 01h - definir a forma do cursor em modo texto.

    
entrada:
    
CH = linha de partida cursor (bits 0-4) e opções (bits 5-7).
    
CL = linha de fundo do cursor (bits 0-4).

    
quando o bit 5 do CH é definido como 0, o cursor fica visível. quando o bit 5 é 1, o cursor não está visível.


    
; Esconder piscando cursor de texto:
         
mov ch, 32
         
mov ah, 1
         
Int 10h

    
; Mostram padrão piscando cursor de texto:
         
mov ch, 6
         
mov cl, 7
         
mov ah, 1
         
Int 10h

    
; Show cursor de texto em forma de caixa piscando:
         
mov ch, 0
         
mov cl, 7
         
mov ah, 1
         
Int 10h

    
; Nota: Algumas BIOS CL necessária para ser> = 7, formas de outra forma errada cursor são exibidos.
Voltar ao Topo INT 10h / AH = 2 - posição do cursor.

    
entrada:
    
DH = linha.
    
DL = coluna.
    
BH = número da página (0 .. 7).
exemplo:

mov dh, 10mov dl, 20mov bh, 0mov ah, 2Int 10h

Voltar ao Topo INT 10h / AH = 03h - obter a posição do cursor e tamanho.

    
entrada:
    
BH = número da página.
    
retorno:
    
DH = linha.
    
DL = coluna.
    
CH linha de partida = cursor.
    
CL = linha de fundo do cursor.
Voltar ao Topo INT 10h / AH = 05h - página de seleção de vídeo ativo.

    
entrada:
    
AL = novo número de página (0 .. 7).
    
Página ativado é exibido.
Voltar ao Topo INT 10h / AH = 06h - vá até a janela.10h INT / AH = 07h - role a janela.

    
entrada:
    
AL = número de linhas por que se deslocar (00h = janela inteira transparente).
    
BH = atributo usado para escrever as linhas em branco na parte inferior da janela.
    
CH, CL = fileira, coluna do canto superior esquerdo da janela.
    
DH, DL = fileira, coluna do canto inferior direito da janela.
Voltar ao Topo INT 10h / AH = 08h - leia caráter e atributo na posição do cursor.

    
entrada:
    
BH = número da página.
    
retorno:
    
AH = atributo.
    
AL = caractere.
Voltar ao Topo INT 10h / AH = 09h - personagem escrever e atributo na posição do cursor.

    
entrada:
    
AL = personagem para mostrar.
    
BH = número da página.
    
BL = atributo.
    
CX = número de vezes para escrever caracteres.
Voltar ao Topo INT 10h / AH = 0Ah - escreve caráter apenas na posição do cursor.

    
entrada:
    
AL = personagem para mostrar.
    
BH = número da página.
    
CX = número de vezes para escrever caracteres.
Voltar ao Topo INT 10h / AH = 0Ch - mudam de cor para um único pixel.

    
entrada:
    
AL cor do pixel =
    
CX = coluna.
    
DX = linha.
exemplo:

mov al, 13hmov ah, 0Int 10h; definir o modo de vídeo de gráficos.mov al, 1100Bmov cx, 10mov dx, 20mov ah, 0ChInt 10h; conjunto de pixels.
aviso: esta interrupção está disponível na última atualização (se esta interrupção não está funcionando, clique aqui para baixar a versão mais recente do emulador)
Voltar ao Topo INT 10h / AH = 0Dh - obter a cor de um único pixel.

    
entrada:
    
CX = coluna.
    
DX = linha.
    
saída:
    
AL cor do pixel =
AVISO: Esta interrupção ESTÁ DISPONÍVEL NO última atualização (se esta interrupção não está funcionando, clique aqui para baixar a versão mais recente do emulador)
Voltar ao Topo INT 10h / AH = 0Eh - Saída de teletipo.

    
entrada:
    
AL = caractere para escrever.
Isso exibe as funções de um personagem na tela, fazendo avançar o cursor e rolagem da tela, conforme necessário. a impressão é sempre feito para a página corrente ativa.
exemplo:

mov al, 'a'mov ah, 0EhInt 10h
; Nota: em sistemas específicos essa função não pode ser apoiada em modo gráfico.
Voltar ao Topo INT 10h / AH = 13h - escreve a string.

    
entrada:
    
AL = modo de escrita:
        
bit 0: cursor atualização depois de escrever;
        
bit 1: string contém atributos.
    
BH = número da página.
    
BL = atributo se string contém apenas caracteres (bit 1 da AL é zero).
    
CX = número de caracteres em seqüência (atributos não são contados).
    
DL, DH = coluna, linha em que começar a escrever.
    
ES: BP aponta para string a ser impresso.
exemplo:

mov al, 1mov bh, 0mov bl, 0011_1011bmov cx, msg1end - offset msg1; calcular o tamanho da mensagem.mov dl, 10mov dh, 7cs pushes popmov bp, offset msg1mov ah, 13hInt 10hjmp msg1endmsg1 db "Olá mundo!"msg1end:
Voltar ao Topo INT 10h / AX = 1003h - intensidade de alternância / piscando.

    
entrada:
    
BL = modo de escrita:
        
0: permitir cores intensas.
        
1: permitir a piscar (não suportados pelo emulador e janelas do prompt de comando).
    
BH = 0 (para evitar problemas em algumas placas).
exemplo:

mov ax, 1003hmov bx, 0Int 10h

 
tabela de cores pouco:atributos de caracteres é 8 bit valor, baixa de 4 bits color set frente, alta de 4 bits definir a cor de fundo.Atenção: o emulador e janelas linha de comandos não suportam fundo piscando, porém para tornar as cores têm a mesma aparência no DOS e no modo de tela cheia, é necessário desligar o fundo piscar.

HEX COR BIN
0 0000 preto1 0001 azul2 0010 verde3 0011 ciano4 0100 vermelho5 0101 magenta6 0110 marrom7 0111 cinza8 1000 cinza escuro9 1001 azulUma luz verde 1010B ciano claro 1011C 1100 luz vermelhaD magenta claro 1101E 1110 amarelaF 1111 branca
nota:

; Usar esse código para compatibilidade com o DOS / modo de tela cheia cmd prompt:mov ax, 1003hmov bx, 0; desativar a piscar.Int 10h

Voltar ao TopoINT 11h - get BIOS lista de equipamentos.

    
retorno:
    
AX = BIOS palavra lista de equipamentos, na verdade, essa chamada retorna o conteúdo da palavra em 0040h: 0010h.

    
Atualmente, esta função pode ser usada para determinar o número de peça instalada de unidades de disquete.


    
Campos de bits de BIOS detectou o hardware instalado:
    
Bit (s) Descrição
     
15-14 número de dispositivos em paralelo.
     
13 não é suportado.
     
12 porta de jogos instalados.
     
09/11 número de dispositivos seriais.
     
8 reservados.
     
7-6 número de unidades de disquete (menos 1):
              
00 única disquete;
              
01 dois disquetes;
              
10 três disquetes;
              
11 quatro disquetes.
     
modo de vídeo 04/05 inicial:
              
00 EGA, VGA, PGA, ou outros, com vídeo on-board do BIOS;
              
40x25 01 cores CGA;
              
10 cores CGA 80x25 (emulador padrão);
              
11 texto monocromático 80x25.
     
3 não são suportados.
     
2 não é suportado.
     
Um co-processador matemático instalado.
     
0 definida quando iniciado a partir do disquete (sempre definido pelo emulador).
Voltar ao TopoINT 12h - Pega o tamanho da memória.

    
retorno:
    
AX = kilobytes de memória contígua a partir de 00000h endereço absoluto, essa chamada retorna o conteúdo da palavra em 0040h: 0013h.

Disquetes são emulados usando FLOPPY_0 (.. 3) arquivos.
Voltar ao Topo13h INT / AH = 00h - sistema de disco de reset, (atualmente chamada de isso não fazer nada).
Voltar ao Topo13h INT / AH = 02h - leia setores do disco na memória.13h INT / AH = 03h - escrever setores de disco.

    
entrada:

        
AL = número de setores para ler / escrever (deve ser diferente de zero)
        
CH = número de cilindros (0 .. 79).
        
CL número do setor = (1 .. 18).
        
DH = Número da cabeça (0 .. 1).
        
DL = número da unidade (0 .. 3, para o emulador depende da quantidade de arquivos FLOPPY_).
        
ES: BX aponta para o buffer de dados.

    
retorno:

        
CF definido em erro.
        
CF claro caso de sucesso.
        
AH = estado (0 - se bem-sucedido).
        
AL = número de setores transferido.

    
Nota: cada setor tem 512 bytes.
Voltar ao TopoINT 15h / AH = 86h - BIOS esperar função.

    
entrada:

        
CX: DX = Intervalo em microsegundos

    
retorno:

        
CF claro se for bem sucedida (intervalo de espera transcorrido),
        
CF definido em caso de erro ou quando a função de espera já está em andamento.


    
nota:

        
a resolução do período de espera é 977 microssegundos em muitos sistemas (1 milhão de microsegundos - 1 segundo).
        
Windows XP não oferece suporte a essa interrupção (sempre define CF = 1).

Voltar ao Topo16h INT / AH = 00h - get teclas do teclado (sem eco).

    
retorno:

        
AH = código de verificação do BIOS.
        
AL = ASCII.
        
(Se uma tecla estiver presente, ele é removido do buffer de teclado).
Voltar ao Topo16h INT / AH = 01h - verificar a tecla no buffer de teclado.

    
retorno:

        
ZF = 1 se a tecla não está disponível.
        
ZF = 0 se keystroke disponíveis.
        
AH = código de verificação do BIOS.
        
AL = ASCII.
        
(Se uma tecla estiver presente, ele não é removido do buffer de teclado).
Voltar ao Topo19h INT - reinicialização do sistema.

    
Normalmente, o BIOS tentará ler o setor 1, cabeça 0, trilha 0 do disco A: para 0000h: 7C00h. O emulador apenas suspende a execução, para iniciar a unidade de disquete selecione o menu: "drive virtual" - "inicialização através de disquetes '>
Voltar ao Topo1Ah INT / AH = 00h - chegar a hora do sistema.

    
retorno:

        
CX: DX = número de pulsos do relógio desde a meia noite.
        
AL = contador da meia-noite, avançado cada vez que passa da meia-noite.
Notas:Há aproximadamente 18,20648 relógio carrapatos por segundo,e 1800B0h por 24 horas.AL não é definida pelo emulador. Voltar ao Topo
INT 20h - saída para o sistema operacional.


a lista curta de interrupções emulado MS-DOS - INT 21h
AVISO: A maioria dos interrompe essas estão disponíveis na última atualização (Se essas interrupções não estão funcionando, clique aqui para baixar a versão mais recente do emulador)


INT 21h / AH = 1 - ler o caráter a partir da entrada padrão, com eco, o resultado é armazenado em AL.se não houver nenhum caractere no buffer de teclado, a função espera até que uma tecla é pressionada.
exemplo:

mov ah, 1Int 21h


INT 21h / AH = 2 - escrever caracteres na saída padrão.entrada: DL = personagem para escrever, após a execução AL = DL.
exemplo:

mov ah, 2mov dl, 'a'Int 21h


INT 21h / AH = 5 - caractere de saída para a impressora.entrada: DL = personagem para imprimir, após a execução AL = DL.
exemplo:

mov ah, 5mov dl, 'a'Int 21h


INT 21h / AH = 6 - direto do console de entrada ou de saída.
parâmetros de saída: DL = 0 .. 254 (código ASCII)parâmetros de entrada: DL = 255
retorna para a saída: AL = DLpara os retornos de entrada: ZF definir se nenhum caractere disponíveis e AL = 00h, ZF claro se caracteres disponíveis.AL = caractere lido; buffer é esvaziado.
exemplo:

mov ah, 6mov dl, 'a'Int 21h; caracter de saída.
mov ah, 6mov dl, 255Int 21h; obter personagem do buffer de teclado (se houver) ou conjunto ZF = 1.


INT 21h / AH = 7 - Entrada de caractere sem eco para AL.se não houver nenhum caractere no buffer de teclado, a função espera até que uma tecla é pressionada.
exemplo:

mov ah, 7Int 21h



INT 21h / AH = 9 - saída de uma seqüência de caracteres em DS: DX. String deve ser denunciado por '$'.
exemplo:

org 100hmov dx, offset msgmov ah, 9Int 21hretdb msg "Olá mundo $"


INT 21h / AH = 0Ah - A entrada de uma seqüência para DS: DX, byte punho é o tamanho do buffer, segundo byte é o número de caracteres realmente ler. Esta função não adicionar '$' no final da cadeia. para imprimir INT 21h usando / AH = 9 você deve conjunto de caracteres do dólar no final do mesmo e iniciar a impressão do endereço DS: DX + 2.
exemplo:

org 100hmov dx, offset buffermov ah, 0AHInt 21himprimir jmpdb buffer de 10,?, 10 dup ('')impressão:xor bx, bxmov bl, buffer [1]mov [bx 2] buffer, '$'mov dx, offset tampão + 2mov ah, 9Int 21hret
a função não permite a inserção de caracteres mais do que o tamanho do buffer especificado.veja também int21.asm em c: \ emu8086 \ exemplos
INT 21h / AH = 0Bh - obter o status de entrada;retorno: AL = 00H se não de caracteres disponíveis, AL = 0FFh se o personagem está disponível.
INT 21h / AH = 0Ch - buffer de teclado flush e ler a entrada padrão.entrada: AL = número de função de entrada para executar após tampão de lavagem (podem ser 01h, 06h, 07h, 08h, ou 0Ah - para outros valores do buffer é liberado, mas nenhuma entrada é tentada); outros registros, conforme apropriado para a função de entrada selecionado .
INT 21h / AH = 25h - conjunto de vetores de interrupção;entrada: AL = número de interrupção. DS: DX -> novo manipulador de interrupção.
INT 21h / AH = 2Ah - get data do sistema;retorno: CX = anos (1980-2099). DH = mês. DL = dia. AL = dia da semana (00h de domingo =)
INT 21h / AH = 2Ch - obtém o tempo do sistema;retorno: CH = hora. CL = minutos. DH = segundos. DL = 1 / 100 segundos.
INT 21h / AH = 35h - get vetor de interrupção;entrada: AL = número de interrupções;retorno: ES: BX - manipulador atual> interrupção.
Sistema de arquivos DOS é emulado em c: \ emu8086 \ Vdrive \ x (x é uma letra de unidade)
Se nenhuma letra de unidade é especificada e diretório atual não é definido, então c: \ emu8086 \ MyBuild caminho \ é usado por padrão. FLOPPY_x arquivos são emulados independentemente do sistema de arquivos DOS.
Nota: O sistema de arquivos DOS limita a nomes de arquivos e diretórios a 8 caracteres, extensão é limitado a 3 personagens;exemplo de um nome de arquivo válidos: myfile.txt (nome do arquivo = 6 caracteres, extensão - 3 caracteres). extensão é escrito depois do ponto, não há outros pontos são permitidos.
INT 21h / AH = 39h - faça diretório.Entrada: DS: DX -> caminho ASCIZ; zero string terminada. exemplo:

org 100hmov dx, offset filepathmov ah, 39hInt 21h
ret
filepath DB "C: \ mydir", 0; caminho a ser criado.final
O código acima cria c: \ emu8086 \ Vdrive diretório mydir C \ \ se for executado pelo emulador.
Retorno: CF claro se AX sucesso destruído. CF definido no código de erro erro = ax.Nota: todos os diretórios no caminho dado deve existir, exceto a última.
INT 21h / AH = 3AH - remove diretório.
Entrada: DS: DX -> ASCIZ caminho do diretório a ser removido.
Retorno:
CF é claro se for bem sucedida, AX destruídos CF é definido no erro AX = código de erro.
Notas: O diretório deve estar vazio (não deve haver arquivos dentro dela).
INT 21h / AH = 0Eh - unidade padrão de seleção.
Entrada: DL = disco novo padrão (0 = A:, 1 = B:, etc)
Retorno: AL = número de letras de unidade potencialmente válidas
Notas: o valor de retorno é o presente maior unidade.
INT 21h / AH = 3Bh - Diretório conjunto atual.
Entrada: DS: DX -> ASCIZ caminho para se tornar o diretório atual (máximo de 64 bytes).
Retorno:
Carry Flag é claro se for bem sucedida, AX destruído.Carry Flag é definido no código de erro erro = ax.Notas: O mesmo nome do novo diretório inclui uma letra de unidade, a unidade padrão não seja alterada,somente o diretório atual na unidade.
INT 21h / AH = 19h - obter unidade padrão atual.
Retorno: AL = drive (0 = A:, 1 = B:, etc)
INT 21h / AH = 47h - obter o diretório atual.
Entrada:
DL = número da unidade (default = 00h, 01h = A:, etc)DS: SI -> buffer de 64 bytes para o caminho ASCIZ.
Retorno:
Carry é claro se for bem sucedidaCarry é acionado em caso de erro, AX = código de erro (0Fh)
Notas:
o caminho retornado não inclui uma unidade ea barra invertida inicial.
INT 21h / AH = 3Ch - criar ou truncar arquivo.
Entrada:
CX = arquivo atributos:


 
mov cx, 0; normal - sem atributos.
 
mov cx, 1; somente leitura.
 
mov cx, 2; escondido.
 
mov cx, 4; sistema
 
mov cx, 7; sistema oculto e somente leitura!
 
mov cx, 16; arquivo
DS: DX -> ASCIZ nome.
Retorno:
CF claro se for bem sucedida, AX = arquivo identificador.CF definido no código de erro erro = ax.
Nota: Se o arquivo especificado existe ele é excluído sem aviso.
exemplo:

org 100hmov ah, 3chmov cx, 0mov dx, offset filenamemov ah, 3chInt 21hjc errarmov punho, machadok jmpNome db "myfile.txt", 0lidar com dw?err:; ....k:ret


INT 21h / AH = 3Dh - Abrir arquivo existente.
Entrada:
AL = modos de acesso e partilha:

mov al, 0; lermov al, 1; escrevermov al, 2; de leitura / gravação

DS: DX -> ASCIZ nome.
Retorno:
CF claro se for bem sucedida, AX = arquivo identificador.CF definido no código de erro erro = ax.
Nota 1: O ponteiro do arquivo é definido para o início do arquivo.Nota 2: O arquivo deve existir.
exemplo:

org 100hmov al, 2mov dx, offset filenamemov ah, 3DHInt 21hjc errarmov punho, machadok jmpNome db "myfile.txt", 0lidar com dw?err:; ....k:ret


INT 21h / AH = 3Eh - fechar o arquivo.
Entrada: BX = identificador de arquivo
Retorno:
CF claro se for bem sucedida, AX destruído.CF definido em caso de erro, AX = código de erro (06h).
INT 21h / AH = 3Fh - leitura do arquivo.
Entrada:
BX = arquivo identificador.CX = número de bytes para ler.DS: DX - reserva> de dados.
Retorno:
CF é claro se for bem sucedida - AX = número de bytes realmente lidos; 0 se a EOF (fim de arquivo) antes de ligar.CF é definido no código de erro erro = ax.
Nota: os dados são lidos no início posição atual do arquivo e da posição do arquivo é atualizado depois de uma bem sucedida ler o AX retornado pode ser menor do que o pedido CX se uma leitura parcial ocorreu.

  
INT 21h / AH = 40h - escrever no arquivo.
Entrada:
BX = arquivo identificador.CX = número de bytes para escrever.DS: DX -> Dados para escrever.
Retorno:
CF claro se for bem sucedida; AX = número de bytes realmente escritos.CF definido em erro; AX = código de erro.
Nota: Se CX é zero, não há dados escritos, e o arquivo é truncado ou estendido para os dados da posição atual é escrito no início a posição do arquivo corrente, ea posição do arquivo é atualizado depois de uma gravação bem-sucedida a causa usual para AX sobre o retorno é um disco cheio.
INT 21h / AH = 41h - ficheiro de excluir (desvincular).
Entrada:
DS: DX -> ASCIZ nome (sem curingas, mas veja notas).
retorno:
CF claro se for bem sucedida, AX destruído. AL é a unidade de arquivo que foi excluído (sem documentos).CF definido no código de erro erro = ax.
Nota: O sistema não apaga os dados do arquivo, ele simplesmente se torna inacessível, pois a cadeia FAT para o arquivo é limpo apagar um arquivo que está aberto no momento podem levar à corrupção de arquivos.
INT 21h / AH = 42h - SEEK - posição do arquivo conjunto atual.
Entrada:
AL = origem do movimento: 0 - início do arquivo. 1 - posição atual do arquivo. 2 - fim do arquivo.BX = arquivo identificador.CX: DX = offset de origem da posição do novo arquivo.
Retorno:
CF claro se for bem sucedida, DX: AX = Posição novo arquivo em bytes desde início do arquivo.CF definido em caso de erro, AX = código de erro.
Notas:
e 2 de origem 1, o ponteiro pode ser posicionado antes do início do arquivo, nenhum erro é retornado, nesse caso, mas as tentativas subseqüentes para ler ou escrever o arquivo irá gerar erros. Se a nova posição está para além do fim do atual arquivo, o arquivo será estendido até a próxima gravação (ver AH = 40h).
exemplo:

org 100hmov ah, 3chmov cx, 0mov dx, offset filenamemov ah, 3chInt 21h; criar o arquivo ...mov punho, machado
mov bx, punhomov dx, offset dadosmov cx, data_sizemov ah, 40hInt 21h; escrever no arquivo ...
mov al, 0mov bx, punhomov cx, 0mov dx, 7mov ah, 42hInt 21h; procurar ...
mov bx, punhomov dx, offset buffermov cx, 4mov ah, 3FhInt 21h; leitura do arquivo ...
mov bx, punhomov ah, 3EHInt 21h; fechar o arquivo ...ret
Nome db "myfile.txt", 0lidar com dw?dados db "arquivos Olá!"data_size dados = $ offsetdb buffer 4 dup ('')



INT 21h / AH = 56h - arquivo renomear / mover arquivos.
Entrada:
DS: DX -> ASCIZ nome do arquivo existente.ES: DI -> ASCIZ novo nome.
Retorno:
CF claro caso de sucesso.CF definido em caso de erro, AX = código de erro.
Nota: permite mover entre diretórios na unidade lógica só mesmo; arquivos abertos não devem ser renomeados!
INT 21h / AH = 4Ch - retornar o controle para o sistema operacional (parada do programa).
Voltar ao Topo

interrompe o driver do mouse - INT 33h


INT 33h / AX = 0000 - ininialization mouse. qualquer ponteiro do mouse anterior é oculto.
retorna:

    
se bem-sucedido: AX = 0FFFFh e BX = número de botões do mouse.
    
Se falhou: AX = 0
exemplo:

mov ax, 033h int
Veja também: mouse.asm nos exemplos.
Voltar ao Topo AX INT 33h = / 0001 - ponteiro do mouse show.
retorna:

    
nada.
exemplo:

mov ax, 133h int



Voltar ao Topo INT 33h / AX = 0002 - ocultar ponteiro do mouse visível.
retorna:

    
nada.
exemplo:

mov ax, 233h int



Voltar ao Topo INT 33h / AX = 0003 - conseguir a posição do mouse eo status dos seus botões.
retorna:

    
Se o botão esquerdo é baixo: BX = 1
    
Se o botão direito é baixo: BX = 2
    
se ambos os botões estão abaixo: BX = 3
    
CX = x
    
DX y =
exemplo:

MOV AX, 333h int
; Nota: No modo gráfico 320x200 o valor de CX é dobrada. mouse2.asm ver nos exemplos.

0 comentários:

Enviar um comentário