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


Tutorial de Linguagem Assembly, Notas de estudo de Mecatrônica

Otima Apostila. Não tenho referencia de sua fonte mas garanto possuir um conteúdo muito bom e completo. Recomendo

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 17/06/2010

felipe-oliveira-90
felipe-oliveira-90 🇧🇷

4.9

(7)

11 documentos

1 / 66

Toggle sidebar

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

Não perca as partes importantes!

bg1
T U T O R I A L D E L I N G U A G E M A S S E M B L Y
--------------- --- ----------------- ---------------
Conteúdo:
1.Introdução
2.Conceitos Básicos
3.Programação Assembly
4.Instruções Assembly
5.Interrupções e gerência de arquivos
6.Macros e procedimentos
7.Exemplos de programas
***********************************************************************
CAPíTULO 1: INTRODUÇÃO
Conteúdo:
1.1.O que há de novo neste material
1.2.Apresentação
1.3.Por que aprender Assembly?
1.1.O que há de novo neste material:
Uma sessão completa sobre como usar o programa debug.
Mais exemplos de programas.
Um motor de pesquisa, para qualquer tópico ou item relacionado … esta
nova versão.
Considerável reorganização e revisão do material Assembly.
Em cada sessão, há um link para o Dicionário On-line de Computação de
Dennis Howe.
1.2.Apresentação:
Este tutorial destina-se àquelas pessoas que nunca tiveram contato com a Linguagem
Assembly.
O tutorial está completamente focado em computadores com processadores 80x86 da
família Intel, e considerando que a base da linguagem é o funcionamento dos
recursos internos do processador, os exemplos descritos não são compatíveis com
qualquer outra arquitetura.
As informações estão dispostas em unidades ordenadas para permitir fácil acesso a
cada tópico, bem como uma melhor navegação pelo tutorial.
Na sessão introdutória são mencionados alguns conceitos elementares sobre
computadores e a Linguagem Assembly em si.
1.3.Por que aprender Assembly?
A primeira razão para se trabalhar com o assembler é a oportunidade de
conhecer melhor o funcionamento do seu PC, o que permite o desenvolvimento de
programas de forma mais consistente.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42

Pré-visualização parcial do texto

Baixe Tutorial de Linguagem Assembly e outras Notas de estudo em PDF para Mecatrônica, somente na Docsity!

T U T O R I A L D E L I N G U A G E M A S S E M B L Y

Conteúdo: 1.Introdução 2.Conceitos Básicos 3.Programação Assembly 4.Instruções Assembly 5.Interrupções e gerência de arquivos 6.Macros e procedimentos 7.Exemplos de programas


CAPíTULO 1: INTRODUÇÃO Conteúdo: 1.1.O que há de novo neste material 1.2.Apresentação 1.3.Por que aprender Assembly? 1.1.O que há de novo neste material: Uma sessão completa sobre como usar o programa debug. Mais exemplos de programas. Um motor de pesquisa, para qualquer tópico ou item relacionado … esta nova versão. Considerável reorganização e revisão do material Assembly. Em cada sessão, há um link para o Dicionário On-line de Computação de Dennis Howe. 1.2.Apresentação: Este tutorial destina-se àquelas pessoas que nunca tiveram contato com a Linguagem Assembly. O tutorial está completamente focado em computadores com processadores 80x86 da família Intel, e considerando que a base da linguagem é o funcionamento dos recursos internos do processador, os exemplos descritos não são compatíveis com qualquer outra arquitetura. As informações estão dispostas em unidades ordenadas para permitir fácil acesso a cada tópico, bem como uma melhor navegação pelo tutorial. Na sessão introdutória são mencionados alguns conceitos elementares sobre computadores e a Linguagem Assembly em si. 1.3.Por que aprender Assembly? A primeira razão para se trabalhar com o assembler é a oportunidade de conhecer melhor o funcionamento do seu PC, o que permite o desenvolvimento de programas de forma mais consistente.

