Como já foi dito numa sessão anterior, o registo CS (Code Segment Register) contém os 16 bits mais significativos do endereço físico onde começa o segmento de código. Esse segmento contém os códigos binários das instruções que constituem o programa que está a ser executado. O registo IP (Instruction Pointer Register) referencia dentro do segmento de código qual é a próxima instrução a ser executada, ou seja, o seu valor representa o deslocamento em relação ao CS que tem a próxima instrução.
Se o programa em causa for uma simples sequência de instruções o endereço da próxima instrução a executar é sempre o imediatamente a seguir à instrução anterior. Isto já não é assim se o programa contiver saltos (jumps).
As instruções JMP são usadas para indicar ao processador que a próxima instrução a executar não é a que está imediatamente a seguir mas sim outra. Existem jumps condicionais que ocorrem se uma determinada condição se verificar e jumps incondicionais que ocorrem sempre, sem estarem sujeitos a qualquer condição.
O 8086 calcula o endereço físico da próxima instrução
a executar adicionando o deslocamento contido no registo IP ao
endereço de base representado pelo número contido no registo CS.
Quando o 8086 executa a instrução JMP, carrrega um novo
número (deslocamento) no registo IP e por vezes também um novo
número no registo CS.
A instrução JMP do Assembly do 8086 tem o seguinte formato:
JMP <destino>
Se o destino está num segmento de código diferente do da própria instrução então é necessário alterar não só o valor do registo IP, mas também o valor do registo CS. Neste caso, diz-se que estamos perante um far jump. Se, pelo contrário o destino está no mesmo segmento diz-se que estamos perante um near jump.
Os jumps podem também ser directos ou indirectos. São directos se o destino for um número, número esse que referencia um deslocamento em relação à localização actual. Nesse caso o novo valor do IP ficará a ser IP+<destino>. São indirectos se o destino for um registo ou localização de memória. Nesse caso o 8086 terá de ir buscar o conteúdo do registo ou localização de memória, conteúdo esse que passará a ser o novo valor do registo IP.
No caso dos jumps directos do tipo near o destino pode ser um número de 8 bits ou de 16 bits. No caso de ser um número de 16 bits pode variar desde 32767 a -32768. No caso de ser um número de 8 bits diz-se também que é do tipo short e referencia um deslocamento que varia entre 127 e -128 em relação à localização actual.
O 8086 tem seis flags condicionais: a carry flag (CF), a parity flag (PF), a auxiliary parity flag (AF), a zero flag (ZF), a sign flag (SF) e a overflow flag (OF).
As várias instruções do Assembly 8086 alteram os valores das várias flags, por exemplo, quando se somam dois números de 16 bits e o resultado não cabe em 16 bits a CF fica com o valor 1.
Como já foi referido um jump condicional está sujeito a uma determinada condição. A instruções que especificam jumps condicionais analisam o conteúdo de determinadas flags para decidir se o jump se faz ou não,
Todos os jumps condicionais são do tipo short, isto significa que o destino tem de especificar um endereço dentro do mesmo segmento da instrução JMP e além disso o deslocamento em relação à localização actual varia apenas de 127 a -128.
Estas instruções aparecem normalmente depois de instruções de operações aritméticas e lógicas (que alteram os valores das flags), e quase sempre depois da instrução CMP.
A instrução CMP tem o seguinte formato:
CMP <destino>, <fonte>
Quando executada esta instrução compara o byte ou word especificada por <fonte> pelo byte ou word especificada por <destino>. A fonte pode ser um número, um registo, ou uma posição de memória. O destino pode ser um registo ou uma posição de memória. A fonte e o destino não podem ser simultaneamente posições de memória.
Esta instrução é muitas vezes usada com as seguintes instruções que implementam jumps condicionais:
Os termos above e below utilizam-se quando queremos comparar números sem sinal. Os termos greater e less utilizam-se quando queremos comparar números com sinal.
Além destas instruções, existem outras que fazem depender os jumps directamente dos valores das flags. São elas: