Índice> <1> <2> <3> <4> <5> <6> <7> <8> <Página Principal>



CAPÍTULO 4:
INSTRUÇÕES ASSEMBLY

Conteúdo:
4.1.Instruções de operação de dados
4.2.Instruções lógicas e aritméticas
4.3.Instruções de controle de processos
			--------------- // ---------------
         
4.1. Instruções de operação de dados.
Conteúdo:    
4.1.1.Instruções de transferência
4.1.2.Instruções de carga
4.1.3.Instruções de pilha
                                   
4.1.1.Instruções de transferência.
São usadas para mover o conteúdo dos operadores. Cada instrução pode ser
usada com diferentes modos de endereçamento.
 MOV
 MOVS (MOVSB) (MOVSW)
                                  
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 sequência de instruções ilustra isso:
MOV SI, OFFSET VAR1
MOV DI, OFFSET VAR2
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.
                                   
4.1.2. 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 VAR1
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 registrador 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
Propósito: Carregar o registrador de segmento de dados.
Sintaxe:
   LDS destino,fonte
O operador fonte deve ser uma double word na memória. A palavra associada
com o maior endereço é transferida para DS, em outras palavras isto é tomado
como o endereço de segmento. A palavra associada com o menor endereço é o
endereço de deslocamento e é depositada no registrador indicado como
destino.
                                   
INSTRUÇÃO LEA
Propósito: Carregar o endereço do operador fonte.
Sintaxe:
   LEA destino,fonte
O operador fonte deve estar localizado na memória, e seu deslocamento é
colocado no registrador de índice ou ponteiroõespecificado no destino.
Para ilustrar uma das facilidades que temos comõeste comando, vejamos:
MOV SI,OFFSET VAR1
É equivalente a: 
LEA SI,VAR1
É muito provável que para o programador é muito mais fácil criar programas
grandes usando este último formato.
                                   
INSTRUÇÃO LES
Propósito: Carregar o registrador de segmento extra
Sintaxe:
   LES destino,fonte
O operador fonte deve ser uma palavra dupla na memória. O conteúdo da
palavra com endereço maior é interpretado como o endereço do segmento e é
colocado em les. A palavra com endereço menor é o endereço do deslocamento e
é colocada no registrador especificado no parâmetro de destino.
                                   
4.1.3. Instruções de manipulação da pilha.
Estas Instruções permitem usar a pilha para armazenar ou recuperar dados.
 POP
 POPF
 PUSH
 PUSHF
                                   
INSTRUÇÃO POP
Propósito: Recuperar uma parte de informação da pilha.
Sintaxe:
   POP destino
Esta instrução transfere o último valor armazenado na pilha para o operador
de destino, e incrementa de 2 o registrador SP.
Este incremento é duplo pelo fato de que a pilha do mais alto endereço de
memória para o mais baixo, e a pilha trabalha apenas com palavras, 2 bytes,
logo deve ser 2 o incremento de SP, na realidade 2 está sendo subtraído do
tamanho real da pilha.
                                   
INSTRUÇÃO POPF
Propósito: Extrair os flags armazenados na pilha.
Sintaxe:
   POPF
Este comando transfere os bits da palavra armazenada na parte mais alta da
pilha para registrador de flag.
O modo da transferência é como se segue:
BIT    FLAG
  0     CF
  2     PF
  4     AF
  6     ZF
  7     SF
  8     TF
  9     IF
 10     DF
 11     OF
Os locais dos bits são os mesmos para o uso da instrução PUSHF. 
Uma vez feita a transferência o registrador SP é incrementado de 2, conforme
vimos anteriormente.
                                   
INSTRUÇÃO PUSH
Propósito: Coloca uma palavra na pilha.
Sintaxe:
   PUSH fonte
A instrução PUSH decrementa de dois o valor de SP e então transfere o
conteúdo do operador fonte para o novo endereço resultante no registrador
recém modificado. 
O decremento no endereço é duplo pelo fato de que quando os valores são
adicionados à pilha, que cresce do maior para o menor endereço, logo quando
subraímos de 2 o registrador SP o que fazemos é incrementar o tamanho da
pilha em dois bytes, que é a única quantidade de informação que a pilha pode
manusear em cada entrada e saída.
                                   
