Beruflich Dokumente
Kultur Dokumente
ASSEMBLY
Uma introdução à programação em Assembly
Registradores
A linguagem Assembly, como vimos, é constituída de pequenas
instruções chamadas de mnemônicos. Estas instruções servem para mover
dados, somar dados, subtrair, dividir, multiplicar, comparar, saltar
para um ponto do programa, etc.
Para armazenar valores, são necessários os registradores, que
são endereços de memória encarregados de guardar ou receber dados. Os
principais registradores de Assembly 16-bits são: AX, BX, CX, DX, DS,
ES, SS, CS,SI, DI, BP e SP. Cada um deles (exceto DS, ES, SS, CS, SI,
DI, BP e SP) podem guardar 2 bytes, sendo o primeiro byte, ou byte
mais alto: AH, BH, CH e DH. E o último byte, ou byte mais baixo: AL,
BL, CL, e DL.
AX – Registrador Acumulador
BX – Registrador Base
CX – Registrador Contador
DX – Registrador de Dados
DS – Registrador de Segmento de Dados
ES – Registrador de Segmento Extra
SS – Registrador de Segmento de Pilha/Stack
CS – Registrador de Segmento de Código
SI – Registrador de Índice da Fonte/Source dos Dados
DI – Registrador de Índice do Destino dos Dados
BP – Registrador de Ponteiro de Base
SP – Registrador de Ponteiro da Pilha/Stack
Instrução MOV
A instrução MOV serve para MOVER dados de um lugar para o
outro. Sua sintaxe é a seguinte:
MOV destino,fonte
MOV memória,acumulador
MOV acumulador,memória
MOV registrador de segmento,memória/registrador
MOV memória/registrador,registrador de segmento
MOV registrador,registrador
MOV registrador,memória
MOV memória,registrador
MOV registrador,dado
MOV memória,dado
Exemplo:
Instrução LEA
A Instrução LEA (Load Effective Address) carrega o endereço do
operador fonte para o destino. Sua sintaxe é a seguinte:
LEA destino,fonte
Interrupções
Interrupções são pausas geradas pelo programa para que a BIOS se
dedique ao programa executando suas funções de entrada/saída. Em
Assembly, o comando para se usar uma interrupção é INT. Sua sintaxe é:
INT numero_da_interrupção
AH Descrição Retorno/Parâmetro
00h Termina o Programa (DOS 2.0 ou anterior) -
01h Leitura do teclado com eco na tela AL = caracter
02h Escreve caracter na tela DL = caracter
07h Leitura do teclado sem eco
AL = caracter
Ignora CTRL-Break
08h Leitura do teclado sem eco
AL = caracter
Reconhece e executa CTRL-Break
09h Escreve string na tela DS = ponteiro para
string com fim $
0Ah* Leitura do teclado em buffer DS = ponteiro para
buffer de leitura
4Ch Termina o Programa (mais recomendada) -
• O buffer para leitura do teclado deve ter o formato:
|numero maximo de caracteres | numero de caracteres lidos | string
Exemplo:
mov ah,02h
mov dl,41h ;caracter = A
int 21h ;escreve caracter na tela
mov ah,4ch
int 21h ;finaliza o programa
Instruções
ADD, SUB, MUL e DIV
A instrução ADD é usada para somar dois registradores, ou um
registrador e um dado. Sua sintaxe é a seguinte:
ADD registrador,registrador
ADD registrador,dado
MOV AX,3
MOV BX,2
MUL BX ;multiplica o valor de AX pelo valor de BX
MOV AX,6
MOV BX,3
DIV BX ;divide o valor de AX pelo valor de BX
Instrução JMP
A instrução JMP é usada para fazer um salto incondicional de um
ponto do programa para outro, isto é, alterar a execução do programa.
Sua sintaxe é a seguinte:
O Comando CMP
O comando CMP compara dois registradores, ou um registrador e um
valor e permite fazer um salto condicional usando as seguintes
instruções:
JG – Jump if Greater
JGE – Jump if Greater or Equal
JNG – Jump if Not Greater
JNGE – Jump if Not Greater or Equal
JE – Jump if Equal
JZ – Jump if Zero
JNE – Jump if Not Equal
JNZ – Jump if Not Zero
JL – Jump if Lower
JLE – Jump if Lower or Equal
JNL – Jump if Not Lower
JNLE – Jump if Not Lower or Equal
Exemplo:
MOV AX,0005h
MOV BX,0000h
CMP AX,BX ;compara AX com BX
JGE 0100 ;salta para o endereço 0100 se maior ou igual
---------------------------------------------------------------
MOV AH,01h
INT 21h
CMP AL,2 ;compara AL com 2
JE 0104 ;salta para o endereço 0104 se igual
A Pilha, o PUSH e o POP
A Pilha de Dados é uma estrutura muito importante em assembly,
pois ela nos permite armazenar inúmeros dados de forma simples e
eficiente. Podemos imaginar a Pilha como uma pilha de pratos, o
primeiro a ser colocado, é o último a ser tirado, senão os pratos
caem.
A instrução PUSH armazena um WORD (2 bytes ou 16-bits) na Pilha.
Sua sintaxe é a seguinte:
PUSH registrador/word
POP registrador/word
Exemplos:
MOV AH,01h
INT 21h
MOV AH,00h ;zera-se o valor de AH pois AX contém AH e
queremos apenas o valor de AL
PUSH AX
ADD CX,1
CMP CX,5
JL 0100 ;0100 é o endereço do início do programa no
DEBUG do DOS
POP AX
MOV AH,02h
INT 21h
SUB CX,1
CMP CX,0
JG 0114 ;a cada linha o endereço aumenta em 2
MOV AH,4Ch
INT 21h
O DEBUG do DOS
O DEBUG é uma ferramenta interessante do DOS pois ele apresenta
um Assembler, isto é, um montador sequencial de instruções Assembly.
Para se iniciar o Assembler do DEBUG, a linha de comando é:
C:\>debug
-A
0CFF:0100
A diretiva .MODEL
A diretiva .model define o modelo de memória de um programa
.EXE, e deve ser incluída no início do código.
Os modelos de memória são os seguintes:
.model tiny
.model small ;usaremos small para nossos programas
.model medium
.model compact
.model large
.model huge
.model flat ;usado em aplicativos Win32
A diretiva .STACK
A diretiva .stack define o tamanho da pilha. Pode ser usada da
seguinte maneira:
.stack tamanho_da_pilha
A diretiva .DATA
A diretiva .data é usada para declaração de variáveis. Pode ser
usada da seguinte maneira:
.data
var1 db 10 ;db = define byte. Valor inicial = 10
var2 db ? ;Valor inicial = não definido
var3 db 10 dup(‘$’) ;cria um vetor de tamanho 10
e o preenche com $
var4 dw 32767 ;dw = define word. Tamanho 2 bytes
var5 dd 65536 ;dd = define double word. 4 bytes
string db ‘String,’$’ ;cria uma string. Terminador $
A diretiva .CODE
A diretiva .code é usada para demarcar o início do código. O
código deve começar a ser executado a partir de um segmento:
.code
main: ;segmento de inicio. Pode ter qualquer nome
end main ;termina o segmento main
Hello World
O programa a seguir escreve a mensagem “Hello World” na tela e
executa uma pequena pausa ao final:
.model small
.stack 100h
.data
msg db 'Hello World','$'
.code
main:
mov ax,@data
mov ds,ax
mov es,ax
mov ah,09
lea dx,msg ;mov dx,offset msg
int 21h
mov ah,08h
int 21h
mov ah,4ch
int 21h
end main
Turbo Assembler
O Turbo Assembler da Borland (TASM) é um montador Assembly. Para
montar programas usando esta ferramenta, deve-se usar a linha de
comando do DOS.
Para montar um arquivo .obj deve-se usar a seguinte linha de
comando:
C:\TASM\BIN>TASM hello.asm
C:\TASM\BIN>TLINK hello.obj
@echo off
set program=hello
cls
echo ---------------------------
echo Backup...
copy /v %program%.asm /a %program%.bak /a
echo ---------------------------
..\..\bin\TASM %program%.asm
echo ---------------------------
..\..\bin\TLINK %program%.obj
echo ---------------------------
pause
cls
%program%.exe
exit