Você está na página 1de 27

Elemento de Competência da Unidade Didáctica

Caro estudante!

Na unidade didáctica 1 vimos a arquitectura e organização dos computadores. O usuário do


computador pode interagir com o sistema do computador em vários níveis (nível mais alto no
topo e nível mais baixo em baixo). No nível mais alto
Conceptualização
(topo) a interacção do usuário é limitada é interface do
A linguagem de programação software aplicativo, tal como o processador de texto, a
Assembly é eficiente e permite folha de cálculo, etc.
acessibilidade ao hardware do
sistema. Um nível abaixo do nível mais alto o usuário interage
com linguagens de alto nível, tais como C, Jave, etc.
Este nível é independente do sistema do computador,
isto é, por exemplo não depende da arquitectura do
processador onde é executada. Em contraste os
softwares desenvolvidos abaixo deste nível são
dependentes do sistema do computador e são chamados
de linguagens de baixo nível. A programação em
linguagem Assembly é um exemplo de programação em baixo nível. As instruções da
linguagem de programação Assembly são nativas ao processador utilizado no sistema do
computador o que implica que um programa escrito para uma arquitectura de processador não
será executado em outra arquitectura diferente.

Portanto, ao terminar o estudo desta unidade didáctica, você será capaz de:

Elementos de Competência da Unidade Didáctica

 Fazer programas básicos em linguagem de programação Assembly.

Objectivos

No final desta unidade didáctica, você será capaz de:

1. Explicar a diferença entre programação em linguagens de alto nível e programação em


linguagens de baixo nível;

2. Descrever os princípios da programação em linguagem de programação Assembly;

3. Utilizar os elementos básicos para fazer um programa em linguagem Assembly.

4. Utilizar a linguagem de programação assembly suportada pelo processador Pentium.

1
2
Esquema de apresentação dos conteúdos

1. PROGRAMAÇÃO EM LINGUAGEM ASSEMBLY


1.1. Introdução
1.2. Linguagem de Programação Assembly
1.2.1. Declarações na Linguagem de Programação Assembly
1.2.2. Operandos
1.2.3. Modos de Endereçamento
1.2.4. Instruções de Linguagem de Programação Assembly
1.2.5. Definição de Constantes
1.2.6. Exemplos de Programas em Linguagem Assembly

2. RESUMO

3. EXERCÍCIOS DE AUTO AVALIAÇÃO

4. BIBLIOGRAFIA

5. GLOSSÁRIO

3
Desenvolvimento dos conteúdos

1. PROGRAMAÇÃO EM LINGUAGEM ASSEMBLY


1.1. Introdução

Caro(a) estudante, a programação em linguagem


Contexto da experiência e da assembly é referida como programação de baixo nível
realidade porque cada instrução da linguagem assembly realiza
uma tarefa de baixo nível comparada com uma
Você já programa em instrução de linguagem de alto nível ( C, Java). Como
LADDER! consequência, para realizar a mesma tarefa, o código da
linguagem assembly tende a ser mais longo do que o seu
equivalente em código de linguagem de alto nível. As
instruções de linguagem assembly são nativas ao
processador usado no sistema de computador. Neste
caso, um programa escrito em linguagem assembly para o processador “Pentium” não pode
ser executada no processador PowerPC. A programação em Observação reflexiva
linguagem assembly requer conhecimentos acerca dos detalhes
internos do sistema tais como a arquitectura do processador, O que é um tradutor?
organização da memória, e assim por diante.

O arquivo binário pode ser um arquivo de programa


executável que a UCP(Unidade Central de Processamento) pode compreender ou pode um
arquivo comprimido de dados binários, ou qualquer um
Conceptualização
de uma centena de outros tipos de arquivos binários.
O tradutor é um programa
que aceita arquivos de código Caro(a) estudante, os programas
fonte que se apresentam de tradutores são tradutores que geram Observação reflexiva
uma forma que o humano instruções de máquina que a UCP O que pode ser um
pode ler e gera algum tipo de pode entender. Um programa compilador?
arquivo binário. tradutor lê um arquivo de código
fonte linha por linha, e escreve um
arquivo binário de instruções
máquina que realizam as acções de
computador que o arquivo de código fonte descreve.
Este arquivo binário é chamado de arquivo de código
objecto.