INSTRUÇÃO PUSHF
Propósito: Colocar os valores dos flags na pilha.
Sintaxe:
PUSHF
Este comando decrementa de 2 o valor do registrador SP e então o conteúdo do
registrador de flag ‚ transferido para a pilha, no endereço indicado por SP.
Os flags são armazenados na memória da mesma forma que o comando POPF.
			--------------- // ---------------
          
4.2. Instruções lógicas e aritméticas.
Conteúdo:
4.2.1.Instruções lógicas
4.2.2.Instruções aritméticas
                                  
4.2.1.Instruções lógicas
São usadas para realizar operações lógicas nos operadores.
 AND
 NEG
 NOT
 OR
 TEST
 XOR
                                   
INSTRUÇÃO AND
Propósito: Realiza a conjunção de operadores bit a bit.
Sintaxe:
AND destino,fonte
Como esta instrução a operação lógica "y" para ambos os operadores é usada
como na tabela:
Fonte    Destino  |   Destino
-----------------------------
  1         1     |     1
  1         0     |     0
  0         1     |     0
  0         0     |     0
O resultado desta operação é armazenado no operador de destino.
                                   
INSTRUÇÃO NEG
Propósito: Gera o complemento de 2.
Sintaxe:
NEG destino
Esta instrução gera o complemento de 2 do operador destino e o armazena no
mesmo operador. Por exemplo, if AX armazena o valor 1234H, então:
NEG AX
Isto fará com o que o valor EDCCH fque armazenado no registrador AX.
                                   
INSTRUÇÃO NOT
Propósito: Faz a negação do operador de destino bit a bit.
Sintaxe:
NOT destino
O resultado é armazenado no mesmo operador de destino.
                         
INSTRUÇÃO OR
Propósito: Realiza um OU lógico.
Sintaxe:
OR destino,fonte
A instrução OR, faz uma disjunção lógica bit a bit dos dois operadores:
Fonte      Destino    |    Destino
-----------------------------------
   1          1       |       1
   1          0       |       1
   0          1       |       1
   0          0       |       0
                                   
INSTRUÇÃO TEST
Propósito: Compara lógicamente os operadores.
Sintaxe:
TEST destino,fonte
Realiza uma conjunção, bit a bit, dos operadores, mas difere da instrução
AND, uma vez que não coloca o resultado no operador de destino. Tem efeito
sobre o registrador de flag.
                                   
INSTRUÇÃO XOR
Propósito: Realiza um OU exclusivo.
Sintaxe:
XOR destino,fonte
Esta instrução realiza uma disjunção exclusiva de dois operadores bit a
bit.
Fonte      Destino    |    Destino
-----------------------------------
   1          1       |       0
   0          0       |       1
   0          1       |       1
   0          0       |       0
                                   
4.2.2.Instruções aritméticas.
São usadas para realizar operações aritméticas nos operadores.
 ADC
 ADD
 DIV
 IDIV
 MUL
 IMUL
 SBB
 SUB
                                 
INSTRUÇÃO ADC
Propósito: Efetuar a soma entre dois operandos com carry.
Sintaxe:
ADC destino,fonte
Esta instrução efetua a soma entre dois operandos, mais o valor do flag CF,
existente antes da operação. Apenas o operando destino e os flags são
afetados. O resultado é armazenado no operador de destino.
                                   
INSTRUÇÃO ADD
Propósito: Adição de dois operadores.
Sintaxe:
ADD destino,fonte
Esta instrução adiciona dois operadores e armazena o resultado no operador
destino.
                                   
INSTRUÇÃO DIV
Propósito: Divisão sem sinal.
Sintaxe:
DIV fonte
O divisor pode ser um byte ou uma palavra e ‚ o operador que ‚ dado na
instrução. Se o divisor ‚ de 8 bits, o registrador AX de 16 bits ‚ tomado como
dividendo e se o divisor ‚ de 16 bits, o par de registradores DX:AX ser 
tomado como dividendo, tomando a palavra alta de DX e a baixa de AX.Se o divisor
for um byte, então o quociente ser  armazenado no registrador AL e o resto em AH. 
Se for uma palavra, então o quociente ‚ armazenado em AX e o resto em DX.
                                   
