Indice de temas que encontraras en esta pagina: estructuras de control, comparaciones, instrucciones de ramificación.
ESTRUCTURAS DE CONTROL
Los lenguajes de alto nivel suministran estructuras del alto nivel como instruccionesif while
, que controlan el flujo de ejecución. El lenguaje ensamblador NO suministra estas complejas estructuras de control. En lugar de ello usa el GOTO
Sin embargo es posible escribir programas estructurados en ensamblador. El procedimiento básico es diseñar la lógica del programa usando las estructuras de control de alto nivel y traducir el diseño en lenguaje ensamblador apropiado.
COMPARACIONES
Las estructuras de control deciden que hacer basados en la comparación de datos. En ensamblador, el resultado de una comparación se almacenan en el registro FLAGS
para usarlas luego.
Tambien esta disponible la instrucción CMP
para realizar comparaciones. El registro FLAGS se fija basado en la diferencia de los dos operandos de la instrucción CMP
.
Los operandos se restan y se fija el registro FLAGS basado en el resultado, pero el resultado no se almacena en ninguna parte. Si necesita el resultado use la instrucción SUB
en lugar de la instrucción CMP
.
Para enteros sin signos hay dos banderas (bits en el registro FLAGS) que son importante: cero ZF
y carry CF
. La bandera cero se fija a 1
si el resultado de la resta es cero. La bandera carry se usa como bandera de préstamo para la resta.
Considere una comparación como: cmp vleft, vright
. Se calcula la diferencia de vleft - vright y las banderas se fijan de acuerdo al resultado. Si la diferencia de CMP
es cero, vleft = vright
, entonces ZF
se fija ZF=1
y CF
se borra CF=0
.
Si vleft > vright
, entonces ZF
se borra y CF
también (no hay préstamo). Si vleft vright
, entonces ZF
se borrará y CF
se fijaría (hay préstamo).
INSTRUCCIONES DE RAMIFICACIÓN
Las instrucciones de ramificación pueden transferir la ejecución del programa a un punto arbitrario. En otras palabras funcionan como goto. Hay dos tipos de ramificaciones: condicionales e incondicionales. Una ramificación incondicional es tal cual como goto
, siempre hace el salto.
Una ramificación condicional puede o no hacer el salto dependiendo de las banderas del registro FLAGS. Si una ramificación condicional no hace el salto, el control pasa a la siguiente instrucción.
La instrucción JMP
acrónimo de jump
) hace ramificaciones incondicionales. Su argumento normalmente es la etiqueta de código de la instrucción a la cual debe saltar. El ensamblador o el encadenador reemplazará la etiqueta con la dirección correcta de la instrucción.
Es importante tener en cuenta que la instrucción inmediatamente después de la instrucción JMP
nunca se ejecutará a menos que otra instrucción salte a ella.
VARIACIONES DE LAS INSTRUCCIONES DE SALTO
- SHORT: Este salto es de tamaño muy limitado, solo se puede mover arriba o abajo 128 bytes en memoria. La ventaja de este tipo es que usa menos memoria que otros. Usa un byte con signo para almacenar el desplazamiento del salto. El desplazamiento es cuántos bytes se mueve adelante o atr´as. El desplazamiento se añade a EIP. Para especificar un salto corto, use la palabra
SHORT
inmediatamente antes de la etiqueta en la instrucciónJMP
. - NEAR: Este salto es el tipo por omisión en las ramificaciones condicionales e incondicionales y se puede usar para saltar a cualquier lugar del segmento. Uno usa dos bytes para el desplazamiento. Esto le permite a uno moverse aproximadamente 32000 bytes arriba o abajo. El otro tipo usa cuatro bytes para el desplazamiento, que le permite a uno moverse a cualquier lugar en el segmento de código. El tipo de 2 bytes se puede especificar colocando la palabra
WORD
antes de la etiqueta en la instrucciónJMP
. - FAR: Este salto permite moverse a otro segmento de código.