Caro(a) estudante, o montador (Assembler) é um


Conceptualização compilador de tipo especial. É também um programa
O compilador é um programa tradutor que lê arquivos de código fonte e tira saídas de
tradutor que lê arquivos em arquivos de código objecto para execução pela UCP. No
código fonte escritos em entanto, uma montador é um tradutor concebido
linguagem de alto nível tais especificamente para traduzir aquilo que nós chamamos
como C ++ ou Pascal e escreve de linguagem assembly em código objecto. O montador
o arquivo de código objecto. é um programa que traduz código de linguagem
assembly em linguagem máquina. O NASM (Netwide
Assembler), o MASM (Microsoft Assembler) e o TASM

4
(Borland Turbo Assembly) são exemplos de alguns dos montadores populares usados para o
processador Pentium.

Caro(a) estudante, no mesmo sentido que um compilador para a linguagem Pascal ou C++
compila um arquivo de código fonte para um arquivo de código objecto, dizemos que um
montador monta um arquivo de código fonte de linguagem assembly para um arquivo de
código objecto. O processo de uma tradução é semelhante em ambos os casos. A linguagem
Assembly, contudo tem uma característica muito importante que difere dos compiladores, o
controle total do código objecto.

1.2. Linguagem de Programação Assembly

Caro(a) estudante, algumas pessoas definem a linguagem de programação Assembly como


uma linguagem em que uma linha de código fonte gera uma instrução máquina. Isso nunca foi
literalmente verdade, uma vez que algumas linhas do arquivo de código fonte da linguagem
Assembly são instruções para o programa tradutor (em vez de para a UCP) e não geram
instruções de máquina.

A definição correcta de linguagem de programação Assembly é a seguinte:

 A linguagem de programação Assembly é um programa tradutor que permite um


controle total sobre todas as instruções de máquina individuais geradas pelo programa
tradutor. Esse programa tradutor é chamado de montador.

Por outro lado, os compiladores Pascal ou C ++ fazem um conjunto de invisíveis e


inalteráveis decisões sobre como uma instrução de linguagem dada será traduzida em
instruções máquina.

A linguagem assembly é directamente influencia pela definição da arquitectura do


processador.

Existem dois tipos básicos de processadores, o CISC(Complex Instruction Set


Computer) e o RISC (Reduced Instruction Set Computer). O

Pentium é um exemplo de um processador CISC.

1.2.1. Declarações na Linguagem de Programação Assembly

Caro(a) estudante, os programas em linguagem assembly são criados com três classes de
declarações:

 Primeira classe de declarações


A primeira classe inclui as declarações que dizem ao processador o que fazer. Estas
declarações são chamadas de instruções executáveis ou simplesmente instruções. Cada
instrução executável consiste de um operando (opcode). As instruções executáveis
fazem com que o montador crie uma instrução máquina. Cada instrução executável
cria uma instrução de linguagem máquina.

 Segunda classe de declarações

5
A segunda classe de declarações providencia informações ao assembler sobre os
vários aspectos do processo assembly. Estas instruções são chamadas de directivas do
montador ou pseudo-ops. As directivas do montador não são executáveis e não geram
uma instrução de linguagem máquina.

 Terceira classe de declarações


As declarações da terceira classe são chamadas de macros. Elas são usadas como
notação curta para um grupo de declarações.

Os macros permitem ao programador de linguagem assembly atribuir um nome único


a um grupo de declarações e referir-se a esse grupo pelo seu nome macro. Durante o
processo macro, cada macro é substituindo pelo grupo de declarações que ele
representa. Este processo é chamado de expansão macro.

As declarações em linguagem assembly são introduzidas no arquivo fonte uma por linha. As
três declarações de linguagem assembly usam o mesmo formato

[label] mnemonic [operandos] [ ;comentário]

Exemplo de uma declaração em linguagem assembly:

repeat: inc result ;incrementar result por 1

Caro(a) estudante, o label “repeat” pode ser usado para referir essa declaração particular. O
mnemonic inc indica uma operação de incrementação a ser feita a um dado armazenado na
memória na localização identificada pelo “result”.

A directiva seguinte define a constante CR. O valor de retorno ASCII é notificado a ele pela
directiva EQU.