A segunda razão é que você pode ter um controle total sobre o PC ao fazer uso do assembler. Uma outra razão é que programas assembly são mais rápidos, menores e mais poderosos do que os criados com outras linguagens. Ultimamente, o assembler (montador) permite uma otimização ideal nos programas, seja no seu tamanho ou execussão. CAPÍTULO 2: CONCEITOS BÁSICOS Conteúdo: 2.1.Descrição básica de um sistema computacional. 2.2.Conceitos básicos da Linguagem Assembly 2.3.Usando o programa debug Esta sessão tem o propósito de fazer um breve comentário a respeito dos principais componentes de um sistema computacional, o que irá permitir ao usuário uma melhor compreensão dos conceitos propostos no decorrer do tutorial. 2.1.DESCRIÇãO DE UM SISTEMA COMPUTACIONAL Conteúdo: 2.1.1.Processador Central 2.1.2.Memória Principal 2.1.3.Unidades de Entrada e Saída 2.1.4.Unidades de Memória Auxiliar Sistema Computacional. Chamamos de Sistema Computacional a completa configuração de um computador, incluindo os periféricos e o sistema operacional. 2.1.1.Processador Central. O também conhecido por CPU ou Unidade Central de Processamento, que por sua vez é composta pela unidade de controle e unidade de lógica e aritmética. Sua função consiste na leitura e escrita do conteúdo das células de memória, regular o tráfego de dados entre as células de memória e registradores especiais, e decodificar e executar as instruções de um programa. O processador tem uma série de células de memória usadas com frequência e, dessa forma, são partes da CPU. Estas células são conhecidas com o nome de registradores. Um processador de um PC possui cerca de 14 registradores. Como os PCs tem sofrido evolução veremos que podemos manipular registradores de 16 ou 32 bits. A unidade de lógica e aritmética da CPU realiza as operações relacionadas ao cálculo simbólico e numérico. Tipicamente estas unidades apenas são capazes de realizar operações elementares, tais como: adição e subtração de dois números

2.2.2.Métodos de representação de dados 2.2.1.Informação no computador: 2.2.1.1.Unidades de informação 2.2.1.2.Sistemas numéricos 2.2.1.3.Convertendo números binários para decimais 2.2.1.4.Convertendo números decimais para binários 2.2.1.5.Sistema hexadecimal 2.2.1.1.Unidades de informação Para o PC processar a informação, é necessário que ela esteja em células especiais, chamadas registradores. Os registradores são grupos de 8 ou 16 flip-flops. Um flip-flop é um dispositivo capaz de armazenar 2 níveis de voltagem, um baixo, geralmente 0.5 volts, e outro comumente de 5 volts. O nível baixo de energia no flip-flop é interpretado como desligado ou 0, e o nível alto, como ligado ou 1. Estes estados são geralmente conhecidos como bits, que são a menor unidade de informação num computador. Um grupo de 16 bits é conhecido como palavra; uma palavra pode ser dividida em grupos de 8 bits chamados bytes, e grupos de 4 bits chamados nibbles. 2.2.1.2.Sistemas numéricos O sistema numérico que nós usamos diariamente é o decimal, mas este sistema não é conveniente para máquinas, pois ali as informações têm que ser codificadas de modo a interpretar os estados da corrente (ligado-desligado); este modo de código faz com que tenhamos que conhecer o cálculo posicional que nos permitirá expressar um número em qualquer base onde precisarmos dele. O possível representar um determinado número em qualquer base através da seguinte fórmula: Onde n é a posição do dígito, iniciando da direita para a esquerda e numerando de 0. D é o dígito sobre o qual nós operamos e B é a base numérica usada. 2.2.1.3.Convertendo números binários para decimais Quando trabalhamos com a Linguagem Assembly encontramos por acaso a necessidade de converter números de um sistema binário, que é usado em computadores, para o sistema decimal usado pelas pessoas. O sistema binário é baseado em apenas duas condições ou estados, estar ligado(1), ou desligado(0), portanto sua base é dois. Para a conversão, podemos usar a fórmula de valor posicional: Por exemplo, se tivermos o número binário 10011, tomamos cada dígito da

