[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: Problemas com o JUMP
- Subject: Re: Problemas com o JUMP
- From: Francisco Reverbel <reverbel@xxxxxxxxxx>
- Date: Sat, 22 Mar 2003 14:37:05 -0300 (EST)
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