CR EQU 0DH ; carácter de retorno

Nos exemplos anteriores, o campo label tem duas formas diferentes. O “label” na instrução
executável é seguida de dois pontos (:) e na declaração de directiva não.

Existem certas palavras reservadas que tem um significado especial no montador (assembler)
e não é permitido o seu uso como label. Estas incluem mnemonic tais como inc e EQU.

Os campos nas declarações devem ser separados pelo menos por um espaço.

Alocação de Dados

Caro(a) estudante, nas linguagens de alto nível, a alocação de espaços de armazenamento para
as variáveis é feita indirectamente pela especificação do tipo de dado de cada variável usada
no programa.

Na linguagem de programação assembly a alocação de espaço de armazenamento é feita pela


definição da directiva do montador.

A definição da directiva pode ser feita para reservar ou inicializar um ou mais bytes. O
formato geral de declaração de alocação de armazenamento para um dado inicializado é:

6
[ nome-variável ] definição-directiva valor-inicial [,valor-inicial],· · ·

Os parênteses quadrados indicam itens opcionais. O nome da variável é usada para identificar
o espaço de armazenamento alocado.

A definição da directiva toma uma das cinco formas seguintes:

DB Define Byte ; aloca 1 byte


DW Define Word ; aloca 2 bytes
DD Define Doubleword ; aloca 4 bytes
DQ Define Quadword ; aloca 8 bytes
DT Define Ten Bytes ; aloca 10 bytes

Exemplos:

Sorted DB ´y´

Esta declaração aloca um (1) byte de armazenamento e inicializa-o para y. O programa em


linguagem assembly pode referir-se a esta alocação de carácter pelo seu nome sorted.

Também pode ser usado números para inicializar.

Sorted DB 79H

Ou

Sorted DB 111001B

É equivalente a:

Sorted DB ´y´

É importante notar que o valor ASCII de y é 79H.


A declaração de definição do dado seguinte aloca dois bytes de armazenamento e inicializa-o
para 25159.

Sorted DW 25159

O valor decimal 25159 é automaticamente convertido para o seu equivalente binário (16-bits)
que é 6247H.

Limite de Operandos Numéricos

Caro(a) estudante, o operando numérico de uma definição de directiva pode tomar ambos
números com sinal ou sem sinal. O limite válido depende do número de bytes alocados como
mostra a tabela 1.2.1. .

Directiva Limite válido


DB -128 a 255(isto é, 27 a 28-1)

7
DW -32,768 a 65,535 (isto é, 215 a 216-1)
DD -2,147,483,648 a 4,294,967,295(isto é, 231 a 232-1)
DQ 263 a 264-1)
Tabela 1.2.1. . Limites de operandos numéricos.

Dados não Inicializados

Para reservar dados não inicializados utiliza-se o RESB, RESW e assim por diante. Cada
reserva de directiva toma um operando singular que especifica o número de unidades de
espaços (bytes, palavras, ...) a ser reservado.

Existe uma reserva de directiva para cada definição de directiva, como segue:

RESB Reserve a Byte


RESW Reserve a Word
RESD Reserve a Doubleword
RESQ Reserve a Quadword
REST Reserve Ten Bytes

Exemplos:

response RESB 1
buffer RESW 100
total RESD 1

A primeira declaração reserva um byte enquanto que a segunda reserve um espaço para uma
matriz de 100 palavras. A última declaração reserva um espaço para uma palavra dupla.

Definições Múltiplas

Os programas em linguagem assembly tipicamente contém varias declarações de definição de


dados.

Exemplo de um fragmento de um programa em linguagem assembly:

sort DB ´y´ ; ASCII of y = 79H


value DW 25159 ; 25159D = 6247H
total DD 542803535 ; 542803535D = 205A864FH

As definições de dados múltiplos podem ser abreviadas.

Exemplo de uma sequência de oito directivas DB :

message DB ´W´
DB ´E´
DB ´L´
DB ´C´
DB ´O´
DB ´M´
DB ´E´
DB ´!´

8
Pode ser abreviado para:

message DB ’W’,’E’,’L’,’C’,’O’,’M’,’E’,’!’

ou para:

message DB ’WELCOME!’

Abreviaturas similares podem ser usadas com outras definições de directivas.