direita para a esquerda e o multiplicamos pela base, elevando à potência correspondente … sua posição relativa: Binary: 1 1 0 0 1 Decimal: 12^0 + 12^1 + 02^2 + 02^3 + 1*2^ = 1 + 2 + 0 + 0 + 16 = 19 decimal. O caracter ^ é usado em computação como símbolo para potência e * para a multiplicação. 2.2.1.4.Convertendo números decimais para binário Há vários métodos para se converter números decimais para binário; apenas um será analizado aqui. Naturalmente a conversão com uma calculadora científica é muito mais fácil, mas nem sempre podemos contar com isso, logo o mais conveniente é, ao menos, sabermos uma fórmula para fazê-la. O método resume-se na aplicação de divisões sucessivas por 2, mantendo o resto como o dígito binário e o resultado como o próximo número a ser dividido. Tomemos como exemplo o número decimal 43. 43/2=21 e o resto é 1; 21/2=10 e o resto é 1; 10/2=5 e o resto é 0; 5/2=2 e o resto é 1; 2/2=1 e o resto é 0; 1/2=0 e o resto é 1. Para construir o equivalente binário de 43, vamos pegar os restos obtidos de baixo para cima, assim temos 101011. 2.2.1.5.Sistema hexadecimal Na base hexadecimal temos 16 dígitos, que vão de 0 a 9 e da letra A até a F, estas letras representam os números de 10 a 15. Portanto contamos: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E, e F. A conversão entre números binários e hexadecimais é fácil. A primeira coisa a fazer é dividir o número binário em grupos de 4 bits, começando da direita para a esquerda. Se no grupo mais à direita sobrarem dígitos, completamos com zeros. Tomando como exemplo o número binário 101011, vamos dividi-lo em grupos de 4 bits: 10; Preenchendo o último grupo com zeros (o um mais à esquerda): 0010; A seguir, tomamos cada grupo como um número independente e consideramos o seu valor decimal: 0010=2;1011= Entretanto, observa-se que não podemos representar este número como 211, isto seria um erro, uma vez que os números em hexa maiores que 9 e menores que 16 são

em 2 partes: sua base e seu expoente. Por exemplo o número decimal 1234000, é representado como 1.234*10^6, observamos que o expoente irá indicar o número de casas que o ponto decimal deve ser movido para a direita, a fim de obtermos o número original. O expoente negativo, por outro lado, indica o número de casas que o ponto decimal deve se locomover para a esquerda. 2.3.PROGRAMA DEBUG Conteúdo: 2.3.1.Processo de criação de programas 2.3.2.Registradores da CPU 2.3.3.Programa debug 2.3.4.Estrutura Assembly 2.3.5.Criando um programa assembly simples 2.3.6.Armazenando e carregando os programas 2.3.1.Processo de criação de programas. Para a criação de programas são necessários os seguintes passos:

  • Desenvolvimento do algoritmo, estágio em que o problema a ser solucionado é estabelecido e a melhor solução é proposta, criação de diagramas esquemáticos relativos à melhor solução proposta.
  • Codificação do algoritmo, o que consiste em escrever o programa em alguma linguagem de programação; linguagem assembly neste caso específico, tomando como base a solução proposta no passo anterior.
  • A transformação para a linguagem de máquina, ou seja, a criação do programa objeto, escrito como uma seq チ ência de zeros e uns que podem ser interpretados pelo processador.
  • O último estágio é a eliminação de erros detectados no programa na fase de teste. A correção normalmente requer a repetição de todos os passos, com observação atenta. 2.3.2.Registradores da CPU. Para o propósito didático, vamos focar registradores de 16 bits. A CPU possui 4 registradores internos, cada um de 16 bits. São eles AX, BX, CX e DX. São registradores de uso geral e também podem ser usados como registradores de 8 bits. Para tanto devemos referenciá-los como, por exemplo, AH e AL, que são, respectivamente, o byte high e o low do registrador AX. Esta nomenclatura também se aplica para os registradores BX, CX e DX. Os registradores, segundo seus respectivos nomes: 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 CS Registrador de Segmento de Código BP Registrador Apontador da Base SI Registrador de Índice Fonte DI Registrador de Índice Destino SP Registrador Apontador de Pilha IP Registrador Apontador da Próxima Instrução F Registrador de Flag 2.3.3.Programa Debug. Para a criação de um programa em assembler existem 2 opções: usar o TASM - Turbo Assembler da Borland, ou o DEBUGGER. Nesta primeira seção vamos usar o debug, uma vez que podemos encontrá-lo em qualquer PC com o MS-DOS. Debug pode apenas criar arquivos com a extensão .COM, e por causa das características deste tipo de programa, eles não podem exceder os 64 Kb, e também devem iniciar no endereço de memória 0100H dentro do segmento específico. O importante observar isso, pois deste modo os programas .COM não são relocáveis. Os principais comandos do programa debug são: A Montar instruções simbólicas em código de máquina D Mostrar o conteúdo de uma área da memória E Entrar dados na memória, iniciando num endereço específico G Rodar um programa executável na memória N Dar nome a um programa P Proceder, ou executar um conjunto de instruções relacionadas Q Sair do programa debug R Mostrar o conteúdo de um ou mais registradores T Executar passo a passo as instruções U Desmontar o código de máquina em instruções simbólicas W Gravar um programa em disco O possível visualizar os valores dos registradores internos da CPU usando o programa Debug. Debug é um programa que faz parte do pacote do DOS, e pode ser encontrado normalmente no diretório C:\DOS. Para iniciá-lo, basta digitar Debug na linha de comando: C:/>Debug [Enter]