INSTRUÇÃO IDIV
Propósito: Divisão com sinal.
Sintaxe:
IDIV fonte
Consiste basicamente como a instrução DIV, diferencia-se apenas por realizar
a operação com sinal. Para os resultados são usados os mesmos registradores 
da instrução DIV.
                                   
INSTRUÇÃO MUL
Propósito: Multiplicação com sinal.
Sintaxe:
MUL fonte
Esta instrução realiza uma multiplicação não sinalizada entre o conteúdo do
acumulador AL ou AX pelo operando-fonte, devolvendo o resultado no
acumulador AX caso a operação tenha envolvido AL com um operando de 8 bits,
ou em DX e AX caso a operação tenha envolvido AX e um operando de 16 bits.
                                   
INSTRUÇÃO IMUL
Propósito: Multiplicção de dois n�meros inteiros com sinal.
Sintaxe:
IMUL fonte
Esta instrução faz o mesmo que a anterior, difere apenas pela inclusão do
sinal.
Os resultados são mantidos nos mesmos registradores usados pela instrução
MUL.
                                   
INSTRUÇÃO SBB
Propósito: Subtração com carry.
Sintaxe:
SBB destino,fonte
Esta instrução subtrai os operadores e subtrai um do resultado se CF está 
ativado. O operador fonte é sempre subtra�do do destino.
Este tipo de subtração é usado quando se trabalha com quantidades de 32
bits.
                                   
INSTRUÇÃO SUB
Propósito: Subtração.
Sintaxe:
SUB destino,fonte
Esta instrução subtrai o operador fonte do destino.
        
			--------------- // ---------------
4.3.Instruções de controle de processos
   
Conteúdo:
4.3.1.Instruções de salto
4.3.2.Instruções de laços: loop
4.3.3.Instruções de contagem
4.3.4.Instruções de comparação
4.3.5.Instruções de flag
                                   
4.3.1.Instruções de salto.
Usadas para transferir o processo de execução do programa para o operador
indicado.
 JMP
 JA (JNBE)
 JAE (JNBE)
 JB (JNAE)
 JBE (JNA)
 JE (JZ)
 JNE (JNZ)
 JG (JNLE)
 JGE (JNL)
 JL (JNGE)
 JLE (JNG)
 JC
 JNC
 JNO
 JNP (JPO)
 JNS
 JO
 JP (JPE)
 JS
                                   
INSTRUÇÃO JMP
Propósito: Salto incondicional.
Sintaxe:
JMP destino
Esta instrução ‚ usada par adesviar o curso do programa sem tomar em conta
as condições atuais dos flags ou dos dados.
                                   
INSTRUÇÃO JA (JNBE)
Propósito: Salto condicional.
Sintaxe:
JA símbolo
Após uma comparação este comando salta se não ‚ igual.
Isto quer dizer que o salto só ‚ feito se o flag CF ou o flag ZFõest�o
desativados, ou seja, se um dos dois for zero.
                                   
INSTRUÇÃO JAE (JNB)
Propósito: Salto condicional.
Sintaxe:
JAE símbolo
A instrução salta se está pós esta  equal ou se está  not down.
O salto é feito se CF está desativado.

 

INSTRUÇÃO JB (JNAE)
Propósito: Salto condicional.
Sintaxe:
JB símbolo
A instrução salta se está  down, se está not up ou se está equal.
O salto é feito se CF está ativado.
                                   
INSTRUÇÃO JBE (JNA)
Propósito: Salto condicional.
Sintaxe:
JBE símbolo
A instrução salta se está down, se está equal ou se está  not up.
O salto é feito se CF ou ZF estão ativados, ou seja, se um deles for 1.
                                   
INSTRUÇÃO JE (JZ)
Propósito: Salto condicional.
Sintaxe:
JE símbolo
A instrução salta se está equal ou se está zero.
O salto ‚ feito se ZF está ativado.
                                   
