terça-feira, 9 de dezembro de 2008

Download do TASM

Borland Turbo Assembler and Tools 5.0.
Disponibilizei para Download:
4shared Mega.co.nz


Talvez na hora da instalação peça uma dll. Já está dentro do rar.
Coloque a pasta no path, para que você possa executar em qualquer pasta.

Até mais.

Código em Assembly utilizado na Faculdade

Estou iniciando em assembly e estou conseguindo fazer algumas coisas.
Para ajudar o pessoal que está começando com assembly, vou fazer este blog colocando códigos asm.
Estarei utilizando o TASM que estarei postando locais para encontrá-lo em breve.

Bom para começar vou colocar o código de uma questão da minha prova de ontem.

1. Faça um programa em assembly usando o TASM que leia o seu nome completo (via teclado) e imprima na tela apenas as vogais.

; ===== MODEL = Declara o Modelo de memoria usado no programa
.MODEL SMALL ; SMALL = código e dados são menores que 64kb, mas estão em segmentos diferentes.
; ===== STACK = Aloca espaco na pilha pilha
.STACK 200h ; Espaço de memória para instruções do programa na pilha

; ===== DATA = indica o começo do bloco de dados
.DATA ; Dados e declaracao de variaveis
; ===== Constantes =====
nome DB 0DH,0AH, " Digite o seu nome => $"
vogais DB 0DH,0AH, " As vogais sao => $"
; ===== Vetor de tamanho 20 =====
nomevet db 20 dup(' ') ; vetor de nome "nomevet" de tamanho 20

; ===== CODE = indica o começo do bloco de código.
.CODE ; Código do programa
START: ; START = inicio da funcao principal
mov ax,@data ; pega endereco do segmento de dados
mov ds,ax ; coloca no registrador de dados
xor si,si ; zera o registrador si - irá fazer a contagem no vetor
call limpatela ; chama função limpa tela

; imprime na tela a variavel
MOV DX,OFFSET nome ; Movendo o OFFSET de nome para DX
MOV AH,09H ; Ativa a interrupção 21H (09H - Escreve um string na saida padrão)
INT 21H ; Habilita a interrupção 21 - Funções do DOS
leia: ; funcao que irá ler todos os caracteres do seu nome - até 30 letras
MOV ah,1h ; Ativa a interrupção 21H (01h - Le um caractere da entrada padrão)
INT 21H ; Habilita a interrupção 21 - Funções do DOS

; comparando com as vogais minusculas
CMP AL,61H ; compara com a
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,65H ; compara com e
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,69H ; compara com i
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,6FH ; compara com o
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,75H ; compara com u
JZ mover ; se for, pula para a funcao mover senao segue comparando
; comparando com as vogais maiusculas
CMP AL,41H ; compara com A
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,45H ; compara com E
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,49H ; compara com I
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,4FH ; compara com O
JZ mover ; se for, pula para a funcao mover senao segue comparando
CMP AL,55H ; compara com U
JZ mover ; se for, pula para a funcao mover senao segue comparando

CMP AL,0DH ; compara se a tecla digitada é enter
JZ imprimir ; caso seja enter, pula para computar o total de caracteres
jnz leia ; se não foi teclado enter ira continuar

mover:
inc si ; incrementa si para nao sobrepor a letra anterior
mov nomevet[si],al ; move o caractere digitado para o "vetor"
jmp leia

imprimir:
call imprime_caracteres ; chama a função para imprimir o vetor na tela
JMP fim2 ; após imprimir salta para o fim

;----------------------------------------------------------------------
;Procedimento: Imprime Vetor
;----------------------------------------------------------------------
imprime_caracteres proc
; Imprime todo o conteudo do vetor
push si
xor si,si ; zera o registrador si
mov ch,20 ; coloca em ch o tamanho do vetor

mov ah,9h ; Ativa a interrupção 21H (09H - Escreve um string na saida padrão)
mov dx,offset vogais ; Movendo o OFFSET de vogais para DX
int 21h ; Habilita a interrupção 21 - Funções do DOS

imprime:
mov ah,2h ; Ativa a interrupção 21H (02H - Escreve um caracter na saida padrão)
mov dl,nomevet[si] ; Move cada caracter para o registrador DL
int 21h ; Habilita a interrupção 21 - Funções do DOS
inc si ; incrementa o registrador si para o proximo caracter do vetor
dec ch ; decrementa o registrador ch
cmp ch,0 ; compara o registrador ch com 0
jnz imprime ; se não for zero volta ao inicio da função imprime

pop si
ret
endp

;----------------------------------------------------------------------
;Funcao: FIM
;----------------------------------------------------------------------
limpatela: ;#
push AX ; Guarda na pilha o valor do Registrador AX ;#
mov ah, 00h ; Ativa a IRQ 10 para a limpeza do vídeo ;#
mov al, 3 ; define o modo de video ;#
int 10h ; Habilita a IRQ 10 (video) ;#
pop AX ; Retorna da pilha o valor do Registrador AX ;#
retn ;#

fim2: ; para não fechar a janela diretamente chamar a função para leitura do teclado para então finalizar o executavel
MOV ah,1h ; Ativa a interrupção 21H (01h - Le um caractere da entrada padrão)
INT 21H ; Habilita a interrupção 21 - Funções do DOS
;finaliza o executavel
MOV AH,04CH
INT 21H

END START ; Fim do Programa