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
● 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.