Exemplo:

A matriz de tamanho 8 pode ser definida e inicializada para zero com:

marks DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
DW 0

Pode ser abreviada como:

marks DW 0, 0, 0, 0, 0, 0, 0, 0

A inicialização de valores de definição de directivas também podem ser expressões como as


que se apresentam a seguir:

Exemplo:

max_marks DW 7*25

Esta declaração é equivalente a:

max_marks DW 175

Atenção caro(a) estudante, não é preferido (não é boa prática) a utilização de expressões para
especificar valores iniciais porque elas afectam a performance do programa. Contudo, existem
certas situações em que a sua utilização ajuda a clarificar o código. No exemplo anterior, se
max_marks representa a soma de sete transferências onde cada transferência é de 25 marks, é
preferível utilizar a expressão 7*25 do que 175.

Inicializações Múltiplas

Caro(a) estudante, nos exemplos anteriores, se o tamanho da classe fosse 90, seria
inconveniente definir a matriz como descrito. A directiva TIMES permite inicializações
múltiplas para o mesmo valor. Usando o TIMES, a matriz pode ser definida como:

9
marks TIMES 8 DW 0

A directiva TIMES é útil na definição de matrizes e tabelas.

Tabela Símbolo

Quando alocamos um espaço de armazenamento usando uma directiva de definição de dados,


usualmente associa-se um nome simbólico para referi-la. Durante o processo assembly o
montador assina um valor de compensação para cada nome simbólico.

Exemplo:

.DATA
value DW 0
sum DD 0
marks TIMES 10 DW 0
message DB ’The grade is:’,0
char1 DB ?

O montador assina espaços de memória contíguos para as variáveis. O montador também


utiliza a mesma ordenação de variáveis que está presente no código fonte. Encontrado o valor
de compensação de uma variável é uma assunto simples de contagem do número de bytes
alocados a todas variáveis precedentes. No exemplo anterior, o valor de compensação para
marks é 6 porque value e sum são alocados 2 e 4 bytes respectivamente. A tabela símbolo
para o segmento de dado é mostrado a seguir, tabela 1.2.2:
Nome Compensação
Value 0
Sum 2
Marks 6
Message 26
charl 40
Tabela 1.2.2 Tabela símbolo.

1.2.2. Operandos

Caro(a) estudante, os programas em linguagem assembly podem consistir de duas partes


lógicas:

 Dados;

 Código.

Muitas instruções na linguagem assembly requerem operandos. Existem muitas maneiras de


especificar a localização dos operandos. Estas são chamadas de modo de endereçamento.

O operando requerido por uma instrução poderá estar em qualquer um dos locais seguintes:

 No registador interno do processador;

 Na instrução;

10
 Na memória principal (usualmente no segmento de dados);

 Numa porta de E/S.

11
Experimentação activa (1)
(1)

Caro estudante!
Depois de tudo o que aqui ficou dito é momento de se certificar se entendeu a matéria sobre,
respondendo as questões que se seguem.

1. Quais são as vantagens e desvantagem da programação em linguagem de programação


assembly?

2. Escreva uma instrução executável em linguagem de programação assembly que incrementa


uma unidade a variável de nome total .

3. escreva uma declaração em linguagem de programação assembly para alocar espaço de


armazenamento de 2 byte a variável de nome valor e inicialize a variável para 90941.

4. Qual é a quantidade de espaço de armazenamento reservado para cada uma das seguintes
declarações? Indique também o dado inicializado em cada declaração.

a) tabela TIMES 100 DW -1


b) contar DW 40000
c) valor DW -2300

12
1.2.3. Modos de Endereçamento

a) Modo de Endereçamento de Registrador

Caro(a) estudante, neste modo de endereçamento o registrador interno do processador contem


o dado a ser manipulado pela instrução.

Exemplo:

mov EAX, EBX

A instrução neste exemplo requer dois operandos e os dois estão nos registradores do
processador.

A sintaxe da instrução mov é:

mov destino,origem

A instrução mov copia os conteúdos da origem (fonte) para o destino. O conteúdo da origem
não é destruído.

A instrução no exemplo em consideração copia o conteúdo do registrador EBX para o


registrador EAX. Note que o conteúdo original do EAX é perdido.

