sábado, 4 de octubre de 2008

Instrucciones ( VIII ) Control

Las instrucciones de control son para poder manejar el flujo del programa con bifurcaciones, saltos de linea , llamadas a subrutinas , etc.
call
jmp
jb
je
jg
jz
jbe
jge
jne
near
far
ret
retn
retf
iret



CALL llamada a subrutina

Transfiere el control del programa a un procedimiento, salvando previamente en la pila la dirección de la instrucción siguiente, para poder volver a ella una vez ejecutado el procedimiento. El procedimiento puede estar en el mismo segmento (tipo NEAR) o en otro segmento (tipo FAR). A su vez la llamada puede ser directa a una etiqueta (especificando el tipo de llamada NEAR -por defecto- o FAR) o indirecta, indicando la dirección donde se encuentra el puntero. Según la llamada sea cercana o lejana, se almacena en la pila una dirección de retorno de 16 bits o dos palabras de 16 bits indicando en este último caso tanto el offset (IP) como el segmento (CS) a donde volver.


  • call proc1

  • dir dd 0f000e987h ;se guarda en dir una dirección de memoria
  • call dword ptr dir;el programa salta a la direccion que apunta dir

En el segundo ejemplo, la variable dir almacena la dirección a donde saltar. De esta última manera -conociendo su dirección- puede llamarse tambión a un vector de interrupción, guardando previamente los flags en la pila (PUSHF), porque la rutina de interrupción retornar� (con IRET en vez de con RETF) sacándolos.

JMP salto

Transfiere el control incondicionalmente a la dirección indicada en el operando. La bifurcación puede ser tambien directa o indirecta , pero ademas puede ser corta (tipo SHORT) con un desplazamiento comprendido entre -128 y 127; o larga, con un desplazamiento de dos bytes con signo. Si se hace un JMP SHORT y no llega el salto (porque esta demasiado alejada esa etiqueta) el ensamblador dara error. Los buenos ensambladores cuando dan dos pasadas colocan alla donde es posible un salto corto, para economizar memoria, sin que el programador tenga que ocuparse de poner short. Si el salto de dos bytes, que permite desplazamientos de 64 Kb en la memoria sigue siendo insuficiente, se puede indicar con far que es largo (salto a otro segmento).

  • jmp etiqueta
  • jmp far ptr etiqueta

Las siguientes instrucciones son de transferencia condicional de control a la instruccion que se encuentra en la posicion IP+desplazamiento (desplazamiento comprendido entre -128 y +127) si se cumple la condicion. Algunas condiciones se pueden denotar de varias maneras. Todos los saltos son cortos y si no alcanza hay que apañarselas como sea. Donde interviene SF se consideran con signo los operandos implicados en la ultima comparacion u operacion aritmetico-logica, y se indican en la tabla como '�' (-128 a +127 ó-32768 a +32767); en los demas casos, indicados como '+', se consideran sin signo (0 a 255 ó 0 a 65535):

JA/JNBE Salto si mayor (above), si no menor o igual (not below or equal), si CF=0 y ZF=0.

JAE/JNB Salto si mayor o igual (above or equal), si no menor (not below), si CF=0.

JB/JNAE/JC Salto si menor (below), si no superior ni igual (not above or equal), si acarreo, si CF=1.

JBE/JNA Salto si menor o igual (not below or equal), si no mayor (not above), si CF=1 � ZF=1.

JCXZ Salto si CX=0.

JE/JZ Salto si igual (equal), si cero (zero), si ZF=1.

JG/JNLE Salto si mayor (greater), si no menor ni igual (not less or equal), si ZF=0 y SF=0.

JGE/JNL Salto si mayor o igual (greater or equal), si no menor (not less), si SF=0.

JL/JNGE Salto si menor (less), si no mayor ni igual (not greater or equal), si SF<>OF.

JLE/JNG Salto si menor o igual (less or equal), si no mayor (not greater), si ZF=0 y SF<>OF.

JNC Salto si no acarreo, si CF=0.

JNE/JNZ Salto si no igual, si no cero, si ZF=0.

JNO Salto si no desbordamiento, si OF=0.

JNP/JPO Salto si no paridad, si paridad impar, si PF=0.

JNS Salto si no signo, si positivo, si SF=0.

JO Salto si desbordamiento, si OF=1.

JP/JPE Salto si paridad, si paridad par, si PF=1.

JS Salto si signo, si SF=1.

RET / RETF / RETN retorno de subrutina

Retorna de un procedimiento extrayendo de la pila la direccion de la siguiente direccion. Se extraera el registro de segmento y el desplazamiento en un procedimiento de tipo FAR (dos palabras) y solo el desplazamiento en un procedimiento NEAR (una palabra). si esta instruccion es colocada dentro de un bloque PROC-ENDP el ensamblador sabe el tipo de retorno que debe hacer, segun el procedimiento sea NEAR o FAR. En cualquier caso, se puede forzar que el retorno sea de tipo FAR con la instruccion RETF. Valor, si es indicado permite sumar una cantidad valor en bytes a SP antes de retornar, lo que es frecuente en el codigo generado por los compiladores para retornar de una funcion con parametros. Tambien se puede retornar de una interrupcion con RETF 2, para que devuelva el registro de estado sin restaurarlo de la pila.

No hay comentarios: