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ógicasSã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 processosConteú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 lao 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 mantm 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).
*****************************************************************************