O modo de endereçamento de registradores é um caminho mais eficiente para especificar


dados porque os dados estão dentro do processador e, contudo não é necessário nenhum
acesso a memória.

b) Modo de Endereçamento Imediato

Neste modo de endereçamento, os dados são especificados como parte da instrução, como
resultado, mesmo que os dados estejam na memória, este é localizado no segmento do código,
não no segmento de dados. Este modo de endereçamento é tipicamente usado nas instruções
que requerem pelo menos a manipulação de dois dados. Neste modo pode ser somente
especificado o operando de origem. Em adição, o dado imediato é sempre uma constante dada
directamente ou por via da directiva EQU.

Exemplo:

mov AL,75

Neste exemplo o operando de origem 75 é especificado no modo de endereçamento imediato


e o operando de destino é especificado no modo de endereçamento de registrador. Esta
instrução está no modo de endereçamento misto.

c) Modo de Endereçamento Directo

Caro(a) estudante, os operandos especificados no modo de endereçamento de memória


requerem o acesso a memória principal, usualmente ao segmento de dados. Como resultado
eles tendem a ser mais lentos do que os modos de endereçamento anteriores.

13
Para localizar dados no segmento de dados é necessário dois componentes:

 O endereço de início do segmento;

 O valor de compensação dentro do segmento.

O endereço de inicio do segmento é tipicamente encontrado no registrador DS, mais vários


modos de endereçamento de memória diferem na maneira como o valor de compensação é
especificado. O valor de compensação é normalmente chamado de endereço efectivo.

No modo de endereçamento directo, o valor de compensação é especificado directamente


como parte da instrução. No programa em linguagem assembly, este valor é usualmente
indicado pelo nome da variável do dado. O montador irá traduzir este nome no seu valor de
compensação associado durante o processo assembly. Para facilitar esta tradução, o montador
mantêm a tabela símbolo.

Este modo de endereçamento é o mais simples de todos modos de endereçamento de


memória. Uma restrição associada aos modos de endereçamento de memória é que estes
podem ser usados para especificar apenas um operando. Os exemplos que se seguem
assumem as declarações para a definição de dados no programa.

Exemplo:

response DB ´Y´ ; aloca um byte, inicializa para Y


table1 TIMES 20 DD 0 ; aloca 80 bytes, inicializa para 0
name1 DB ´Jim Ray´ ; 7 bytes são inicializados para Jim Ray

Exemplos da utilização da instrução mov:

mov AL, [response] ; copia Y para o registrador AL


mov [response], ´N´ ; N é escrito em response
mov [name1], ´K´ ; escreve K como primeiro carácter de name1
mov [table1], 56 ; 56 é escrito no primeiro elemento

No NASM, Para copiar o endereço da tabela1 para registo EBX, escreve-se da seguinte
maneira:
mov EBX,table1

Se deseja-se o valor, deve-se usar [ ] como nos exemplos anteriores. Por exemplo, a
declaração:

Por exemplo, a declaração no exemplo seguinte copia o primeiro elemento da tabela1 em


EBX. Esta notação é diferente da notação TASM / MASM.

mov EBX,[table1]

d) Modo de Endereçamento Indirecto

14
Neste modo de endereçamento, a compensação ou endereço efectivo dos dados está em um
dos registos geral. Por este motivo, este modo de endereçamento é por vezes referido como
modo de endereçamento indirecto de registo.

O modo de endereçamento indirecto não é requerido para as variáveis com apenas um


único elemento (por exemplo, response) mas para as variáveis como tabela1 contendo
vários elementos.

O endereço de início da estrutura dos dados podem ser carregados em, digamos, no registo
EBX e em seguida o registo EBX funciona como um ponteiro para um elemento em tabela1.
Ao manipular o conteúdo do registo EBX, pode acessar diversos elementos da tabela1. O
código a seguir atribui 100 para o primeiro elemento e 99 para o segundo elemento da tabela1.
Note que a EBX é incrementado por 4 porque cada elemento da tabela1 requer quatro bytes.

mov EBX,table1 ; copia o endereço da table1 para EBX


mov [EBX],100 ; table1[0] = 100
add EBX,4 ; EBX = EBX + 4
mov [EBX],99 ; table1[1] = 99

