Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Foros > Ensamblador > problema con saltos condicionales
-Foros de debate

Ensamblador
Lista de foros | Lista de mensajes de este foro

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.

 
Re: problema con saltos condicionales
Enviado por hiei el día 7 de marzo de 2006

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:

cmp algo, otracosa
label_if:
j??? label_if_else
CALL la_funcion_correspondiente
jmp label_endif:
label_if_else:
CALL la_otra_funcion
label_endif:
; mas codigo...

Bueno, es un if...then...else...endif pero se puede implementar un if...then simple o un switch(...) case: complicado con el mismo criterio...

Suerte...

 
Re: Re: problema con saltos condicionales
Enviado por ixan el día 25 de marzo de 2006

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

 
Re: Re: Re: problema con saltos condicionales
Enviado por hiei el día 25 de marzo de 2006

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...

 
Re: Re: Re: Re: problema con saltos condicionales
Enviado por ixan el día 28 de marzo de 2006

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!!!!"

Suerte.

 






Tienda
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network