INSTRUÇÃO JNE (JNZ)
Propósito: Salto condicional.
Sintaxe:
JNE símbolo
A instrução salta se está not equal ou se está zero.
O salto é feito se ZF está desativado.
                                   
INSTRUÇÃO JG (JNLE)
Propósito: Salto condicional, e o sinal é tomado.
Sintaxe:
JG símbolo
A instrução salta se está larger, se está not larger ou se está equal.
O salto ocorre se ZF = 0 ou se OF = SF.
                                   
INSTRUÇÃO JGE (JNL)
Propósito: Salto condicional, e o sinal é tomado.
Sintaxe:
JGE símbolo
A instrução salta se está larger, se está less than ou se está equal.
O salto é feito se SF = OF.
                                   
INSTRUÇÃO JL (JNGE)
Propósito: Salto condicional, e o sinal é tomado.
Sintaxe:
JL símbolo
A instrução salta se está less than, se está not larger than ou se está 
equal.
O salto é feito se SF é diferente de OF.
                                   
INSTRUÇÃO JLE (JNG)
Propósito: Salto condicional, e o sinal é tomado.
Sintaxe:
JLE símbolo
A instrução salta se está less than, se está equal ou se está not larger.
O salto é feito se ZF = 1 ou se SF é diferente de OF.
                                   
INSTRUÇÃO JC
Propósito: Salto condicional, e os flags são tomados.
Sintaxe:
JC símbolo
A instrução salta se h  carry.
O salto é feito se CF = 1.
                                   
INSTRUÇÃO JNC
Propósito: Salto condicional, e o estado dos flags é tomado.
Sintaxe:
JNC símbolo
A instrução salta se não h  carry.
O salto é feito se CF = 0.
                                   
INSTRUÇÃO JNO
Propósito: Salto condicional, e o estado dos flags é tomado.
Sintaxe:
JNO símbolo
A instrução salta se não h overflow
O salto é feito se OF = 0.
                                   
INSTRUÇÃO JNP (JPO)
Propósito: Salto condicional, e o estado dos flags é tomado.
Sintaxe:
JNP símbolo
A instrução salta se não h paridade ou se a paridade é ímpar.
O salto é feito se PF = 0.
                                   
INSTRUÇÃO JNS
Propósito: Salto condicional, e o estado dos flags é tomado.

Sintaxe: 
JNP símbolo
A instrução salta se o sinal está  desativado.
O salto é feito se SF = 0.
                                   
INSTRUÇÃO JO
Propósito: Salto condicional, e o estado dos flags é tomado.
Sintaxe:
JO símbolo
A instrução salta se h overflow.
O salto é feito se OF = 1.
                                   
INSTRUÇÃO JP (JPE)
Propósito: Salto condicional, e o estado dos flags é tomado.
Sintaxe:
JP símbolo
A instrução salta se h  paridade ou se a paridade é par.
O salto é feito se PF = 1.
                                   
INSTRUÇÃO JS
Propósito: Salto condicional, e oõestado dos flags é tomado.
Sintaxe:
JS símbolo
A instrução salta se o sinal está ativado.
O salto é feito se SF =1.
			--------------- // ---------------
                               
4.3.2.Instruções para laços: LOOP.
Estas instruções transferem a execução do processo, condicional ou
incondicionalmente, para um destino, repetindo a ação até o contador ser
zero.
 LOOP
 LOOPE
 LOOPNE
                                  
INSTRUÇÃO LOOP
Propósito: Gerar um la‡o no programa.
Sintaxe:

LOOP símbolo

A instrução LOOP decrementa CX de 1 e transfere a execução do programa para
o símbolo que é dado como operador, caso CX ainda não seja 1.
                                   
INSTRUÇÃO LOOPE
Propósito: Gerar um laço no programa, considerando o estado de ZF.
Sintaxe:
LOOPE símbolo
Esta instrução decrementa CX de 1. Se CX ‚ diferente de zero e ZF é igual a
1, então a execução do programa é transferida para o símbolo indicado como
operador.
                                   
