A maior rede de estudos do Brasil

Grátis
52 pág.
LINGUAGEM ASSEMBLY

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

de memória (1 = byte; 2 = 
palavra, 4 = palavra dupla). 
 A linguagem provê duas diretivas: LENGHT e SIZE, que podem ser escrito 
nas instruções com informações de atributo. LENGHT faz o montador retornar com 
o número de unidades de armazenamento (bytes, palavras ou palavras duplas) 
ocupadas por um vetor. SIZE leva o montador a retornar o número de bytes 
ocupados pela variável ou vetor. 
Estas diretivas permitem que se escrevam seqüências de instruções que não 
precisam ser mudadas (somente montadas novamente), se os atributos das 
variáveis mudarem, por exemplo, um vetor de bytes muda para um vetor de 
palavras. 
O exemplo a seguir ilustra uma aplicação típica destas diretivas. 
 
; soma do conteúdo de uma tabela em AX 
; observe que a mesma instrução funciona para 
; TABELA DB 50 DUP(?) 
; TABELA DD 50 DUP(?) 
 SUB AX,AX ; zera contador 
 MOV CX, LENGHT TABELA ; número de iterações 
 MOV SI, SIZE TABELA ; aponta p/ o fim do vetor 
SOMA_OUTRO: 
 SUB SI, TYPE TABELA ; pega elemento anterior 
 ADD AX, TABELA [SI] ; soma um elemento 
; AX contém a soma 
 
 Existe também a diretiva OFFSET. Basta por enquanto considerar que esta 
diretiva retorna o próprio endereço da variável referenciada no programa logo em 
seguida a esta diretiva. 
 Do mesmo modo, algumas outras diretivas relacionadas com o mecanismo de 
segmentação do processador, não serão apresentadas aqui. Embora todo programa 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 9 
deva contê-las para que o montador funcione corretamente, este texto limita-se a 
mencioná-las sem discutir em detalhes o seu papel. 
 
3.2.1.3 Início e Final de Subrotinas 
 Em ASM86 uma subrotina (rotina) é ativada através da instrução CALL, como 
se verá adiante. O código da subrotina termina necessariamente com a instrução 
RET, que desvia o fluxo controle para a instrução seguinte ao CALL. As instruções 
de uma rotina são emolduradas pelas diretivas PROC e ENDP, como no exemplo a 
seguir: 
HISTOGRAMA PROC FAR 
 ; Esta rotina assume que o parâmetro de entrada está em AL, 
 ; e incrementa um contador numa tabela de frequência, 
 ; baseada no valor do parâmetro de entrada. 
 XOR AH,AH ; zera o byte mais significativo de AX 
 MOV SI,AX ; índice para a tabela 
 INC FREQ[SI] ; incrementa o contador 
 RET 
HISTOGRAMA ENDP 
 O uso da diretiva NEAR/FAR será esclarecido posteriormente. 
 
3.3 Modos de Endereçamento 
 O processador 8086 dispõe de várias formas de referenciar os operandos das 
instruções. Os operandos podem estar em registradores, dentro da própria 
instrução, na memória ou em portas de E/S. Além disso, o endereço de memória e 
de portas de E/S, podem ser calculados de várias maneiras. Estes modos de 
endereçamento conferem flexibilidade ao conjunto de instruções do processador. 
Esta seção apresenta uma breve descrição dos modos de endereçamento 
disponíveis neste processador. 
 
3.3.1 Registrador 
 Neste modo de endereçamento, o operando está contido num dos 
registradores internos da máquina. Estas instruções são muito compactas pois o 
“endereço” do registrador está codificado em “uns poucos bits”. O acesso a este 
operando é realizado inteiramente dentro do próprio processador, e não envolve 
acesso externo à memória. Exemplos: 
 
 MOV AL,BL 
 SUB CX,DX 
 DEC CL 
 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 10 
3.3.2 Imediato 
 O operando está contido na própria instrução. Este operando pode ter 8 ou 16 
