Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.
problema con saltos condicionales
Enviado por ixan el día 7 de marzo de 2006
Hola muy buenas, estoy haciendo un programilla que me ha dejado algo perplejo en un salto concreto.
El tema es que tengo que hacer un salto condicional y no \'saltar\' sino llamar a un procedimiento con un call porque sino no hago un procedimiento me da error por ser un salto demasiado grande, aunque no se si es posible que igual que existe un \'short\' pueda existir lo contrario por ejemplo un \'long\' ja,ja no funciona.
Alguien seria tan amable de ayudarme a poder hacer ese salto grande o decirme como usar un call dependiendo de una condicional, un saludo y gracias.
Bien dices... existen los saltos cortos (que en vez de una direccion son un desplazamiento de +/-127) tambien llamados shorts jumps (o "JMP SHORT label" en ensamblador) y los saltos largo (mejor... LEJANOS) tambien llamados far jumps (o en ensamblador "JMF FAR label") Estos "saltos lejanos" son realmente los saltos comunes que tienen la direccion (segmento:offset) de la memoria...
Supongo que esto solucionara tu problema... pero a proposito de los CALL condicionales... en X86 no existe nada parecido (en ARM y MIPS si, pero esas son arquitecturas decentes...) lo que se hace es:
Muy buenas, pues la verdad he tenido suerte a medias porque si uso 'far' me pone mismath in operand sizes lo cual no es verdad, porque quito un par de instrucciones y me opera todo de puta madre, a no ser que me hable del size de otra cosa que es lo que me temo porque no se lo que puede ser aunque me lo imagino pero no sabria como solucionarlo, no se si se me podria ayudar pero no consigo hacer un ciclo minimamente grande sin que me de errores de fuera de rango con salto corto, gracias , un saludo
Algo que o tome en cuenta... ¡Que ensamblador estas usando???? ¿TASM/MASM/NASM...? Porque varian en la forma de usar far... Creo que te esta hablando del size del operador... pero es dificil saberlo sin conocer que ensamblador es... Si puedes tambien copia el trozo de codigo (o al menos una parte ejecutable) que te da problems... asi podremos probarlo para ver que pasa...
Otra solucion que se me ocurre es hacer un "trampolin" a mitad del codigo... Esto es
label1: ; Aqui debe hacer el loop
mov ax,...
sub bx, ax...
call loquesea
...mas codigo...
push cl
...mucho mas codigo...
; ***********************************
; Codigo del trampolin
jmp trampolin1_des ; Si viene por aqui se salta el trampolin
trampolin1:
jmp label1 ; Salta al buble...
trampolin1_des
; ***************************************
call otracosa
...todavia mas codigo...
pop es
cmp ax, 0x03BC
; Y aqui en vez de saltar a label1 directamnte
; saltamos a trampolin1
jne trampolin1
...lo que queda del codigo...
Creo que se entiende... es una chapuza pero deveria andar en cualquier ensablador...
Lo 1º agradecerte la respuesta, el tema es el siguiente uso el NASM, te pongo un trozo de codigo :
BUCLE_1:
pop AX
mov DX,7
call TRY ; Multiplica , Suma y decrementa
jcxz BUCLE_2
............. ( LAS 4 LINEAS SE REPITEN 14 VECES )
BUCLE_2:
............. ( SALIDA DEL SUPERBUCLE )
TRY:
mul EDX
add EBX,EAX
dec CX
ret
Como puedes ver, lo que he hecho, es hacer una rutina \'TRY:\' para quitarme 3 operaciones, el tema es que no puedo romper el bucle haciendo un trampolin porque al menos en la primera pasada tiene que ejecutar esa parte, si te entendi bien, porque en ciertos casos que no se cumple la condicion recorre todo el bucle para acabar ejecutando el bucle_2, y no me sirven mas rutinas porque el inmediato a DX cambia y no voy hacer 14 veces un call para meter AX en la pila, pero tambien me a ocurrido en otros casos donde el codigo no es simetrico y ni siquiera puedo hacerlas, osea tengo que encontrar como hacer un \'far\' como me comentaste para salir de ese raquitico limite.
En este caso se me queda solo el 1º salto fuera de rango.
Ya me comentaras con el NASM como va pero el \'far\' no iva, un saludo
Re: Re: Re: Re: Re: problema con saltos condicionales
Enviado por hiei el día 29 de marzo de 2006
Bien... me disculpo por lo del FAR pero (aparte de que en algunas verciones va en mayusculas) se usa solo con JMP (sin nunguna condicion)
La instruccion JCXZ solo tiene un rango de +/- 128 pociciones por las mismas limitaciones del 8086 (en el 80386 esto se arregla porque es un relatibo de 32 bits en vez de 8 pero bue... estamos en 8086) asi que tendraz que hacer algo como esto (ya que no puedes quebrar el bucle sea cual sea la razon... en realidad esto es una chapuza... no es nueno y no deveria haberlo sugerido ;-) Tendraz que usar algo asi:
BUCLE_1:
pop AX
mov DX,7
call TRY ; Multiplica , Suma y decrementa
jecxz continue_1 ; Lo contrario a JCXZ
jmp BUCLE_2
continue_1:
............. ( LAS 4 LINEAS SE REPITEN 14 VECES )
BUCLE_2:
............. ( SALIDA DEL SUPERBUCLE )
Espero que esto ande porque no lo he probado (creo que una vez me enfrente a algo similar en X86 pero no me acuerdo si lo soclucione bien o al final me pase a codigo de 32 bits...)
Realmente las limitaciones en los saltos de los 8086 fueron un dolor de cabeza en alguna epoca y fue la coimdilla de los sabados entre los ingenieros que teniamos que programarlos... era un unainime "intel es una mier!!!!"