LINGUAGEM ASSEMBLY
52 pág.

LINGUAGEM ASSEMBLY


DisciplinaTecnologias Web3.425 materiais10.177 seguidores
Pré-visualização11 páginas
uma mesma estrutura podem ser referenciadas simplesmente mudando o 
conteúdo do registrador de base. 
Abaixo são dados alguns exemplos deste modo de endereçamento. 
 MOV AL,[BX+0B000H] 
 SUB CL,MU[BX] 
 ADD dword ptr [BP][1000H], 43H 
3.3.6 Indexado 
 No modo de endereçamento indexado o endereço efetivo é calculado a partir 
da soma de um deslocamento mais o conteúdo de um registrador de índice (SI ou 
DI, conforme definido no campo mod_reg_r/m), como mostra a Figura 7. Este modo 
de endereçamento é freqüentemente utilizado para referenciar elementos de um 
vetor: o deslocamento apontando para o início do vetor e o valor do registrador de 
índice selecionando um dos seus elementos. Como todos os elementos de um vetor 
têm o mesmo comprimento, uma aritmética simples com o registrador de índice 
selecionará qualquer elemento. 
opcode mod reg r/m camento desloc
Endereço 
Efetivo 
 
BX ou BP 
 +
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 13 
 
 
 
 
 
 
 
 
 
 
Figura 7: Ilustração do modo de endereçamento Indexado. 
 
 Abaixo são dados alguns exemplos deste modo de endereçamento. 
 MOV AL,[SI+0B000H] 
 SUB CL,MU[SI] 
 ADD word ptr [DI][1000H], 43H 
3.3.7 Indexado com Base 
 O modo de endereçamento indexado com base gera o endereço efetivo 
somando o conteúdo de um registrador de base (BP ou BX), o conteúdo de um 
registrador de índice (SI ou DI) e um deslocamento, como mostra a figura 8. É 
importante salientar aqui que neste modo de endereçamento está presente um 
registrador de base e um registrador de índice. Qualquer outra combinação de 
registradores é inválida. Este modo é freqüentemente utilizado para referenciar 
vetores localizados na pilha, como será discutido adiante. Novamente neste caso o 
campo mod_reg_r/m da instrução define quais os registradores participam do 
cálculo do endereço efetivo. 
 Abaixo são dados alguns exemplos deste modo de endereçamento. 
 MOV AL,[BX+SI+ 5H] 
 ADD [BP][DI][1000H], AX 
 
 
 
 
 
 
 
 
 
opcode mod reg r/m camento desloc
Endereço 
Efetivo 
 
SI ou DI 
 +
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 14 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Figura 8: Ilustração do modo de endereçamento indexado com base. 
 
3.4 Conjunto de Instruções do 8086/8088 
 A apresentação que se segue não contém todos os detalhes de cada instrução. 
Ela se propõe a ser um esquema a ser seguido em aula e ao mesmo tempo um 
resumo do assunto. 
 É importante ter em mente que todas estas instruções estão presentes no 
conjunto de instruções dos demais processadores da família 80X86, de tal sorte que o 
conhecimento aqui adquirido pode ser utilizado na programação de sistemas mais 
modernos. 
3.4.1 Convenções 
 Na apresentação a seguir adota-se a seguinte convenção: 
d - uma quantidade de 8 ou 16 bits. 
d8 - uma quantidade de 8 bits. 
d16 - uma quantidade de 16 bits. 
r, r1, r2 - um registrador de 8 ou 16 bits de uso geral. 
r8 - um registrador de 8 bits. 
r16 - um registrador de 16 bits. 
( ) - o conteúdo de um registrador, ou posição de memória, 
 dependendo do que estiver entre os parênteses. 
m - endereço de um byte ou uma palavra na memória 
opcode mod reg r/m camento desloc
Endereço 
Efet-ivo 
 
BX ou BP
 +
 
SI ou DI 
 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 15 
m8 - endereço de um byte na memória 
m16 - endereço de uma palavra de 16 bits. 
m32 - endereço de uma palavra dupla de 32 bits. 
AX/AL - o registrador AX ou AL, dependendo do operando envolvido ser 
 de 16 ou 8 bits. 
alvo - a definição de um endereço na área de código da memória. 
flags - os 16 bits do registrador de estado. 
r1:r2 - indica um valor formado pela composição do conteúdo de r1 e r2. 
 Esta composição pode se dar pela concatenação dos dois valores 
 (p. ex. DX:AX) ou pelo modo próprio do microprocessador formar 
 o endereço (p. ex. CS:DX). 
 
 As convenções utilizadas na descrição que se segue, acabará se tornando 