bits. Exemplos: 
 SUB CL,2 
 ADD DX,MENOS_5 
 Note nos exemplos que as instruções utilizam também o modo de 
endereçamento registrador. De um modo geral, uma mesma instrução pode usar 
modos de endereçamento diferentes para cada um dos seus operandos. No caso 
deste processador cada instrução pode ter no máximo dois operandos. Cada 
operando pode ser referenciado usando um modo de endereçamento distinto. 
 Quando o operando está na memória, o processador calcula o endereço da 
posição correspondente das formas que serão explicitadas a seguir. Este endereço 
é chamado de endereço efetivo (effective address - EA). 
 Na realidade o endereço efetivo não é propriamente o endereço do operando, 
mas a distância entre o endereço da posição de memória e um certo endereço de 
referência chamado endereço de início de segmento. Por enquanto convém admitir 
que o endereço efetivo é o próprio endereço do operando. Maiores esclarecimentos 
serão dados em seções posteriores.1 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Figura 4: Ilustração do modo de endereçamento direto 
 
Nos modos de endereçamento que serão apresentados a seguir, o endereço 
efetivo será dado pela soma de até três componentes: base (fornecida por um dos 
registradores de base - BX ou BP), índice (fornecido pelo conteúdo de um dos 
registradores de índice - SI ou DI) e um deslocamento (contido na própria instrução). 
O que caracteriza cada um dos modos de endereçamento a seguir é qual ou quais 
destes três componentes estarão presentes na soma. 
 
1 Na realidade o endereço efetivo não é propriamente o endereço do operando, mas a distância 
deste a um certo endereço de referência, chamado endereço de início de segmento. 
opcode mod reg r/m camento desloc
Endereço 
Efetivo 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 11 
3.3.3 Direto 
 Trata-se do modo de endereçamento de memória mais simples. Não envolve 
nenhum registrador. O endereço efetivo é tomado diretamente do deslocamento 
contido na própria instrução. Este modo de endereçamento é tipicamente utilizado 
para referenciar escalares. A Figura 4 ilustra o formato destas instruções. 
 Alguns exemplos: 
 MOV AX,[8000H] 
 SUB CX,BETA 
 DEC byte ptr GAMA 
3.3.4 Registrador Indireto 
 O endereço do operando pode ser tirado de um dos registradores de base 
(BX ou BP) ou índice (SI ou DI), como mostra a Figura 5. Qual destes registradores 
é usado está definido num dos campos da instrução. 
 
 
 
 
 
 
 
 
 
 
 
 
 
Figura 5: Ilustração do modo de endereçamento registrador indireto. 
 
 Somente um registrador de base ou de índice pode estar presente neste 
modo de endereçamento. Os registradores de 8 bits, assim como AX, DX, CX, SP, 
além dos registradores de segmento (CS, DS, ES, SS) são proibidos aqui, a menos 
de raras exceções. Exemplos: 
 MOV AL,[BX] 
 SUB [SI],DX 
 Convém, contudo, notar que qualquer registrador de uso geral pode ser 
utilizado neste modo de endereçamento nas instruções do tipo JMP e CALL. 
Exemplos destes casos são: 
 
 JMP [AX] 
 CALL [DX] 
opcode mod reg r/m
Endereço 
Efetivo 
BX ou BP
ou 
SI ou DI 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 12 
3.3.5 Relativo a uma Base 
 Neste modo de endereçamento, o endereço efetivo é dado pela soma de um 
deslocamento (definido na própria instrução) e pelo conteúdo de um registrador de 
base, mais especificamente, do registrador BX ou do registrador BP. 
 
 
 
 
 
 
 
 
 
 
 
Figura 6: Ilustração do modo de endereçamento com base. 
 
 Este modo de endereçamento é freqüentemente utilizado para 
referenciar estruturas que podem estar armazenadas em endereços diferentes na 
memória. Antes da instrução que referencia o dado propriamente dita normalmente 
se introduzem instruções que carregam no registrador de base o endereço inicial da 
estrutura. O elemento da estrutura é indicado pelo deslocamento. Cópias diferentes 
de