São usadas para mover o conteúdo dos operadores. Cada instrução pode ser usada com diferentes modos de endereçamento.
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 imediatoExemplo:
MOV AX,0006h MOV BX,AX MOV AX,4C00h INT 21hEste 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.
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 seqüência de instruções ilustra isso:
MOV SI, OFFSET VAR1 MOV DI, OFFSET VAR2 MOVSPrimeiro 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.
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
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 LODSNa primeira linha vemos a carga do endereço de VAR1 em SI e na segunda é tomado o conteúdo daquele local para o regiustrador 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).
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 ?? CFO "??" significa que haverá um valor indefinido naqueles bits.
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.
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.
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 ES. A palavra com endereço menor é o endereço do deslocamento e é colocada no registrador especificado no parâmetro de destino.
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.
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 OFOs 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.
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 desultante 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.
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.
![]() Powered by WebGlimpse |
|