1.2.4. Instruções de Linguagem de Programação Assembly

a) Instruções de Transferência de Dados

Caro(a) estudante, vamos agora discutir algumas das instruções de transferência de dados
suportados pelo processador Pentium.

I) Instrução MOV

Já introduzimos a instrução mov, que exige dois operandos e tem a sintaxe seguinte:

mov destino,origem

Os dados são copiados da origem para o destino e o operando de origem permanece


inalterado. Ambos os operandos devem ser do mesmo tamanho. A instrução mov pode tomar
uma das cinco formas seguintes:

mov registo,registo
mov registo, imediato
mov memória, imediato
mov registo, memória
mov memória,registo

Não há nenhuma instrução mov para transferir dados a partir da memória para a memória uma
vez que o processador Pentium não permite isso. No entanto, a transferência de dados de
memória para memória é possível com a utilização de instruções string.

Exemplos de declarações mov:

mov [response],BH

15
mov EDX,[table1]
mov [name1+4],’K’

II) Instruções INC e DEC

O processador Pentium oferece várias instruções simples para realizar operações aritméticas.
Essas instruções podem ser utilizadas quer para incrementar ou decrementar o operando por
um.

A instrução inc (INCrement) adiciona um ao seu operando e a instrução dec (DECrement)


subtrai um de seu operando. Ambas as instruções requerem um único operando. O operando
pode estar tanto no registo ou na memória.

O formato geral da instrução é:

inc destino
dec destino

O destino pode ser um operando de 8 bits, 16 bits ou 32 bits.

inc EBX ; incrementa registo de 32 bits


dec DL; decrementa registo de 8-bits

III) Instrução add

A instrução add pode ser usada para adicionar dois operandos de 8 bits, 16 bits ou 32 bits. A
sintaxe para a instrução add é:

add destino,origem

IV) Instruções SUB e CMP

A instrução sub (SUBtract) pode ser usada para subtrair dois números 8 bits, 16 bits ou 32
bits. A sintaxe para a instrução sub é:

sub distino,origem

O operando de origem é subtraído do operando de destino e o resultado é colocado no destino.

destino = destino − origem

A instrução cmp (CoMPare) é usada para comparar dois operandos (equal, not equal )

A instrução cmp realiza a mesma operação que a instrução sub, com a excepção que o
resultado da subtracção não é guardado.

b) Execução Condicional

16
I) Salto Incondicional

Caro(a) estudante, a instrução jmp de salto incondicional, como o próprio nome indica, diz ao
processador que a próxima instrução a ser executada é localizada no rótulo que é dado como
parte da instrução.

A instrução de salto tem a forma seguinte:

Jmp label

Onde label identifica a próxima instrução a ser executada.

II) Salto Condicional

Na instrução de salto condicional, a execução de programa é transferido para a instrução alvo


apenas se a condição especificada seja satisfeita. O formato geral é

j<cond> label

Onde <cond> identifica a condição em que a instrução alvo no rótulo deve ser executada.
Normalmente, a condição a ser testada é o resultado da última operação aritmética ou lógica.

c) Instruções Lógicas

O conjunto de instruções do processador Pentium fornecem várias instruções lógicas


incluindo and, or, xor, e not. A sintaxe destas instruções são:

and destino,origem
or destino,origem
xor destino,origem
not destino

1.2.5. Definição de Constantes

Caro(a) estudante, o montador NASM providencia várias directivas para definir constantes.
Conceitualização
a) Directiva EQU
Directivas do montador
A sintaxe da directiva EQU é seguinte: são comandos que são
compreendidos pelo
name EQU expressão montador e não
correspondem a instrução
Esta sintaxe atribui o resultado da expressão ao nome. maquina actual.

Exemplo:

NUM_OF_STUDENTS EQU 90

b) Directiva %assign

17
Esta directiva pode ser usada para definir constantes numéricas como a directiva EQU. No
entanto, %assign permite a redefinição.

Exemplo:
%assign i j+1

Mas tarde o código pode ser redefinido como o seguinte:

i j+2

A directiva %assign é sensível a maiúsculas e minúsculas.

1.2.6. Exemplos de Programas em Linguagem Assembly

a) Programa Soma