INSTRUÇÃO LOOPNE
Propósito: Gerar um laço no programa, considerando o estado de ZF.
Sintaxe:
LOOPNE símbolo
Esta instrução decrementa CX de 1 e transfere a execução do programa apenas
se ZF ‚ diferente de 0.
                                   
			--------------- // ---------------
4.3.3.Instruções contadoras.
Estas instruções são usadas para decrementar ou incrementar o conteúdo de
contadores.
 DEC
 INC
                                  
DEC INSTRUCTION
Propósito: Decrementar o operador.
Sintaxe:
DEC destino
Esta instrução subtrai 1 do operador destino e armazena o novo valor no
mesmo operador.
                                   
INSTRUÇÃO INC
Propósito: Incrementar o operador.
Sintaxe:
INC destino
Esta instrução adiciona 1 ao operador destino e mant‚m o resultado no mesmo
operador.
			--------------- // ---------------
                                 
4.3.4.Instruções de comparação.
Estas instruções são usadas para comparar os operadores, e elas afetam o
conteúdo dos flags.
 CMP
 CMPS (CMPSB) (CMPSW)
                                  
INSTRUÇÃO CMP
Propósito: Comparar os operadores.
Sintaxe:
CMP destino,fonte
Esta instrução subtrai o operador fonte do destino, mas não armazena o
resultado da operação, apenas afeta oõestado dos flags.
                                   
INSTRUÇÃO CMPS (CMPSB) (CMPSW)
Propósito: Comparar cadeias de um byte ou uma palavra.
Sintaxe:
CMP destino,fonte
Esta instrução compara efetuando uma subtração entre o byte ou palavra
endereçado por DI, dentro do segmento extra de dados, e o byte ou palavra
endereçado por SI dentro do segmento de dados, afetando o registrador de
flags, mas sem devolver o resultado da subtração. 
A instrução automaticamente incrementa ou decrementa os registradores de
índice SI e DI, dependendo do valor do flag DF, de modo a indicar os
próximos dois elementos a serem comparados. O valor de incremento ou
decremento é uma de uma ou duas unidades, dependendo da natureza da
operação.
Diante desta instrução, pode-se usar um prefixo para repetição, de modo a
comparar dois blocos de memória entre si, repetindo a instrução de
comparação até que ambos se tornem iguais ou desiguais.
                                   
			--------------- // ---------------
4.3.5.Instruções de flag.
Estas instruções afetam diretamente o conteúdo dos flags.
 CLC
 CLD
 CLI
 CMC
 STC
 STD
 STI
                                   
INSTRUÇÃO CLC
Propósito: Limpar o flag de carry.
Sintaxe:
CLC
Esta instrução desliga o bit correspondente ao flag de carry. Em outras
palavras, ela o ajusta para zero.
                                   
INSTRUÇÃO CLD
Propósito: Limpar o flag de endereço.
Sintaxe:
CLD
Esta instrução desliga o bit correspondente ao flag de endereço.
                                   
INSTRUÇÃO CLI
Propósito: Limpar o flag de interrupção.
Sintaxe:
CLI
Esta instrução desliga o flag de interrupções, desabilitando, deste modo,
interrupções mascaráveis.
Uma interrupção mascarável é aquela cujas funções são desativadas quando
IF=0.
                                   
INSTRUÇÃO CMC
Propósito: Complementar o flag de carry.
Sintaxe:
CMC
Esta instrução complementa o estado do flag CF. Se CF = 0 a instrução o
iguala a 1. Se CF = 1, a instrução o iguala a 0.
Poderíamos dizer que ela apenas inverte o valor do flag.
                                   
INSTRUÇÃO STC
Propósito: Ativar o flag de carry.
Sintaxe:
STC
Esta instrução ajusta para 1 o flag CF.
                                   
INSTRUÇÃO STD
Propósito: Ativar o flag de endereço.
Sintaxe:
STD
Esta instrução ajusta para 1 o flag DF.
                                   
INSTRUÇÃO STI
Propósito: Ativar o flag de interrupção.
Sintaxe:
STI
Esta instrução ativa o flag IF, e habilita interrupções externas mascaráveis
(que só funcionam quando IF = 1).
  
*****************************************************************************