Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Assembly ap4, Notas de estudo de Engenharia Telemática

Introdução à linguagem montadora do 8086

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 30/11/2010

samuel-santos-22
samuel-santos-22 🇧🇷

4.6

(41)

262 documentos

1 / 30

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Cap4 – Introdução à Linguagem Montadora do 8086
Página 1 de 30
4. Introdução à linguagem montadora do 8086
4.1 A sintaxe assembly do 8086
A linguagem montadora não é sensível à letra maiúscula ou minúscula
Para facilitar a compreensão do texto do programa, sugere-se:
uso de letra maiúscula para código
uso de letra minúscula para comentários
Declarações (statements):
instruções, que são convertidas em código de máquina
diretivas, que instruem o montador a realizar alguma tarefa específica:
- alocar espaço de memória para variáveis
- criar uma sub-rotina (procedure ou procedimento)
Formato de uma declaração (linha de programa):
[Nome] [Cod. oper.] [Operando(s)] [;Comentário]
Exemplo:
INICIO: MOV CX,5h ;inicializar contador
A separação entre os campos deve ser do tipo <espaço> ou <tab>.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e

Pré-visualização parcial do texto

Baixe Assembly ap4 e outras Notas de estudo em PDF para Engenharia Telemática, somente na Docsity!

4. Introdução à linguagem montadora do 8086

4.1 A sintaxe assembly do 8086

A linguagem montadora não é sensível à letra maiúscula ou minúscula

Para facilitar a compreensão do texto do programa, sugere-se :

uso de letra maiúscula para código

  • uso de letra minúscula para comentários

Declarações ( statements ):

  • instruções , que são convertidas em código de máquina
  • diretivas , que instruem o montador a realizar alguma tarefa específica:
    • alocar espaço de memória para variáveis
    • criar uma sub-rotina ( procedure ou procedimento)

Formato de uma declaração (linha de programa):

[Nome] [Cod. oper.] [Operando(s)] [;Comentário]

Exemplo:

INICIO: MOV CX,5h ;inicializar contador

A separação entre os campos deve ser do tipo <espaço> ou .

  • O campo Nome:

Pode ser um rótulo de instrução, um nome de sub-rotina , um nome de

variável , contendo de 1 a 31 caracteres, iniciando por uma letra e contendo

somente letras, números e os caracteres?. @ _ : $ %.

Obs: o Montador traduz os nomes por endereços de memória.

Exemplos: nomes válidos nomes inválidos

LOOP1: DOIS BITS

.TEST 2abc

@caracter A42. 25

SOMA_TOTAL4

  • Campo de código de operação:

Contem o código de operação simbólico ( mnemônico )

No caso de diretivas, contem o código de pseudo-instrução

Exemplos: instruções diretivas

MOV .MODEL

ADD .STACK

INC nome PROC

JMP

  • Campo de comentário:
    • um ponto-e-vírgula ( ; ) marca o início deste campo;
    • o Montador ignora tudo após o este marcador;
    • comentários são opcionais.

Uma boa prática de programação é comentar tudo e incluir a

informação acerca da idéia por trás da codificação (o algorítmo).

Exemplos:

MOV CX,0 ; movimenta 0 para CX (óbvio!)

MOV CX,0 ; CX conta no. de caracteres, inicialmente vale 0

; (linhas em branco: separação)

; inicialização dos registradores (linha inteira de comentário)

4.2 Formato de dados, variáveis e constantes

  • Números:

Exemplos:

  • binário: 1110101b ou 1110101B
  • decimal: 64223 ou 64223d ou 64223D

1110101 é considerado decimal (ausência do B)

-2184D (número decimal negativo)

  • hexa: 64223h ou 64223H

0FFFFh começa com um decimal e termina com h

1B4Dh

Exemplos de números ilegais :

1,234 caracter estranho (vírgula)

FFFFh não começa por número de 0 a 9

difícil distinguir do nome de uma variável