Você notará então a presença de um hífen no canto inferior esquerdo da tela. Não se espante, este é o prompt do programa. Para visualizar o conteúdo dos registradores, experimente: -r[Enter] AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI= DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0100 NV UP EI PL NZ NA PO NC 0D62:0100 2E CS: 0D62:0101 803ED3DF00 CMP BYTE PTR [DFD3],00 CS:DFD3=

Para montar um programa no Debug, é usado o comando "a" (assemble); quando usamos este comando, podemos especificar um endereço inicial para o nosso programa como o parƒmetro, mas é opcional. No caso de omissão, o endereço inicial é o especificado pelos registradores CS:IP, geralmente 0100h, o local em que programas com extensão .COM devem iniciar. E será este o local que usaremos, uma vez que o Debug só pode criar este tipo de programa. Embora neste momento não seja necessário darmos um parƒmetro ao comando "a", isso é recomendável para evitar problemas, logo: a 100[enter] mov ax,0002[enter] mov bx,0004[enter] add ax,bx[enter] nop[enter][enter] O que o programa faz? Move o valor 0002 para o registrador ax, move o valor 0004 para o registrador bx, adiciona o conteúdo dos registradores ax e bx, guardando o resultado em ax e finalmente a instrução nop (nenhuma operação) finaliza o programa. No programa debug, a tela se parecerá com: C:>debug -a 100 0D62:0100 mov ax, 0D62:0103 mov bx, 0D62:0106 add ax,bx 0D62:0108 nop 0D62: Entramos com o comando "t" para executar passo a passo as instruções: -t AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI= DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0103 NV UP EI PL NZ NA PO NC 0D62:0103 BB0400 MOV BX, Vemos o valor 0002 no registrador AX. Teclamos "t" para executar a segunda instrução: -t AX=0002 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI= DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0106 NV UP EI PL NZ NA PO NC 0D62:0106 01D8 ADD AX,BX Teclando "t" novamente para ver o resultado da instrução add: -t AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI= DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0108 NV UP EI PL NZ NA PE NC 0D62:0108 90 NOP A possibilidade dos registradores conterem valores diferentes existe, mas AX e BX devem conter os mesmos valores acima descritos.

Para sair do Debug usamos o comando "q" (quit). 2.3.6.Armazenando e carregando os programas. Não seria prático ter que digitar o programa cada vez que iniciássemos o Debug. Ao invés disso, podemos armazená-lo no disco. Só que o mais interessante nisso é que um simples comando de salvar cria um arquivo com a extensão .COM, ou seja, executável - sem precisarmos efetuar os processos de montagem e ligação, como veremos posteriormente com o TASM. Eis os passos para salvar um programa que já esteja na memória:

  • Obter o tamnho do programa subtraindo o endereço final do endereço inicial, naturalmente que no sistema hexadecimal.
  • Dar um nome ao programa.
  • Colocar o tamanho do programa no registrador CX.
  • Mandar o debug gravar o programa em disco. Usando como exemplo o seguinte programa, vamos clarear a idéia de como realizar os passos acima descritos: 0C1B:0100 mov ax, 0C1B:0103 mov bx, 0C1B:0106 add ax,bx 0C1B:0108 int 20 0C1B:010A Para obter o tamanho de um programa, o comando "h" é usado, já que ele nos mostra a adição e subtração de dois números em hexadecimal. Para obter o tamanho do programa em questão, damos como parƒmetro o valor do endereço final do nosso programa (10A), e o endereço inicial (100). O primeiro resultado mostra-nos a soma dos endereços, o segundo, a subtração. -h 10a 100 020a 000a O comando "n" permite-nos nomear o programa. -n test.com O comando "rcx" permite-nos mudar o conteúdo do registrador CX para o valor obtido como tamanho do arquivo com o comando "h", neste caso 000a. -rcx CX 0000 :000a Finalmente, o comando "w" grava nosso programa no disco, indicando quantos bytes gravou. -w Writing 000A bytes Para já salvar um arquivo quando carregá-lo, 2 passos são necessários: Dar o nome do arquivo a ser carregado. Carregá-lo usando o comando "l" (load).

3.1.2.PROGRAMAÇÃO ASSEMBLY

