[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: Problemas com o JUMP



On Thu, 20 Mar 2003, Tiago Motta Jorge wrote:

>     Estou tendo um problema com o JNB. Parece que o ponto que estou 
> tentando "pular" está muito longe.. (?). Eis o que o NASM reclama:
> 
> $ make
> nasm -f elf dump.asm
> dump.asm:89: error: short jump is out of range
> make: *** [dump.o] Error 1
> $
> 
>     Como posso resolver este problema?

Todas as instruções de desvio condicional do x86 tem uma restrição: o 
endereço alvo do desvio precisa estar "perto" da instrução de desvio.
Essa restrição é uma conseqüência do formato das instruções de desvio
condicional. A informação sobre o alvo do desvio aparece na instrução
de forma relativa: um *byte* com a diferença entre o endereço alvo do 
desvio e o que sucede a própria instrução de desvio. Como essa diferença
tem que caber num só byte, com um desvio condicional você só pode pular
para um alvo no intervalo [E - 128, E + 127], onde E é o endereço da
instrução que vem logo depois do desvio.

Como o desvio incondicional (JMP) não tem essa restrição, faça o seguinte
sempre que o montador reclamar que você esta querendo pular para um ponto 
distante demais: troque a instrução de desvio condicional por uma outra 
com a condição oposta, seguida de um desvio incondicional para o ponto 
distante demais. Em outras palavras, troque

                jb      longe_demais

por
                jnb     em_frente
                jmp     longe_demais
        em_frente:

Em geral, troque

                jCond   longe_demais

por

                jNCond  em_frente
                jmp     longe_demais
        em_frente:

onde JCond/JNCond são desvios que "olham" para condições opostas, como 
JE/JNE, JZ/JNZ, JA/JNA, JB/JNB, JG/JNG, JL/JNL, etc.

Até mais e bom trabalho,

Reverbel