You are on page 1of 11

INSTITUTO TECNOLOGICO DE ZACATEPEC

Saltos y ciclos

LENGUAJE ENSAMBLADOR
PRESENTA

JEZER ROA JIMENEZ ALAIN SANCHEZ SALAZAR RAMSES VILLEGAS BAHENA JESSICA ESTEFANIA VEGA CAMPOS

SALTOS INCONDICIONALES Y CONDICIONALES


A veces un programa debe cambiar el flujo del programa en forma incondicional o bajo una condicin (Para tomar una decisin), por lo tanto debe haber instrucciones que permitan cambiar el flujo de un programa sin ningn requisito, o en caso de que una condicin se cumpla. Existen instrucciones para ste propsito. Son las instrucciones de saltos incondicionales y condicionales, que saltan a un determinado punto si se cumple la condicin.

Direcciones Corta, cercana y lejana


Una operacin de salto alcanza una direccin corta por medio de un desplazamiento de un byte, limitado a una distancia de -128 a 127 bytes. Una operacin de salto alcanza una direccin cercana por medio de un desplazamiento de una palabra, limitado a una distancia de -32, 768 a 32, 767 bytes dentro del mismo segmento. Una direccin lejana puede estar en otro segmento y es alcanzada por medio de una direccin de segmento y un desplazamiento; CALL es la instruccin normal para este propsito. La tabla siguiente indica las reglas sobre distancias para las operaciones JMP, LOOP y CALL. Hay poca necesidad de memorizar estas reglas, ya que el uso normal de estas instrucciones en rara ocasin causa problemas.

SALTOS INCONDICIONALES
(JMP)
La instruccin JMP es la que se utiliza para un saltono condicional; esto, significa que cuando se ejecutauna instruccin JMP, el registro EIP que contiene ladireccin de la siguiente instruccin a ejecutar va aapuntar a la direccin indicada por el JMP. Una operacin JMP dentro del mismo segmento puede ser corta o cercana (o de manera tcnica, lejana, si el destino es un procedimiento con el atributo FAR). En su primer paso por un programa fuente, el ensamblador genera la longitud de cada instruccin. Sin embargo, una instruccin JMP puede ser de dos o tres bytes de longitud. Una operacin JMP a una etiqueta dentro de 128 a + 127 bytes es un salto corto. La sintaxis es la siguiente. JMP XXXX XXXX: Es la ubicacin de la instruccin en donde se continuar el programa (A partir de sta se ejecutan las siguientes). Ejemplo: XXXX:0100 MOV AX, 1000 XXXX:0103 JMP 0107 XXXX:0105 XOR AX, AX XXXX:0107 INT 20 En ste caso al ejecutarse la instruccin de salto incondicional (JMP), se contina la ejecucin a partir de la instruccin (INT 20h), no ejecutndose la instruccin XOR (sta instruccin realiza la operacin XOR de l operando 2 sobre el operando 1) que provocara el borrado de registro AX (Que provocara que AX tome el valor 0), si se ejecuta. Es decir, se ejecutan las siguientes instrucciones:

MOV AX, 1000 JMP 0107 INT 20 No se ejecuta "XOR AX, AX" por el salto incondicional. El operando puede ser una direccin constante (Por ejemplo 0107), un salto a nivel de offset, tambin puede ser un salto largo (Que cambie los valores de los registros CS e IP), (Por ejemplo FFFF:0000, que salta al ROM BIOS). Tambin puede ser el valor de un registro, por ejemplo:

JMP DI
En ste caso salta a la instruccin apuntada por DI. Tambin puede ser un valor apuntado por un registro puntero, por ejemplo:

JMP [SI]
En ste caso salta a la instruccin apuntada por el valor apuntado por SI. El operando puede ser cualquier direccionamiento vlido (Puede ser cualquiera de los direccionamientos utilizados en el operando origen de la instruccin MOV Existen bsicamente tres tipos de salto:

Salto cercano o Near Jump:


Es un salto a unainstruccin dentro del segmento actual (el segmentoal que apunta el registro CS).

Salto lejano o FarJump:


Se trata de un salto a unainstruccin situada en un segmento distinto al delsegmento de cdigo actual.

Cambio de Tarea o TaskSwitch:


Este salto serealiza a una instruccin situada en una tarea distinta,y slo puede ser ejecutado en modo protegido. Cuando estemos programando, lo normal es queutilicemos etiquetas y saltos cercanos. En todocompilador, si

escribimos la instruccin "JMP ", alcompilar el fichero la etiqueta ser sustituida por elvalor numrico de la direccin de memoria en que seencuentra el lugar donde queremos saltar.

LJMP addr16. Salto incondicional de 16bits (salto largo). AJMP addr11. Salto incondicional de 11bits (salto corto). SJMP rel. Salto incondicional relativo a la posicin actual.
Si se utiliza un ensamblador, los saltos se pueden expresar con su expresin genrica JMP para salto incondicional y CALL para salto a subrutina, el software ensamblador se encargar de remplazar el salto genrico por el especfico del microprocesador ms adecuado a cada caso.

CALL (Llamada a subrutina)


Sintaxis: CALL destino Indicadores: OF DF IF TF SF ZF AF PF CF- - - - - - - - Transfiere el control del programa a un procedimiento, salvando previamente en lapila la direccin de la instruccin siguiente, para poder volver a ella una vezejecutado 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 directaa una etiqueta (especificando el tipo de llamada NEAR -por defecto- o FAR) oindirecta, indicando la direccin donde se encuentra el puntero. Segn la llamadasea cercana o lejana, se almacena en la pila una direccin de retorno de 16 bits odos palabras de 16 bits indicando en este ltimo caso tanto el offset (IP) como elsegmento (CS) a donde volver. Ejemplos: CALL PROC1DIR DD 0F000E987H CALL DWORD PTR DIR En el segundo ejemplo, la variable dir almacena la direccin a donde saltar. Deesta ltima manera -conociendo su direccin- puede llamarse tambin a un vector de interrupcin,

guardando previamente los flags en la pila (PUSHF), porque larutina de interrupcin retornar (con IRET en vez de con RETF) sacndolos.

RET / RETF (Retorno de subrutina)


Sintaxis: RET [valor] o RETF [valor] Indicadores: OF DF IF TF SF ZF AF PF CF- - - - - - - - Retorna de un procedimiento extrayendo de la pila la direccin de la siguientedireccin. Se extraer el registro de segmento y el desplazamiento en unprocedimiento de tipo FAR (dos palabras) y solo el desplazamiento en unprocedimiento NEAR (una palabra). Si esta instruccin es colocada dentro de unbloque PROC-ENDP (como se ver en el siguiente captulo) el ensamblador sabeel tipo de retorno que debe hacer, segn el procedimiento sea NEAR o FAR. Encualquier caso, se puede forzar que el retorno sea de tipo FAR con la instruccinRETF. Valor, si es indicado permite sumar una cantidadvalor en bytes a SP antesde retornar, lo que es frecuente en el cdigo generado por los compiladores pararetornar de una funcin con parmetros. Tambin se puede retornar de unainterrupcin con RETF 2, para que devuelva el registro de estado sin restaurarlode la pila.

SALTOS CONDICIONALES
EIF-THEN-ELSE, o el FOR, o el WHILE-DO lo que es en java. Bien, pues aqu est lo que suple a estas instrucciones en lenguaje Ensamblador. Se basan completamente en los flags, pero estn simplificados. Los saltos podran resumirse en un modo "Basic" de la manera IF-THEN-GOTO de forma que cuando se cumple una condicin se salta a un sitio determinado. He aqu los tipos de saltos condicionales (las letras en maysculas sonlas instrucciones):

JO:Jumpifoverflow. Salta si el flag de desbordamiento est a uno


JNO: Jump if not overflow. Salta si el flag de desbordamiento est a cero.

JC, JNAE, JB: Los tres sirven para lo mismo. Significan: Jump if Carry, Jump
if Not Above or Equal y Jump if Below. Saltan por lo tanto si al haber una comparacin el flag de acarreo se pone a 1; es entonces equivalente a < en una operacin sin signo. Vamos, que se compara as: CMP 13h,18h, saltar, ya que 13h es menor que 18h. Tambin se suelen usar para detectar si hubo fallo en la operacin, ya que muchas interrupciones al acabar en fallo encienden el carryflag.

JNC, JAE, JNB: Otros tres que valen exactamente para lo mismo. Jump if
not Carry, Jump if Above or Equal y Jump if Not Below. Saltan por tanto si al haber una comparacin el flag de acarreo vale 0, o sea, es equivalente al operador >=. En la comparacin CMP 0,0 o CMP 13h,12h saltar, ya que el segundo operando es MAYOR O IGUAL que el primero.

JZ o JE: Jump if Zero o Jump if Equal. Salta si el flag de cero est a 1, o sea,
si las dos instrucciones comparadas son iguales. Saltara en el caso CMP 0,0

JNZ o JNE:JumpifNot Zero o JumpifNotEqual. Salta si el flag de cero est


0, o sea, si las dos instrucciones comparadas no son iguales.

JBE o JNA: Jump if Below or Equal o Jump if Not Above. Saltara si en resultado de la comparacin el primer miembro es menor o igual que el segundo ( <= )

JA o JNBE: Jump if Above o Jump if Not Below of Equal. Justo lo contrario


que la anterior, salta si en el resultado de la comparacin el primer miembro es mayor al segundo.

JS:JumpifSign. Salta si el flag de signo est a uno. JNS: Jump if Not Sign. Salta si el flag de signo est a cero.

JP, JPE: Jump if Parity o Jump if Parity Even. Salta si el flag de paridad est a
uno.

JNP, JPO: Jump if Not Parity, Jump if Parity Odd. Salta si el flag de paridad
est a cero.

JL, JNGE: Jump if Less, Jump if Not Greater of Equal. Salta si en el resultado
de la comparacin, el primer nmero es inferior al segundo, pero con nmeros con signo.

JGE, JNL: Jump if Greater or Equal, Jump if Not Less. Salta si en el resultado
de la comparacin, el primer nmero es mayor o igual que el segundo, pero con nmeros con signo.

JLE, JNG:

Jump if Lower or Equal, Jump if Not Greater. Salta si en el resultado de la comparacin, el primer nmero es menor o igual que el segundo, pero con nmeros con signo.

JG, JNLE:

Jump if Greater, Jump if Not Lower or Equal. Salta si en el resultado de la comparacin, el primer nmero es mayor que el segundo, para nmeros con signo. Algunos ejemplos de los ms utilizados: MOV AX,1111h MOV BX,1112h CMP AX,BX ; AX es menor que BX JB tirapalante ; Saltar a tirapalante HLT ; Esta orden bloquea el ordenador, halt tirapalante: DEC BX ; Ahora BX valdr 1111h CMP AX,BX ; Ahora valen igual

JNE Acaba ; No saltar, ya que son iguales JE Continua ; Esta vez si Continua: DEC BX ; Ahora BX vale 1110h CMP AX,BX JE Acaba ; No son iguales, por tanto no saltar JB Acaba ; No es menor, tampoco salta JG Acaba ; Es mayor, ahora SI saltar Acaba: XOR AX,AX XOR BX,BX ; AX y BX valen ahora cero. En los saltos condicionales se puede hacer como en los incondicionales, o sea, formatos como: JE 0022h JNE 0030h JNO AL Sin embargo, estamos limitados a saltos cortos, o sea, de rango a 127 bytes hacia delante o 128 hacia atrs, no pudiendo superar esta distancia.

CICLOS
Un ciclo, conocido tambin como iteracin, es la repeticin de un proceso un cierto nmero de veces hasta que alguna condicin se cumpla. En estos ciclos se utilizan los brincos "condicionales" basados en el estado de las banderas. Por ejemplo la instruccin jnz que salta solamente si el resultado de una operacin es diferente de cero y la instruccin jz que salta si el resultado de la operacin es cero.

Instruccin LOOP: La instruccin LOOP, requiere un valor inicial en el registro CX. En cada iteracin, LOOP de forma automtica disminuye 1 de CX. Si el valor en el CX es cero, el control pasa a la instruccin que sigue; si el valor en el CX no es cero, el control pasa a la direccin del operando. La distancia debe ser un salto corto, desde -128 hasta +127 bytes. Para una operacin que exceda este lmite, el ensamblador enva un mensaje como salto relativo fuera de rango. El formato general de la instruccin LOOP es: | [etiqueta:] | LOOP | direccin corta | El siguiente programa muestra el funcionamiento de la instruccin LOOP.
Page 60,132 TITLE P08LOOP (COM) Ilustracin de LOOP .MODEL SMALL .CODE ORG 100H MAIN PROC NEAR MOV AX,01 ;Iniciacin de AX, MOV BX,01 ;BX y MOV CX,01 ;CX a 01 MOV CX,10 ;Iniciar A20: ;Nmero de iteraciones ADD AX, 01 ;Sumar 01 a AX ADD BX, AX ;Sumar AX a BX SHL DX, 1 ;Multiplicar por dos a DX LOOP A20 ;Iterar si es diferente de cero MOV AX, 4C00H ;Salida a DOS MAIN ENDP END MAIN

Existen dos variaciones de la instruccin LOOP, ambas tambin decrementan el CX en 1. LOOPE/LOOPZ (repite el ciclo mientras sea igual o repite el ciclo mientras sea cero) continua el ciclo mientras que el valor en el CX es cero o la condicin de cero esta establecida.

LOOPNE/LOOPNZ (repite el ciclo mientras no sea igual o repite el ciclo


mientras sea cero) continua el ciclo mientras el valor en el CX no es cero o la condicin de cero no esta establecida. LOOPE/LOOPZ Bucle si igual, si cero. Z=1 y CX<>0 LOOPNE/LOOPNZ Bucle si no igual, si no cero. Z=0 y CX<>0

Instruccin DEC
Propsito: Decrementar el operando Sintaxis: DEC destino Esta operacin resta 1 al operando destino y almacena el nuevo valor en el mismo operando.

Instruccin INC
Propsito: Incrementar el operando. Sintaxis: INC destino La instruccin suma 1 al operando destino y guarda el resultado en el mismo operando destino.

You might also like