clara na medida em que as instruções forem sendo apresentadas. Para cada tipo de 
instrução aparece do lado esquerdo uma descrição sintática e uma breve descrição 
semântica da instrução. Ao centro, são dados alguns exemplos, e do lado esquerdo o 
número de ciclos de relógio consumidos na execução da instrução. 
 
3.4.2 Instruções de Transferência de Dados 
 MOV r1,r2 MOV AL,CH 2 
 MOV CX,BP 
MOV r,m MOV AX,TEMP_RESULT 10/8+EA 
 MOV CL,ARRAY[SI], 
MOV m,r MOV COUNT[DI],CX 10/9+EA 
 MOV [SI+1000],DX 
MOV r,d MOV AX,99 4 4 
 MOV SI,61CH 
MOV m,d MOV byte ptr [SI], 0FH 10+EA 
 MOV word ptr [BX+1234],57 
XCHG r1,r2 XCHG AX,BX 3/4 
 XCHG CL,CH 
XCHG m,r XCHG SEMAFORO,AX 17+EA 
 XCHG AL,[BX+2] 
XLAT XLAT 11 
(AL) \u2190 ((BX+AL)) 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 16 
LAHF LAHF 4 
 (AH7,6,4,2,0)\u2190 (SF,ZF,AF,PF,CF) 
SAHF SAHF 4 
(SF,ZF,AF,PF,CF) \u2190(AH7,6,4,2,0) 
3.4.3 Instruções de Manipulação de Cadeias de Caracteres (string) 
Cada uma das instruções deste grupo tem três formatos diferentes. Para o primeiro 
formato (terminado com um "S"), o montador entende que o string é de bytes ou de 
palavras. O segundo (terminado com um "SB") e terceiro (terminado com um "SW") 
indicam explicitamente que se trata respectivamente de um string de bytes e palavras. 
 
MOVS/MOVSB/MOVSW MOVSB 18 
 MOVSW 
 
CMPS/CMPSB/CMPSW CMPSB 22 
 CMPSW 
 
SCAS/SCASB/SCASW SCASB 15 
 SCASW 
 
LODS/LODSB/LODSW LODSB 12 
 LODSW 
 
STOS/STOSB/STOSW STOSB 11 
 STOSW 
 
REP REP MOVSB 9+17*rep 
REP REP LODSW 9+13*rep 
REP REP STOSW 9+10*rep 
REPZ/REPE REPZ CMPS 9+22*rep 
REPNZ/REPNE REPNZ SCAS 9+15*rep 
 Nas cinco últimas linhas da tabela contém prefixos usados para repetir a 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 17 
execução da instrução de manipulação de string escrita em seguida pelo número de 
vezes especificado em CX. Diante das instruções MOVS/MOVSB/MOVSW, 
LODS/LODSB/LODSW e STOS/STOSB/STOSW, pode-se usar o prefixo REP, que 
decrementa o registrador CX, sem afetar os flags, e repete a instrução de string, 
enquanto CX \u2260 0. Diante das instruções CMPS e SCAS, pode-se usar os prefixos 
REPZ(ou REPE) ou REPNZ(ou REPNE). REPZ decrementa CX, sem afetar os flags, 
e repete a instrução de string, enquanto CX \u2260 0 e ZF = 1. O prefixo REPNZ 
decrementa CX, sem afetar os flags, e provoca a repetição da instrução de string, 
enquanto CX \u2260 0 e ZF = 0. 
3.4.4 Instruções de Manipulação de Endereços 
LEA r16,m16 LEA BX,[BP][DI] 2+EA 
(r16) \u2190 m16 
LDS r16,m32 LDS SI,DATA_SEG[DI] 16+EA 
(r16) \u2190 (m32) 
(DS) \u2190 (m32)+2 
LES r16,m32 LES SI,DATA_SEG[DI] 16+EA 
(r16) \u2190 (m32) 
(ES) \u2190 (m32)+2 
3.4.5 Instruções Aritméticas 
3.4.5.1 Adição 
ADD r1,r2 ADD AX,SI 3 
 ADD CL,DH 
ADD r,m ADD DL,[300] 9+EA 
 ADD CX,[BX+1234H] 
ADD m,r ADD byte ptr [300],DL 16+EA 
 ADD word ptr [SI+BX+2],AX 
ADD r,d ADD AL,4 4 
(r) \u2190 (r) + d ADD AX,50 
ADD m,d ADD byte ptr [DI],54 17+EA 
(m) \u2190 (m) + d ADD word ptr [BX+4],4FFH 
 Linguagem Assembly Família Intel 
 
 
última revisão Ago/2007 18 
ADC r1,r2 ADC