1B4D não termina com h ou H

  • Caracteres ASCII:

Caracteres isolados ou strings de caracteres devem estar escritos dentro

de aspas simples ( ) ou duplas ( ).

Exemplos:

“ A” ou ‘ A ’

‘ola, como vai’

“EXEMPLO”

- Definição de variáveis de tipo word:

Nome DW valor_inicial

Exemplos:

WORD1 DW 0h ;equivale a 0000h

CONTA DW 0150h ; OK !, por que?

C DW? ;não inicializada

WORD1 DW 1234h ;byte baixo 34h, endereço WORD

;byte alto 12h endereço WORD1+

- Array : sequência de bytes ou words consecutivos na memória - armazenar dados relacionados - armazenar caracteres ASCII organizados (ex: texto)

Exemplos:

BYTE_ARRAY DB 10h,20h,30h

WORD_ARRAYDW 1000h,123h,0h,0FFFFh

Um array pode conter um string de caracteres, sendo definido como:

LETRAS DB ‘abC’ ;e´ equivalente aos caracteres ASCII

LETRAS DB 61h,62h,43h ;depende se maiúscula ou minúscula

- Combinação de caracteres e números numa mesma definição:

MENSAGEM DB ‘Alo!’, 0Ah,0Dh,’$’

O caracter ' $ ' marca o fim de um string de caracteres e não é exibido.

  • Constantes:

Constante é um nome simbólico para um dado de valor constante, que seja

muito utilizado num programa.

Para atribuir um nome a uma constante, utiliza-se a pseudo-instrução EQU

( equates -> igual a) e a sintaxe:

Nome EQU valor_da_constante

Exemplos:

LF EQU 0Ah ;caracter Line Feed como LF

CR EQU 0Dh ;caracter Carriage return como CR

LINHA1 EQU ‘Digite seu nome completo’

MENSAGEM DB LINHA1,LF,CR

Observação:

  • Constantes não geram código de máquina.

Graficamente: suponha a instrução MOV AX,WORD

Antes Depois

AX AX

0006h 8FFFh

WORD1 WORD

8FFFh 8FFFh

Obs: para a instrução MOV não é permitido operar de posição de memória

para posição de memória diretamente, por motivos técnicos do 8086.

Por exemplo:

MOV WORD1,WORD2 ;instrução inválida

;esta restrição é contornada como segue

MOV AX,WORD2 ;primeiro o conteúdo de WORD2 vai para AX

MOV WORD1,AX ;depois, o conteúdo de AX é movido para a

;posição de memória WORD

XCHG destino,fonte

Usada para trocar dados (nos dois sentidos) entre:

  • registrador e registrador

registrador e uma posição de memória

  • não é permitido trocas diretas entre posições de memória

Combinações legais de operandos:

Operando destino

Operando fonte Registrador

de dados

Posição de

memória

Reg. de dados sim sim

Reg. de segmento não não

Posição de memória sim não

Exemplos de instruções válidas:

XCHG AX,WORD1 ;troca o conteúdo da posição de memória WORD

;com o do registrador AX

XCHG AH,BL ;troca o conteúdo do byte baixo de BX com o

;do byte alto de AX

Graficamente: suponha a instrução XCHG AH,BL

Antes Depois

AH AL AH AL

14h FFh E0h FFh

BH BL BH BL

C2h E0h C2h 14h

Graficamente: suponha a instrução ADD AX,DX

Antes Depois

AX AX

0006h 0009h

DX DX

0003h 0003h

Obs 1:

ADD BYTE1,BYTE2 ;instrução inválida

;esta restrição é contornada como segue

MOV AL,BYTE2 ;primeiro o conteúdo de BYTE2 vai para AL

ADD BYTE1,AL ;depois, o conteúdo de AL é somado ao da

;posição de memória BYTE1, resultado final

;em BYTE

Obs 2 : o resultado de SUB , se for negativo, estará armazenado no registrador

