37
Interface Hardware Software Aula Prática 1 Introdução à programação Assembly no DOS usando TASM Bruno Silva [email protected] lauro Moura [email protected]

Interface Hardware Software - UFPEclac/infra_de_software/aula_teclado_video.… · Interface Hardware Software Aula Prática 1 Introdução à programação Assembly no DOS usando

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Inter face Hardware Sof tware

Aula Prática 1Introdução à programação Assembly no

DOS usando TASMBruno Silva [email protected]

lauro Moura [email protected]

Conteúdo

● Visão geral do processo● TASM / TLINK● HELPPC● Estrutura do Programa● Teclado: Interrupção 16h● Vídeo: Interrupção 10h● Exercícios● Referências

Cr iando programas

● Compilação– Geração do código em linguagem de

montagem.● Montagem

– Geração do código objeto.● Ligação

– Geração do executável a partir do objeto.

Cr iando programas

Foco na montagem e ligação

Cr iando programas

● São necessárias 3 ferramentas:– Editor (óbvio...)– Montador– Linker(ligador)

● Exemplos– Editor -> edit, notepad, context– Montador -> nasm, tasm– Linker -> tlink

TASM (Turbo assembler)

● Montador da Borland(age em conjunto com o linker TLINK também da Borland)

● Traduz programas *.asm para *.obj● Enquanto o linker traduz programas *.obj

para *.exe ou *.com dependendo de forma de montar e ligar

Est rutura do programa no modo rea l (16-b i ts)

.model small

.data

myvar db “gbooo$”

.code

main

mov ax, @data

mov ds, ax

mov dx, offset myvar

mov ah, 09h

int 21h

mov ax, 4c00h

int 21h

end main

M o d e l o s . . . ( n ã o d a V i c t o r i a ' s S e c r e t , p o r e n q u a n t o . . . )

Modelos . . .de memór ia !

● Sintaxe: .MODEL <model>● <model> define o modelo da memória

alocada que pode ser:– SMALL– COMPACT– MEDIUM– LARGE– HUGE

Dados , dados , dados . . .

● Diretiva .DATA● Aréa do programa que guarda as

variáveis que serão utilizadas● ex:

.MODEL SMALL

.Data

array DB 12,45,88,A2,B5

Pi lhas (não-a lca l inas)

● Diretiva: .STACK● Reserva espaço de memória para as

Instruções de pilha● Sintaxe .STACK [size] se nada for

definido o default é 1K● ex:

.MODEL SMALL

.DATA

.STACK

The bra in

● Diretiva .CODE● Inicia o segmento de código● Sintaxe .CODE [name]

– Podem existir vários segmentos de código no seu programa é aconselhável que haja apenas um (KISS).

Modelo de um programa Assembly

.MODEL small

.DATA

.STACK

.CODE

inicio: ;define o entry point

...

...

END inicio

Run i t , baby , run i t ! ! !

● Vá para o diretório corrente para onde está o seu programa fonte e execute

->tasm NomeDoPrograma[.asm]● em seguida

->tlink NomeDoPrograma[.obj]● se não der problema, o código .exe ja

está disponível

Div id i r para conquis tar (KISS! ! ! ! )

● Procedimentos!

<nome> proc

...

<nome> endp

● Argumentos passados pela pilha ou pelos registradores.

Inter rupção 16h

● BIOS● Leitura de valores● Tecla disponível● Teclas de status

Int 16h / Ah = 00h

● Lê uma tecla do teclado.● Trava até uma tecla estar disponível.

● Sem eco...● Retorno:

– ah: Scan code– al: ASCII code

Scan codes? !? !? !

●Códigos individuais das teclas.●PageDown, Setas, Alt possuem scan codes?●Representação interna.

Int 16h / Ah = 01h

● Vê se uma tecla está disponível.● Solução para o deadlock da interrupção

anterior● Tecla disponível? Zero flag!● Retorno (se tiver alguma tecla):

– Idêntico à função anterior.● Não limpa o buffer...

Int 16h / Ah = 02h

● Teclas de Status (Insert, Scroll, Caps, etc...)

“Due to a bug in the BIOS code, these bits only reflect the current status of these keys, they do not necessarily reflect the status of these keys when the next key to be read from the system type ahead buffer was depressed. In order to ensure that these status bits correspond to the state of these keys when a scan code is read from the type ahead buffer, you've got to flush the buffer, wait until a key is pressed, and then immediately check the keyboard status.” [AOA Chapter 13.3]

Exemplo : Ler S t r ing

● String = Seqüência de caracteres ASCII.● Lê uma String terminada por '$'.● arquivo str.asm● procedimento getString● Argumentos / Retorno:

– DS:DX = Buffer de armazenamento– Retorna nada

Vídeo(Modos de Operação)

● Existem 21 modos de vídeo(dependendo da placa de vídeo) que se classificam em:– Modo Texto– Modo Gráfico

Vídeo(Coordenadas)

● O monitor pode ser considerado como um plano cartesiano com coodenadas da seguinte forma:– (0, 0) canto esquerdo superior do vídeo– (0, y_máx)esquerdo inferior do vídeo– (x_máx, 0)direito superior do vídeo– (x_máx, y_máx)direito superior do vídeo

Int 10h / Ah = 0Eh

● Escreve um caractere na tela atualizando o cursor

● AL recebe o código ascii do caractere a ser escrito

● BH recebe o numero da página em modo de texto

● BL recebe a cor do caractere em modo vídeo

● Não retorna nada

Int 10h / Ah = 0Ah

● Escreve um caractere na tela sem atualizar o cursor

● AL recebe o código ascii do caractere a ser escrito

● BH recebe o numero da página em modo de texto

● BL recebe a cor do caractere em modo vídeo

● Não retorna nada

Int 10h / Ah = 03h

● Lê a posição do Cursor e Tamanho● BH recebe o numero da página de vídeo● Retorna

– DH linha– DL coluna– CH e CL o tamanho do cursor

Int 10h / Ah = 02h

● Seta a posição do Cursor● BH recebe o numero da página de vídeo● DH recebe a linha● DL recebe a coluna

Int 10h / Ah = 00h

● Muda o modo de vídeo● AL recebe o tipo do modo escolhido● Veja o helppc para ver os modos de vídeo

disponíveis

Int 10h / Ah = 0Ch

● Desenha um pixel numa determinada coodenada

● AL recebe o valor da cor● BH recebe o numero da página● CX número da coluna● DX número da linha

Exemplo : Impr imi r S t r ing

● Imprime uma String terminada por '$'.● arquivo str.asm● procedimento printString[A|E]● duas versões: com e sem auto

incremento do cursor● Argumentos / Retorno:

– DS:DX = aponta para String– Retorna nada

Exerc í c io

● Escreva uma função que lê um numero e armazena numa determinada posição de memória

● Note que fazendo isso voçê estará convertendo um número de String para inteiro

Exerc í c io

● Escreva função que pega um número na memória e imprime a string correspondente.

● Façam e mandem até a próxima quarta meio dia. E guardem pois estas funções são muito úteis no projeto.