Para construirmos os programas com o TASM, devemos estruturar o fonte de forma diferenciada ao que fazíamos com o programa debug. O importante incluir as seguintes diretivas assembly: .MODEL SMALL Define o melo de memória a usar em nosso programa .CODE Define as instruções do programa, relacionado ao segmento de código .STACK Reserva espaço de memória para as instruções de programa na pilha END Finaliza um programa assembly Vamos programar Primeiro passo Use qualquer editor para criar o programa fonte. Entre com as seguintes linhas: Primeiro exemplo ; use ; para fazer comentários em programas assembly .MODEL SMALL ;modelo de memória .STACK ;espaço de memória para instruções do programa na pilha .CODE ;as linhas seguintes são instruções do programa mov ah,01h ;move o valor 01h para o registrador ah mov cx,07h ;move o valor 07h para o registrador cx int 10h ;interrupção 10h mov ah,4ch ;move o valor 4ch para o registrador ah int 21h ;interrupção 21h END ;finaliza o código do programa Este programa assembly muda o tamanho do cursor. Segundo passo Salvar o arquivo com o seguinte nome: exam1.asm Não esquecer de salvá-lo no formato ASCII. Terceiro passo Usar o programa TASM para construir o programa objeto. Exemplo: C:>tasm exam1.asm Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland International Assembling file: exam1.asm Error messages: None Warning messages: None Passes: 1

Remaining memory: 471k O TASM só pode criar programas no formato .OBJ, que ainda não pode ser executado... Quarto passo Usar o programa TLINK para criar o programa executável. Exemplo: C:>tlink exam1.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:> Onde exam1.obj é o nome do programa intermediário, .OBJ. O comando acima gera diretamente o arquivo com o nome do programa intermediário e a extensão .EXE. O opcional a colocação da extensão .obj no comando. Quinto passo Executar o programa executável criado. C:>exam1[enter] Lembre-se, este programa assembly muda o tamanho do cursor no DOS. 3.2.Processo Assembly. 3.2.1.Segmentos 3.2.2.Tabela de equivalência 3.2.1.SEGMENTOS A arquitetura dos processadores x86 força-nos a usar segmentos de memória para gerenciar a informação, o tamanho destes segmentos é de 64Kb. A razão de ser destes segmentos é que, considerando que o tamanho máximo de um número que o processador pode gerenciar é dado por uma palavra de 16 bits ou registrador, assim não seria possível acessar mais do que 65536 locais da memória usando apenas um destes registradores. Mas agora, se a memória do PC é dividida em grupos de segmentos, cada um com 65536 locais, e podemos usar um endereço ou registrador exclusivo para encontrar cada segmento, e ainda fazemos cada endereço de um específico slot com dois registradores, nos é possível acessar a quantidade de 4294967296 bytes de memória, que é, atualmente, a maior memória que podemos instalar num PC. Desta forma, para que o montador seja capaz de gerenciar os dados, se faz necessário que cada informação ou instrução se encontre na área correspondente ao seu segmento. O endereço do segmento é fornecido ao montador pelos registradores DS, ES, SS e CS. Lembrando um programa no Debug, observe: 1CB0:0102 MOV AX,BX

;exemplo .model small .stack .code mov ah,2h ;move o valor 2h para o registrador ah mov dl,2ah ;move o valor 2ah para o registrador dl ;(é o valor ASCII do caractere *) int 21h ;interrupção 21h mov ah,4ch ;função 4ch, sai para o sistema operacional int 21h ;interrupção 21h end ;finaliza o programa Segundo passo Salvar o arquivo com o nome: exam2.asm Não esquecer de salvar em formato ASCII. Terceiro passo Usar o programa TASM para construir o programa objeto. C:>tasm exam2.asm Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland International Assembling file: exam2.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 471k Quarto passo Usar o programa TLINK para criar o programa executável. C:>tlink exam2.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:> Quinto passo Executar o programa: C:>exam2[enter]

C:> Este programa imprime o caracter * na tela. Clique aqui para obter mais programas 3.4.Tipos de instruções. 3.4.1.Movimento de dados 3.4.2.Operações lógicas e aritméticas 3.4.3.Saltos, laços e procedimentos

3.4.1.MOVIMENTO DE DADOS