O programa recebe um número (com máximo de 10 dígitos) e exibe a soma de cada um dos
algarismos do número de entrada. Por exemplo, se o número de entrada
é 45213, o programa exibe 4 + 5 + 2 + 1 + 3 = 15.

1: ;Add individual digits of a number ADDIGITS.ASM


2: ;
3: ; Objective: To find the sum of individual digits of
4: ; a given number. Shows character to binary
5: ; conversion of digits.
6: ; Input: Requests a number from keyboard.
7: ; Output: Prints the sum of the individual digits.
8: %include "io.mac"
9:
10: .DATA
11: number_prompt db "Please type a number (<11 digits): ",0
12: out_msg db "The sum of individual digits is: ",0
13:
14: .UDATA
15: number resb 11
16:
17: .CODE
18: .STARTUP
19: PutStr number_prompt ; request an input number
20: GetStr number,11 ; read input number as a string
21:
22: mov EBX,number ; EBX = address of number
23: sub DX,DX ; DX = 0 -- DL keeps the sum
24: repeat_add:
25: mov AL,[EBX] ; move the digit to AL
26: cmp AL,0 ; if it is the NULL character
27: je done ; sum is done
28: and AL,0FH ; mask off the upper 4 bits
29: add DL,AL ; add the digit to sum
30: inc EBX ; update EBX to point to next digit
31: jmp repeat_add
32: done:

18
33: PutStr out_msg
34: PutInt DX ; write sum
35: nwln
36: .EXIT

b) Programa de Conversão de letras minúsculas para maiúsculas

Este programa demonstra como o endereçamento indirecto pode ser usado para acessar
elementos de uma matriz. Também ilustra como a manipulação de caracteres pode ser usado
para converter letras minúsculas para maiúsculas.

1: ;Uppercase conversion of characters TOUPPER.ASM


2: ;
3: ; Objective: To convert lowercase letters to
4: ; corresponding uppercase letters.
5: ; Input: Requests a character string from keyboard.
6: ; Output: Prints the input string in uppercase.
7: %include "io.mac"
8:
9: .DATA
10: name_prompt db "Please type your name: ",0
11: out_msg db "Your name in capitals is: ",0
12:
13: .UDATA
14: in_name resb 31
15:
16: .CODE
17: .STARTUP
18: PutStr name_prompt ; request character string
19: GetStr in_name,31 ; read input character string
20:
21: PutStr out_msg
22: mov EBX,in_name ; EBX = pointer to in_name
23: process_char:
24: mov AL,[EBX] ; move the char. to AL
25: cmp AL,0 ; if it is the NULL character
26: je done ; conversion done
27: cmp AL,’a’ ; if (char < ’a’)
28: jl not_lower_case ; not a lowercase letter
29: cmp AL,’z’ ; if (char > ’z’)
30: jg not_lower_case ; not a lowercase letter
31: lower_case:
32: add AL,’A’-’a’ ; convert to uppercase
33: not_lower_case:
34: PutCh AL ; write the character
35: inc EBX ; EBX points to the next char.
36: jmp process_char ; go back to process next char.
37: done:
38: nwln
39: .EXIT

19
20
Experimentação activa (2)
(1)

Caro estudante!
Depois de tudo o que aqui ficou dito é momento de se certificar se entendeu a matéria,
respondendo as questões que se seguem.

1. Considere a instrução:
a) add AX, DX

Antes da soma tinha:


Origem: DX=AB62H
Destino: AX=1052H

Qual será o destino AX depois da soma?

b) sub BL, CH

Antes da subtracção tinha:


Origem: CH=27H
Destino: BL=76H

Qual será o destino AX depois da subtracção?

2. Explique cada linha do seguinte programa:

.DATA
contar DW 0
valor DB 25

.CODE
inc [contar]
dec [valor]
mov EBX,contar
inc WORD [EBX]
mov ESI,valor
dec BYTE [ESI]

3. Escreva um trecho de programa em linguagem de programação assembly mostrando a


utilização do salto incondicional.

21
22
Resumo

Caro(a) estudante, ao finalizar esta unidade didáctica terá tido o entendimento que a
linguagem de programação assembly é um linguagem de baixo nível. As suas instruções são
nativas ao processador utilizado no sistema. O assembler é um programa que gera instruções
de código maquina a partir do programa de código fonte escrito em linguagem assembly. O
NASM e o MASM são assemblers que podem ser utilizados para os processadores Pentium.
A linguagem assembly permite um controle total sobre o sistema de hardware.

