A maior rede de estudos do Brasil

Grátis
52 pág.
LINGUAGEM ASSEMBLY

Pré-visualização | Página 2 de 11

palavra de dois ou quatro bytes é o endereço do byte menos significativo. Em outras 
palavras, se uma variável tem comprimento igual a n bytes, e está armazenadas 
nos endereços A,..., A+n-1 , o endereço desta variável será A. 
 
 endereço conteúdo endereço conteúdo 
 A A 
 A+1 A+1 
 
 “little endien” “big endien” 
 
Figura 3: Convenções “little endien” e “big endien”. 
 
 
3.2 Comandos 
 Existem dois tipos de comandos na linguagem Assembly-86 (ASM86): 
instruções e diretivas. 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 5 
 As instruções correspondem a códigos binários que são as instruções de 
máquina executadas pelo microprocessador. Enquanto as instruções assembler são 
simbólicas, as chamadas instruções de máquinas são binárias. A razão para usar 
instruções Assembly ao invés de instruções binárias é evidente. É muito mais fácil 
para o programador desenvolver de dar manutenção num programa escrito na 
forma de símbolos que sugerem a função de cada instrução do que num programa 
constituído por uma cadeia de 0’s e 1’s. O papel do programa montador (Assembler) 
é traduzir as instruções Assemby para as instruções de máquina. 
 Ao contrário do que ocorre com as instruções, o montador não gera para as 
diretivas nenhuma instrução de máquina. As diretivas são informações fornecidas 
pelo programador que auxiliam o montador no processo de montagem. 
 As instruções podem ter até cinco campos: 
 
((rótulo :) (prefixo) mnemônico (operando(s)) (;comentários)) 
 
onde os parênteses denotam que se trata de campos opcionais (os parênteses não 
são escritos pelo programador). 
 O campo rótulo fornece um nome à posição de memória que contém a 
instrução, de tal maneira que se pode fazer referência a ela simbolicamente numa 
instrução de desvio (p. ex.: JMP) em algum outro ponto do programa. 
 Um prefixo leva o montador a gerar um byte de prefixo que modifica de 
alguma forma a execução normal da instrução. O uso de tais prefixos será melhor 
esclarecido mais adiante neste texto. 
 O mnemônico identifica o tipo de instrução (p. e. MOV para movimentação, 
ADD para adição, etc.) que deve ser gerada.. 
 Uma instrução pode ter zero, um ou dois operandos separados por uma 
vírgula. 
 Os comentários não afetam a execução de um programa, mas constituem 
meramente um recurso que facilita a compreensão da lógica implementada no 
programa. É muitíssimo útil durante o desenvolvimento ou posteriormente na 
manutenção do programa. Recomenda-se enfaticamente que o aluno utilize 
extensivamente comentários em seus programas. 
 As diretivas podem ter até quatro campos: 
 
(nome) mnemônico (operando(s)) (;comentários) 
 
 Algumas diretivas exigem um nome, enquanto outras proíbem um nome. O 
montador reconhece a diretiva a partir do mnemônico escrito no segundo 
campo.Todos os eventuais operandos são escritos em seguida. 
 
3.2.1 Algumas Diretivas 
 
 A relação de diretivas apresentada nesta seção é apenas adequada aos 
objetivos deste curso sem ser completa. Outras diretivas serão apresentadas nas 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 6 
aulas de laboratório. 
 
3.2.1.1 Constantes 
 
 Constantes numéricas podem ser apresentadas em binário, decimal, octal e 
hexadecimal. A base utilizada deve ser indicada pelo programador colocando à 
esquerda do numeral, respectivamente as letras B, D, Q e H. Quando nenhuma 
letra for indicada o montador assume que se trata da base decimal. 
 Muitos montadores exigem que o primeiro dígito de um número em base 
hexadecimal seja um numeral. Na prática isso significa que os números 
hexadecimais que iniciam com A, B, C, D, E ou F, devem ser digitados tendo um 0 
(zero) na frente. 
 Todas as constantes devem ser inteiras representáveis em 16 bits, incluindo 