destino em complemento de 2.

INC destino

DEC destino

Usadas para adicionar 1 (incrementar) ou subtrair 1 (decrementar) ao/do

conteúdo de:

  • um registrador
  • uma posição de memória

Exemplos:

INC CX ;incrementa o conteúdo de CX

INC WORD1 ;incrementa o conteúdo da posição de memória WORD

DEC BYTE2 ;decrementa o conteúdo da posição de memória BYTE

DEC CL ;decrementa o conteúdo de CL (byte baixo de CX)

Graficamente: suponha a instrução INC BYTE

Antes Depois

BYTE1 BYTE

06h 07h

4.4 estrutura de um programa em Linguagem Montadora

  • Modelos de memória

O tamanho que os segmentos de código e de dados devem ter é especificado

pelo modelo de memória por meio da diretiva .MODEL.

Sintaxe: .MODEL modelo_de_memória

Modelo Descrição

SMALL Código em 1 segmento;

Dados em 1 segmento

MEDIUM Código em mais de 1 segmento;

Dados em 1 segmento

COMPACT Código em 1 segmento;

Dados em mais de 1 segmento

LARGE Código em mais de 1 segmento;

Dados em mais de 1 segmento;

Nenhum array maior que 64 Kbytes

HUGE Código em mais de 1 segmento;

Dados em mais de 1 segmento;

Arrays maiores que 64 Kbytes

Obs :

  • A menos que haja muitas linhas de programa (muito código) ou muitos

dados, o modelo apropriado é o SMALL.

  • A diretiva .MODEL deve vir antes de qualquer definição de segmento.
  • Segmento de dados
    • Contem a definição e declaração das variáveis.
    • Pode-se também fazer a atribuição de símbolos para constantes.

Sintaxe: .DATA

Exemplo:

.DATA

WORD1 DW A8h

BYTE1 DB 5

MENSAGEM DB ‘Isto e uma mensagem’

LF EQU 0Ah

  • Segmento de pilha ( stack segment )
    • Reserva um bloco de posições de memória consecutivas para

armazenar a pilha

  • Deve ter espaço suficiente para suportar a pilha no seu máximo

tamanho

Sintaxe: .STACK tamanho

Exemplo:

.STACK 100h ;reserva 100h bytes para a área de pilha, um

;tamanho razoável para a maioria das aplicações

  • Exemplo de uma estrutura de programa assembly completo:

TITLE nome_do_programa

.MODEL SMALL

.STACK100h

.DATA

;definição dos dados: variáveis e constantes

.CODE

EXEMPLO PROC

;seqüência de instruções

EXEMPLO ENDP

;segue outras rotinas ou partes do programa

END EXEMPLO

Obs :

  • na primeira linha tem-se a diretiva TITLE seguida do nome do programa;
  • na última linha tem-se a diretiva END , seguida do nome da procedure

principal;

  • se não houver definição de procedure , usa-se apenas END.

4.5 Instruções de entrada e saída

IN e OUT -> instruções Assembly para acessar portas de E/S para periféricos

Não são utilizadas na maioria das aplicações:

(1) os endereços das portas de E/S variam conforme o modelo do PC

é mais fácil utilizar o BIOS ou o DOS para funções de E/S

Para acessar as rotinas de E/S do BIOS ou DOS utiliza-se a instrução:

INT número_de_interrupção

Obs: o programa em curso é interrompido, passando o controle para o DOS,

que realiza a operação de E/S e retorna o controle para o programa.

Exemplo:

INT 21h ;acessa um grande número de funções de E/S do DOS

Algumas funções DOS de E/S:

Função 1h : Entrada de um caracter simples pelo teclado

Acesso: AH = 1h

Resultado: AL = código ASCII do caracter digitado no teclado

Função 2h : Exibição de caracter simples no monitor de vídeo

Acesso: AH = 2h

DL = código ASCII do caracter a exibir

Resultado: exibição na tela do monitor