23
Exercícios de Auto – Avaliação

Caro(a) estudante, terminada a unidade didáctica 4, chegou o momento de fazer a sua


avaliação sobre a aprendizagem adquirida, respondendo dos seguintes questões:

1. Nesta unidade didáctica vimos quatro modos de endereçamento. Que modo de


endereçamento e mais eficiente? Explique porque.

2. Qual é a diferença entre o modo de endereçamento directo e o modo de endereçamento


indirecto?

3. Qual é a diferença entre uma instrução de salto condicional e uma instrução de salto
incondicional ?

4. Utilize as definições de dados para responder as questões seguintes:


.DATA
num1 DW 100
num2 DB 225
char1 DB ’Y’
num3 DD 0

Identifique se as instruções seguintes são legais ou ilegais. Explique a razão para a


instrução da instrução ilegal.
a) mov EAX,EBX
b) mov EAX,num2
c) mov BL,num1
d) mov DH,char1
e) mov char1,num2
f) mov IP,num1
g) add 75,EAX
h) cmp 75,EAX
i) sub char1,’A’
j) xchg AL,num2
k) xchg AL,23
l) inc num3

5. Assuma que os registradores foram inicializados como segue:


EAX = 12345D, EBX = 9528D
ECX = -1275D, EDX = -3001D

Qual é o valor o operando de destino, em hexadecimal, depois da execução das seguintes


instruções:
a) add EAX,EBX
b) sub AX,CX
c) and EAX,EDX
d) or BX,AX
e) not EDX
f) shl BX,2
g) shl EAX,CL

24
h) shr BX,2
i) shr EAX,CL
j) sub CX,BX
k) add ECX,EDX
l) sub DX,CX

6. Qual é a diferença entre um compilador e um montador ?

7. escreva um programa em linguagem assembly que converte um valor do código ASCII


para o seu binário equivalente. O programa lê o código ASCII a partir do teclado e mostra
o seu equivalente binário.

25
Bibliografia

DANDAMUDI, Sivarama P. (2004). Introduction to Assembly Language Programming: For


Pentium and RISC Processors (Texts in Computer Science). 2nd edition. Springer. New
York.

UNTEMANN, Jeff. (2000). Assembly Language Step-by-Step: Programming with DOS and
Linux, Second Edition, John Wiley & Sons. New York.

SAWAYA, Márcia Regina. (1999). Dicionário de Informática e Internet: Inglês Português.


Nobel. São Paulo.

26
Glossário

ASCII – American National Standard Code for Information


Interchange (ASCII). Código Nacional Americano de
Padrões para Intercâmbio de Informação.
Assembler – Montador.
Código fonte – Instruções de programa escritas numa linguagem de alto
nível ou linguagem Assembly que podem ser lidas por
uma pessoa. Tradutor para código de objecto.
Bit – Dígito binário.
Byte – Conjunto de 8 bits.
Código objecto – Saída do montador que se encontra em estado de ser
processado pela máquina.
Instruções de máquina – Instrução que uma máquina é capaz de reconhecer
e executar.
Label – Rótulo.
Message – Mensagem.
Mnemonic – Um termo geralmente abreviado que traduz uma palavra
ou conjunto de palavras que significam uma instrução
para a máquina. O mnemónico auxilia na memorização
das instruções. Normalmente, o mnemônico é formado de
letra(s) que indicam a(s) palavra(s) ou expressão(ões) que
se pretende representar.
Opcode – Código de operação.
Palavra – Um conjunto ordenado de caracteres que ocupa uma
localização no armazenamento e é tratado pelos circuitos
do computador (em operações de transferência aritmética
etc.) como uma unidade.
A palavra é tratada tanto pela unidade de controle como
pela unidade aritmética como uma unidade. O
comprimento da palavra pode ser fixo ou variável,
dependendo do computador.
Repeat – Repitir.
Response – Resposta.
Result – Resultdo.
Sum – Soma.
UCP – Unidade Central de Processamento(UCP).
Value – Valor.

27

Você também pode gostar