Referencia: Lenguaje ensamblador
En esta sección examinaremos unas cuantas de las estructuras
condicionales más comunes que se utilizan en los lenguajes de programación de
alto nivel. Veremos cómo puede traducirse fácilmente cada estructura a lenguaje
ensamblador. Consideremos que una estructura condicional es una o más
expresiones condicionales que activan una elección entre dos bifurcaciones
lógicas distintas. Cada bifurcación hace que se ejecute una secuencia distinta
de instrucciones.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1Hu9WmtrbHcSrhiok21nHzpgCsu4fByX7smQ8iT5xJd8sbM3cmODQnmeOeTwWRpuo1X-KAWOl-QqMXzbARemNz7axVLSOMi5OOgzF0m84us5NIGfkSPAGoj0SSTDG7BZRri4omWm1Zz0Y/s400/Captura.PNG) |
FIGURA 6.1 |
La única manera de traducir esta instrucción IF en lenguaje ensamblador es utilizar una instrucción CMP seguida de uno o más saltos condicionales. Como op1 y op2 son operandos de memoria, hay que mover
uno de ellos a un registro antes de ejecutar la instrucción CMP. El siguiente
código implementa la instrucción IF de la manera más eficiente posible,
invirtiendo la condición de igualdad y usando la instrucción JNE:
mov eax,op1
cmp eax,op2 ; ¿op1 == op2?
jne L1 ;
sí: salta a L1
jmp L2 ;
no: salta las asignaciones
mov X,1 ;
sí: asigna X y Y
Si implementamos el operador
usando JE, el código resultante será menos compacto (seis instrucciones,
en vez de cinco):
mov eax,op1
cmp eax,op2 ;
¿op1 == op2?
je L1 ;
sí: salta a L1
jmp L2 ; no: salta las asignaciones
mov X,1 ;
sí: asigna X y Y
LOOPS
Las instrucciones de bucle se usan para realizar estructuras repetitivas, y utilizan el registro CX como contador.
instruction | operation and jump condition | opposite instruction |
LOOP | decrease cx, jump to label if cx not zero. | DEC CX and JCXZ |
LOOPE | decrease cx, jump to label if cx not zero and equal (zf = 1). | LOOPNE |
LOOPNE | decrease cx, jump to label if cx not zero and not equal (zf = 0). | LOOPE |
LOOPNZ | decrease cx, jump to label if cx not zero and zf = 0. | LOOPZ |
LOOPZ | decrease cx, jump to label if cx not zero and zf = 1. | LOOPNZ |
JCXZ | jump to label if cx is zero. | OR CX, CX and JNZ |
Las instrucciones de bucle se usan para realizar estructuras repetitivas, y utilizan el registro CX como contador.
LOOP esta instrucción hace que el programa salte a la dirección especificada (salto dentro del segmento), mientras que CX sea distinto de 0 y decrementa CX en 1 cada vez.
LOOP salto
Ejemplo:
MOV CX, 100
COMIENZO: …
…
LOOP COMIENZO; este bucle se repite 100
LOOPNE/LOOPNZ: esta instrucción salta a la dirección especificada mientras que CX sea distinto de 0 y si ZF = 0.
LOOPNE/LOOPNZ salto
Esta instrucción proporciona una ruptura del bucle adicional.
LOOPE/LOOPZ esta instrucción actúa como la anterior pero la condición adicional es ZF = 1.
LOOPE/LOOPZ salto
JCXZ esta instrucción realiza un salto si CX = 0.
JCXZ salto
Ninguna de estas instrucciones afecta al registro de estado.