Em qualquer programa há necessidade de se mover dados na memória e em registradores da CPU; há vários modos de se fazê-lo: pode-se copiar os dados da memória para algum registrador, de registrador para registrador, de um registrador para a pilha, da pilha para um registrador, transmitir dados para um dispositivo externo e vice-versa. Este movimento de dados é sujeito a regras e restrições, entre elas: *Não é possível mover dados de um local da memória para outro diretamente; é necessário primeiro mover o dado do local de origem para um registrador e então do registrador para o local de destino. *Não é possível mover uma constante diretamente para um registrador de segmento; primeiro deve-se mover para um registrador. O possível mover blocos de dados através de instruções movs, que copia uma cadeia de bytes ou palavras; movsb copia n bytes de um local para outro; e movsw copia n palavras. A última das duas instruções toma os valores dos endereços definidos por DS:SI como o grupo de dados a mover e ES:DI como a nova localização dos dados. Para mover dados há também estruturas chamadas pilhas, onde o dado é introduzido com a instrução push e é extraído com a instrução pop Numa pilha o primeiro dado a entrar é o último a sair, por exemplo: PUSH AX PUSH BX PUSH CX Para retornar os valores da pilha referentes … cada registrador é necessário seguir-se a ordem: POP CX POP BX POP AX Para a comunicação com dispositivos externos o comando de saída é usado para o envio de informações a uma porta e o comando de entrada é usado para receber informação de uma porta. A sintaxe do comando de saída: OUT DX,AX Onde DX contém o valor da porta que será usada para a comunicação e AX contém a informação que será enviada. A sintaxe do comando de entrada: IN AX,DX Onde AX é o registrador onde a informação será armazenada e DX contém o endereço da porta de onde chegará a informação.

INSTRUÇãO MOV Propósito: Transferência de dados entre células de memória, registradores e o acumulador. Sintaxe: MOV Destino,Fonte Destino é o lugar para onde o dado será movido e Fonte é o lugar onde o dado está. Os diferentes movimentos de dados permitidos para esta instrução são: *Destino: memória. Fonte: acumulador *Destino: acumulador. Fonte: memória *Destino: registrador de segmento. Fonte: memória/registrador *Destino: memória/regitrador. Fonte: registrador de segmento *Destino: registrador. Fonte: registrador *Destino: registrador. Fonte: memória *Destino: memória. Fonte: registrador *Destino: registrador. Fonte: dado imediato *Destino: memória. Fonte: dado imediato Exemplo: MOV AX,0006h MOV BX,AX MOV AX,4C00h INT 21h Este pequeno programa move o valor 0006h para o registrador AX, então ele move o conteúdo de AX (0006h) para o registrador BX, e finalmente move o valor 4C00h para o registrador AX para terminar a execução com a opção 4C da interrupção 21h. INSTRUÇÕES MOVS (MOVSB) (MOVSW) Propósito: Mover byte ou cadeias de palavra da fonte, endereçada por SI, para o destino endereçado por DI. Sintaxe: MOVS Este comando não necessita de parƒmetros uma vez que toma como endereço fonte o conteúdo do registrador SI e como destino o conteúdo de DI. A seguinte seqüência de instruções ilustra isso: MOV SI, OFFSET VAR MOV DI, OFFSET VAR MOVS Primeiro inicializamos os valores de SI e DI com os endereços das variáveis VAR1 e VAR2 respectivamente, então após a execução de MOVS o conteúdo de VAR1 é copiado para VAR2. As instruções MOVSB e MOVSW são usadas do mesmo modo que MOVS, a primeira move um byte e a segunda move uma palavra.

Instruções de carga. São instruções específicas para registradores, usadas para carregar bytes ou cadeias de bytes num registrador. LODS (LODSB) (LODSW) LAHF LDS LEA LES INSTRUÇÕES LODS (LODSB) (LODSW) Propósito: Carregar cadeias de um byte ou uma palavra para o acumulador. Sintaxe: LODS Esta instrução toma a cadeia encontrada no endereço especificado por SI, a carrega para o registrador AL (ou AX) e adiciona ou subtrai, dependendo do estado de DF, para SI se é uma transferência de bytes ou de palavras. MOV SI, OFFSET VAR LODS Na primeira linha vemos a carga do endereço de VAR1 em SI e na segunda é tomado o conteúdo daquele local para o regiustrador AL. Os comandos LODSB e LODSW são usados do mesmo modo, o primeiro carrega um byte e o segundo uma palavra (usa todo o registrador AX). INSTRUÇÃO LAHF Propósito: Transferir o conteúdo dos flags para o registrador AH. Sintaxe: LAHF Esta instrução é útil para verificar o estado dos flags durante a execução do nosso programa. Os flags são deixados na seguinte ordem dentro do registrador: SF ZF ?? AF ?? PF ?? CF O "??" significa que haverá um valor indefinido naqueles bits. INSTRUÇÃO LDS