Las instrucciones del ensamblador
Instrucciones de transferencia Son utilizadas para
mover los contenidos de los operandos. Cada instrucción se puede usar con
diferentes modos de direccionamiento.
Instrucciones de carga Son instrucciones
específicas de los registros. Son usadas para cargar en algœn registro bytes o
cadenas de bytes.
Instrucciones de la pila Estas instrucciones
permiten el uso de la pila para almacenar y extraer datos.
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:
Destino: memoria.
Fuente: acumulador
Destino:
acumulador. Fuente: memoria
Destino: registro
de segmento. Fuente: memoria/registro
Destino:
memoria/registro. Fuente: registro de segmento
Destino: registro.
Fuente: registro
Destino: registro.
Fuente: memoria
Destino: memoria.
Fuente: registro
Destino: registro.
Fuente: dato inmediato
Destino: memoria.
Fuente: dato inmediato
Ejemplo:
MOV AX,0006h
MOV BX,AX
MOV AX,4C00h
INT 21H
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:
MOV SI, OFFSET
VAR1
MOV DI, OFFSET
VAR2
MOVS
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.
MOV SI, OFFSET
VAR1
LODS
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:
BIT BANDERA
0 CF
2 PF
4 AF
6 ZF
7 SF
8 TF
9 IF
10 DF
11 OF
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 lógicas. Son utilizadas para realizar
operaciones lógicas sobre los operandos.
Instrucciones aritméticas. Se usan para realizar
operaciones aritméticas sobre los operandos.
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:
Fuente Destino |
Destino
--------------------------
1 1 | 1
1 0 | 0
0 1 | 0
0 0 | 0
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:
Fuente Destino |
Destino
--------------------------
1 1 | 1
1 0 | 1
0 1 | 1
0 0 | 0
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.
Fuente Destino |
Destino
--------------------------
1 1 | 0
0 0 | 1
0 1 | 1
0 0 | 0
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.
Instrucciones de salto Son utilizadas para
transferir el flujo del proceso al operando indicado.
Instrucciones para ciclos: LOOP Transfieren el
flujo del proceso, condicional o incondicionalmente, a un destino repitiendose
esta acción hasta que el contador sea cero.
Instrucciones de conteo Se utilizan para
decrementar o incrementar el contenido de los contadores.
Instrucciones de comparación Son usadas para
comparar operandos, afectan al contenido de las banderas.
Instrucciones de banderas Afectan directamente al
contenido de las banderas.
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 ).
No hay comentarios:
Publicar un comentario