2.2 Ciclos numericos
Ciclos numéricos
La arquitectura de los procesadores x86 obliga al uso de segmentos de memoria
para manejar la información, el tamaño de estos segmentos es de 64kb.
La razón de ser de estos segmentos es que, considerando que el tamaño máximo
de un número que puede manejar el procesador esta dado por una palabra de 16
bits o registro, no sería posible accesar a más de 65536 localidades de memoria
utilizando uno solo de estos registros, ahora, si se divide la memoria de la pc en
grupos o segmentos, cada uno de 65536 localidades, y utilizamos una dirección
en un registro exclusivo para localizar cada segmento, y entonces cada dirección
de una casilla específica la formamos con dos registros, nos es posible accesar a
una cantidad de 4294967296 bytes de memoria, lo cual es, en la actualidad, más
memoria de la que veremos instalada en una PC.
Para que el ensamblador pueda manejar los datos es necesario que cada dato o
instrucción se encuentren localizados en el área que corresponde a sus
respectivos segmentos. El ensamblador accesa a esta información tomando en
cuenta la localización del segmento, dada por los registros DS, ES, SS y CS, y
dentro de dicho registro la dirección del dato específico.
Como en cualquier otro lenguaje de programación, hay ocasiones en las que es necesario hacer que el programa no siga una secuencia lineal, sino que repita varias veces una misma instrucción o bloque de instrucciones antes de continuar con el resto del programa, es para esto que se utilizan los ciclos.
Existen 5 tipos de ciclos predefinidos en ensamblador, aunque también se pueden crear ciclos personalizados por medio de instrucciones de salto las cuales se verán en la sección 2.6 de este manual.
Los ciclos predefinidos de ensamblador son los siguientes:
LOOP:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
Ejemplo:
- mov cx,25 : Número de veces que se repetirá el ciclo, en este caso 25.
- ciclo: Etiqueta que se utilizará como referencia para el ciclo loop.
- int 21h: Instrucción contenida dentro del ciclo (puede contener más de una instrucción).
- loop: Ciclo loop que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero.
LOOPE:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de uno ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
Ejemplo:
- ciclo: Etiqueta que se utilizará como referencia para el ciclo loope.
- int 21h: Instrucción contenida dentro del ciclo (puede contener más de una instrucción).
- loope: Ciclo loope que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero y ZF sea igual a uno.
LOOPNE:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo, esta es la operación contraria a loope.
Ejemplo:
- ciclo: Etiqueta que se utilizará como referencia para el ciclo loopne.
- int 21h: Instrucción contenida dentro del ciclo (puede contener más de una instrucción).
- loopne: Ciclo loopne que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero y ZF sea igual a cero.
LOOPZ:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de uno ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo.
Ejemplo:
- ciclo: Etiqueta que se utilizará como referencia para el ciclo loopz.
- int 21h: Instrucción contenida dentro del ciclo (puede contener más de una instrucción).
- loopz: Ciclo loopz que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero y ZF sea igual a uno.
LOOPNZ:
Esta función decrementa el valor del registro contador CX, si el valor contenido en CX es cero y ZF es diferente de cero ejecuta la siguiente instrucción, en caso contrario transfiere el control a la ubicación definida por la etiqueta utilizada al momento de declarar el ciclo, esta es la operación contraria a loopz.
- ciclo: Etiqueta que se utilizará como referencia para el ciclo loopnz.
- int 21h: Instrucción contenida dentro del ciclo.
- loopnz: Ciclo loopnz que transferirá el control a la línea de la etiqueta ciclo en caso de que CX no sea cero y ZF sea igual a cero.
Comentarios
Publicar un comentario