Parte IV
Instrucciones
Propósito: Transferencia de datos
entre celdas de memoria, registros y acumulador. Sintaxis: MOV Destino,Fuente Donde Destino es el lugar a donde
se moverán los datos y fuente es el lugar donde se encuentran dichos datos. Los diferentes movimientos de datos
permitidos para esta instrucción son:
Ejemplo:
Este pequeño programa mueve el valor
0006H al registro AX, luego mueve el contenido de AX (0006h) al registro BX,
por último mueve el valor 4C00h al registro AX para terminar la ejecución con
la opción 4C de la interrupción 21h. Propósito: Mover cadenas de bytes
o palabras desde la fuente, direccionada por SI, hasta el destino direccionado
por DI. Sintaxis: MOVS Este comando no necesita parametros
ya que toma como dirección fuente el contenido del registro SI y como destino
el contenido de DI. La secuencia de instrucciones siguiente ilustran esto:
Primero inicializamos los valores
de SI y DI con las direcciones de las variables VAR1 y VAR2 respectivamente,
despues al ejecutar MOVS se copia el contenido de VAR1 a VAR2. Los comandos MOVSB y MOVSW se utilizan
de la misma forma que MOVS, el primero mueve un byte y el segundo una palabra.
Propósito: Cargar cadenas de un byte
o palabra al acumulador. Sintaxis: LODS Esta instrucción toma la cadena que
se encuentre en la dirección especificada por SI, la carga al registro AL (o
AX) y suma o resta 1 (segun el estado de DF) a SI si la transferencia es de
bytes o 2 si la transferencia es de palabras.
La primer linea carga la dirección
de VAR1 en SI y la segunda linea lleva el contenido de esa localidad al registro
AL. Los comandos LODSB y LODSW se utilizan
de la misma forma, el primero carga un byte y el segundo una palabra (utiliza
el registro completo AX). Propósito: Transfiere al registro
AH el contenido de las banderas Sintaxis: LAHF Esta instrucción es útil para verificar
el estado de las banderas durante la ejecución de nuestro programa. Las banderas quedan en el siguiente
orden dentro del registro: SF ZF ¿? AF ¿? PF ¿? CF El simbolo "¿?" significa
que en esos bits habrá. un valor indefinido. Propósito: Cargar el registro del
segmento de datos Sintaxis: LDS destino, fuente
El operando fuente debe ser una palabra
doble en memoria. La palabra asociada con la dirección mas grande es transferida
a DS, o sea que se toma como la dirección del segmento. La palabra asociada
con la dirección menor es la dirección del desplazamiento y se deposita en el
registro señalado como destino. Propósito: Carga la dirección del
operando fuente. Sintaxis: LEA destino, fuente El operando fuente debe estar ubicado
en memoria, y se coloca su desplazamiento en el registro índice o apuntador
especificado en destino. Para ilustrar una de las facilidades
que tenemos con este comando pongamos una equivalencia: MOV SI, OFFSET VAR1 Equivale a: LEA SI, VAR1 Es muy probable que para el programador
sea mas sencillo crear programas extensos utilizando este último formato. Propósito: Carga el registro del segmento
extra Sintaxis: LES destino, fuente El operando fuente debe ser un operando
en memoria de palabra doble. El contenido de la palabra con la dirección mayor
se interpreta como la dirección del segmento y se coloca en ES. La palabra con
la dirección menor es la dirección del desplazamiento y se coloca en el registro
especificado en el parámetro destino. Propósito: Recupera un dato de la
pila Sintaxis: POP destino Esta instrucción transfiere el último
valor almacenado en la pila al operando destino, despues incrementa en dos el
registro SP. Este incremento se debe a que la pila
va creciendo desde la dirección mas alta de memoria del segmento hacia la mas
baja, y la pila solo trabaja con palabras (2 bytes), entonces al incrementar
en dos el registro SP realmente se le esta restando dos al tamaño real de la
pila. Propósito: Extrae las banderas almacenadas
en la pila. Sintaxis: POPF Este comando transfiere bits de la
palabra almacenada en la parte superior de la pila hacia el registro de banderas. La forma de transferencia es la siguiente: Estas localizaciones son las mismas
para el comando PUSHF Una vez hecha la transferencia se
incrementa en 2 el registro SP disminuyendo así el tamaño de la pila. Propósito: Coloca una palabra en la
pila. Sintaxis: PUSH fuente La instrucción PUSH decrementa en
dos el valor de SP y luego transfiere el contenido del operando fuente a la
nueva dirección resultante en el registro recién modificado. El decremento en la dirección se debe
a que al agregar valores a la pila ésta crece de la dirección mayor a la dirección
menor del segmento, por lo tanto al restarle 2 al valor del registro SP lo que
hacemos es aumentar el tamaño de la pila en dos bytes, que es la única cantidad
de información que puede manejar la pila en cada entrada y salida de datos.
Propósito: Coloca el valor de las
banderas en la pila Sintaxis: PUSHF Este comando decrementa en 2 el valor
del registro SP y luego se transfiere el contenido del registro de banderas
a la pila, en la dirección indicada por SP. Las banderas quedan almacenadas en
memoria en los mismos bits indicados en el comando POPF
Instrucciones de transferencia
Instrucciones de la pila
Instrucción
MOV
Instrucción
MOVS (MOVSB) (MOVSW)
Instrucción
LODS (LODSB) (LODSW)
Instrucción
LAHF
Instrucción
LDS
Instrucción
LEA
Instrucción
LES
Instrucción
POP
Instrucción
POPF
Instrucción
PUSH
Instrucción
PUSHF
Propósito: Realiza la conjunción de los operandos bit por bit.
Sintaxis:
AND destino, fuente
Con esta instrucción se lleva a cabo la operación "y" lógica de los dos operandos:
El resultado de la operación se almacena en el operando destino.
Propósito: Genera el complemento a 2
Sintaxis:
NEG destino
Esta instrucción genera el complemento a 2 del operando destino y lo almacena en este mismo operando. Por ejemplo, si AX guarda el valor de 1234H, entonces:
NEG AX
Nos dejaría almacenado en el registro AX el valor EDCCH.
Propósito: Lleva a cabo la negación bit por bit del operando destino.
Sintaxis:
NOT destino
El resultado se guarda en el mismo operando destino.
Propósito: OR inclusivo lógico
Sintaxis:
OR destino, fuente
La instrucción OR lleva a cabo, bit por bit, la disyunción inclusiva lógica de los dos operandos:
Propósito: Comparar logicamente los operandos
Sintaxis:
TEST destino, fuente
Realiza una conjunción, bit por bit, de los operandos, pero a diferencia de AND esta instrucción no coloca el resultado en el operando destino, solo tiene efecto sobre el estado de las banderas.
Propósito: OR exclusivo
Sintaxis:
XOR destino, fuente
Su función es efectuar bit por bit la disyunción exclusiva lógica de los dos operandos.
Propósito: Adición con acarreo.
Sintaxis:
ADC destino, fuente
Lleva a cabo la suma de dos operandos y suma uno al resultado en caso de que la bandera CF esté activada, esto es, en caso de que exista acarreo.
El resultado se guarda en el operando destino.
Propósito: Adición de los operandos.
Sintaxis:
ADD destino, fuente
Suma los dos operandos y guarda el resultado en el operando destino.
Propósito: División sin signo
Sintaxis:
DIV fuente
El divisor puede ser un byte o palabra y es el operando que se le da a la instrucción.
Si el divisor es de 8 bits se toma como dividendo el registro de 16 bits AX y si el divisor es de 16 bits se tomara como dividendo el registro par DX:AX, tomando como palabra alta DX y como baja AX.
Si el divisor fué un byte el cociente se almacena en el registro AL y el residuo en AH, si fué una palabra el cociente se guarda en AX y el residuo en DX.
Propósito: División con signo
Sintaxis:
IDIV fuente
Consiste basicamente en lo mismo que la instrucción DIV, solo que esta última realiza la operación con signo.
Para sus resultados utiliza los mismos registros que la instrucción DIV.
Propósito: Multiplicación sin signo
Sintaxis:
MUL fuente
El ensamblador asume que el multiplicando sera del mismo tamaño que el del multiplicador, por lo tanto multiplica el valor almacenado en el registro que se le da como operando por el que se encuentre contenido en AH si el multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits.
Cuando se realiza una multiplicación con valores de 8 bits el resultado se almacena en el registro AX y cuando la multiplicación es con valores de 16 bits el resultado se almacena en el registro par DX:AX.
Propósito: Multiplicación de dos enteros con signo.
Sintaxis:
IMUL fuente
Este comando hace lo mismo que el anterior, solo que si toma en cuenta los signos de las cantidades que se multiplican.
Los resultados se guardan en los mismos registros que en la instrucción MUL.
Propósito: Substracción con acarreo
Sintaxis:
SBB destino, fuente
Esta instrucción resta los operandos y resta uno al resultado si CF está activada. El operando fuente siempre se resta del destino.
Este tipo de substracción se utiliza cuando se trabaja con cantidades de 32 bits.
Propósito: Substracción
Sintaxis:
SUB destino, fuente
Resta el operando fuente del destino.
Propósito: Salto incondicional
Sintaxis:
JMP destino
Esta instrucción se utiliza para desviar el flujo de un programa sin tomar en cuenta las condiciones actuales de las banderas ni de los datos.
Propósito: Brinco condicional
Sintaxis:
JA Etiqueta
Después de una comparación este comando salta si está arriba o salta si no está abajo o si no es igual.
Esto significa que el salto se realiza solo si la bandera CF esta desactivada o si la bandera ZF esta desactivada (que alguna de las dos sea igual a cero).
Propósito: salto condicional
Sintaxis:
JAE etiqueta
Salta si está arriba o si es igual o salta si no está abajo.
El salto se efectua si CF esta desactivada.
Propósito: salto condicional
Sintaxis:
JB etiqueta
Salta si está abajo o salta si no está arriba o si no es igual.
Se efectúa el salto si CF esta activada.
Propósito: salto condicional
Sintaxis:
JBE etiqueta
Salta si está abajo o si es igual o salta si no está arriba.
El salto se efectúa si CF está activado o si ZF está activado (que cualquiera sea igual a 1).
Propósito: salto condicional
Sintaxis:
JE etiqueta
Salta si es igual o salta si es cero.
El salto se realiza si ZF está activada.
Propósito: salto condicional
Sintaxis:
JNE etiqueta
Salta si no es igual o salta si no es cero.
El salto se efectua si ZF está desactivada.
Propósito: salto condicional, se toma en cuenta el signo.
Sintaxis:
JG etiqueta
Salta si es más grande o salta si no es menor o igual.
El salto ocurre si ZF = 0 u OF = SF.
Propósito: salto condicional, se toma en cuenta el signo.
Sintaxis:
JGE etiqueta
Salta si es más grande o igual o salta si no es menor que.
El salto se realiza si SF = OF
Propósito: salto condicional, se toma en cuenta el signo.
Sintaxis:
JL etiqueta
Salta si es menor que o salta si no es mayor o igual.
El salto se efectúa si SF es diferente a OF.
Propósito: salto condicional, se toma en cuenta el signo.
Sintaxis:
JLE etiqueta
Salta si es menor o igual o salta si no es más grande.
El salto se realiza si ZF = 1 o si SF es diferente a OF
Propósito: salto condicional, se toman en cuenta las banderas.
Sintaxis:
JC etiqueta
Salta si hay acarreo.
El salto se realiza si CF = 1
Propósito: salto condicional, se toma en cuenta el estado de las banderas.
Sintaxis:
JNC etiqueta
Salta si no hay acarreo.
El salto se efectúa si CF = 0.
Propósito: salto condicional, se toma en cuenta el estado de las banderas.
Sintaxis:
JNO etiqueta
Salta si no hay desbordamiento.
El salto se efectua si OF = 0.
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis:
JNP etiqueta
Salta si no hay paridad o salta si la paridad es non.
El salto ocurre si PF = 0.
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis:
JNP etiqueta
Salta si el signo esta desactivado.
El salto se efectúa si SF = 0.
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis:
JO etiqueta
Salta si hay desbordamiento (overflow).
El salto se realiza si OF = 1.
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis:
JP etiqueta
Salta si hay paridad o salta si la paridad es par.
El salto se efectúa si PF = 1.
Propósito: salto condicional, toma en cuenta el estado de las banderas.
Sintaxis:
JS etiqueta
Salta si el signo está prendido.
El salto se efectúa si SF = 1.
Propósito: Generar un ciclo en el programa.
Sintaxis:
LOOP etiqueta
La instrucción loop decrementa CX en 1, y transfiere el flujo del programa a la etiqueta dada como operando si CX es diferente a 1.
Propósito: Generar un ciclo en el programa considerando el estado de ZF
Sintaxis:
LOOPE etiqueta
Esta instrucción decrementa CX en 1. Si CX es diferente a cero y ZF es igual a 1, entonces el flujo del programa se transfiere a la etiqueta indicada como operando.
Propósito: Generar un ciclo en el programa, considerando el estado de ZF
Sintaxis:
LOOPNE etiqueta
Esta instrucción decrementa en uno a CX y transfiere el flujo del programa solo si ZF es diferente a 0.
Propósito: Decrementar el operando
Sintaxis:
DEC destino
Esta operación resta 1 al operando destino y almacena el nuevo valor en el mismo oeprando.
Propósito: Incrementar el operando.
Sintaxis:
INC destino
La instrucción suma 1 al operando destino y guarda el resultado en el mismo operando destino.
Propósito: Comparar los operandos.
Sintaxis:
CMP destino, fuente
Esta instrucción resta el operando fuente al operando destino pero sin que éste almacene el resultado de la operación, solo se afecta el estado de las banderas.
Propósito: Comparar cadenas de un byte o palabra.
Sintaxis:
CMP destino, fuente
Con esta instrucción la cadena de caracteres fuente se resta de la cadena destino.
Se utilizan DI como indice para el segmento extra de la cadena fuente y SI como indice de la cadena destino.
Solo se afecta el contenido de las banderas y tanto DI como SI se incrementan.
Propósito: Limpiar bandera de acarreo.
Sintaxis:
CLC
Esta instrucción apaga el bit correspondiente a la bandera de acarreo, o sea, lo pone en cero.
Propósito: Limpiar bandera de dirección
Sintaxis:
CLD
La instrucción CLD pone en cero el bit correspondiente a la bandera de dirección.
Propósito: Limpiar bandera de interrupción
Sintaxis:
CLI
CLI pone en cero la bandera de interrupciones, desabilitando así aquellas interrupciones enmascarables.
Una interrupción enmascarable es aquella cuyas funciones son desactivadas cuando IF = 0.
Propósito: Complementar la bandera de acarreo.
Sintaxis:
CMC
Esta instrucción complementa el estado de la bandera CF, si CF = 0 la instrucción la iguala a 1, y si es 1 la instrucción la iguala a 0.
Podemos decir que unicamente "invierte" el valor de la bandera.
Propósito: Activar la bandera de acarreo.
Sintaxis:
STC
Esta instrucción pone la bandera CF en 1.
Propósito: Activar la bandera de dirección.
Sintaxis:
STD
La instrucción STD pone la bandera DF en 1.
Propósito: Acticar la bandera de interrupción.
Sintaxis:
STI
La instrucción activa la bandera IF, esto habilita las interrupciones externas enmascarables (las que funcionan unicamente cuando IF = 1 ).