sinal. Números negativos são representados em complemento de dois. 
 Caracteres são apresentados entre apóstrofes e podem aparecer em cadeias 
de até 255 caracteres, quando utilizadas para iniciar posições de memória. Quando 
utilizadas como operandos imediatos, caracteres podem ter no máximo dois bytes. 
A diretiva EQU é utilizada para associar um símbolo a uma constante. 
 O uso de constantes é ilustrado a seguir. 
 
MOV STRING[SI],’A ; caracter 
MOV STRING[SI], 41h ; equivalente em hexadecimal 
ADD AX, 0C4H ; constantes hexa iniciam com numeral 
OCTAL_8 EQU 10Q ; 8 em octal 
OCTAL_9 EQU 11Q ; binário 
UMS EQU 11111111B ; 9 em octal 
MENOS_5 EQU -5 ; decimal (default) 
MENOS_8 EQU -6D 
 ; ‘D’ indica que é decimal 
 
 
3.2.1.2 Definição de Dados 
 A maioria dos programas iniciam difinindo as variáveis com que eles vão 
trabalhar. Três diretivas, DB, DW e DD são usadas para alocar e dar nome a 
posições de memória. São usadas para definir variáveis em três unidades: DB 
significa “define byte”, DW significa “define word” e DD significa “define doubleword”. 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 7 
 Os operandos destas diretivas indicam ao montador quantas unidades de 
armazenamento alocar - respectivamente 1, 2 e 4 bytes - e qual o valor inicial, se 
houver. Os exemplos abaixo esclarecem como utilizar estas diretivas: 
ALFA DB ? ; não inicializada 
BETA DW ? ; não inicializada 
GAMA DD ? ; não inicializada 
UPSILON DW 5 ; constante 05H 
IOTA DB ‘HELLO’ ; contém 48 45 4C 4C 4F H 
MU DD 100 DUP 0 ; aloca e inicializa 100 bytes com 0 (zero) 
 Para cada variável num programa ASM86, o montador registra a informação 
do tipo, ou seja, do número de bytes alocados a ela. Quando uma variável é 
referenciada no programa, o montador utiliza esta informação para determinar a 
forma da instrução de máquina que deve ser gerada. 
 Se o uso da variável conflita com o seu atributo, o montador gera uma 
mensagem de erro. Há casos em que o programador deve indicar explicitamente ao 
montador qual é o tipo do operando. Por exemplo, a instrução: 
MOV [BX],5 
escreve o valor 5 na posição de memória, cujo endereço está definido pelo 
conteúdo do registrador BX. Esta instrução não identifica o tipo da variável, se é um 
byte, uma palavra ou uma palavra dupla. Note, que dependendo do tipo da variável, 
a execução desta instrução envolverá a modificação de 1, 2 ou 4 bytes da memória. 
A informação do tipo de variável pode ser fornecido através das diretivas: byte ptr, 
word ptr, dword ptr, como nos exemplos a seguir 
MOV word ptr [BX],5 ; indica que é palavra 
SUB byte ptr [BX][SI],1 ; indica que é byte 
ANA BETA,32H ; implícito que é palavra 
CMP byte ptr ALFA[SI], 10 ; indica que é byte (redundante) 
DEC byte ptr GAMA ; indica que é byte apesar da definição 
 
 A primeira e segunda linhas do exemplo esclarecem que o primeiro operando 
da instrução é um byte. Na terceira linha não é necessário utilizar estas diretivas, 
pois o montador assume o tipo indicado quando da definição da variável, neste 
caso, uma palavra (vide exemplo anterior). Na quarta linha o uso da diretiva é 
redundante e, portanto desnecessário, por que a variável já havia sido definida (vide 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 8 
exemplo anterior), como byte. A última linha tem um aspecto interessante. Embora a 
variável GAMA tenha sido definida como palavra dupla, a instrução decrementa 
apenas o byte apontado pelo endereço GAMA, sem alterar os demais 3 bytes da 
palavra dupla. 
 A diretiva TYPE identifica a unidade de alocação