Documentos de Académico
Documentos de Profesional
Documentos de Cultura
hexadecimal) a la parte baja del registro AX (AL). Cuando un operando es un valor de una direccin de memoria,
sta direccin se escribe entre corchetes, recordar que el operando 1 es el destino y el operando 2 es el origen. Y
cuando es una constante depender del ensamblador, en el caso del debug (Un programa que sirve para crear y editar
aplicaciones que viene con el DOS) se interpretarn como hexadecimales, en los siguientes ejemplos se interpretar
que las constantes son nmeros hexadecimales.
Tambin se puede tomar un valor de la memoria apuntado por un registro, por ejemplo:
MOV AL, [DI]
DI est apuntado al valor que est en la memoria que ser copiado al registro AL. El nombre MOV viene de la
palabra move, que es una palabra del ingles que significa mover. Justamente la instruccin mencionada significa,
mover el valor apuntado por DI a AL.
Tambin se puede copiar el valor de un registro a otro
MOV AL, BL
En este caso se copia el valor de BL a AL
Igualmente se puede copiar el valor de la parte baja de un registro a la parte alta de otro registro
MOV CH, DL
As como tambin operar con las partes altas
MOV AH, DH
Inclusive se puede copiar el valor de un registro a una direccin de memoria
MOV [1000], AL
Igualmente apuntada la direccin de memoria a DI
MOV [DI], AL
Y tambin con los registros completos (Solamente completos en el procesador 8086)
MOV AX, DX
Tambin trabajar con los registros completos para todos los procesadores de 32 bits
MOV EBX, EDX
En ste caso mueve la totalidad del registro DX a la totalidad del registro BX, en ste caso se est trabajando con los
registros en forma extendida (32 bits), pero hay que tener precaucin ya que el procesador 8086 no interpretar
correctamente sta instruccin (El procesador 8086 es obsoleto por sta desventaja y otras ms, por ejemplo slo
puede direccionar 1 MB), adems el debug no puede interpretar sta instruccin.
No se puede realizar lo siguiente porque no se pueden pasar valores en la memoria sin la intervencin de un registro,
adems no se ha especificado el tamao
MOV [1000], [2000]
Igualmente no se puede hacer lo siguiente
MOV [DI], [1000]
As como tambin lo siguiente
MOV [DI], [SI]
Sin embargo lo siguiente es correcto
MOV [1000], AX
Pero no lo siguiente porque no se est especificando el tamao
MOV [SI], 1F
Lo correcto sera lo siguiente
Si se quiere transferir un byte
MOV byte [SI], 1F
Si se quiere transferir una palabra (16 bits)
MOV word [SI], 1F
Si se quiere transferir una doble palabra (32 bits)
MOV dword [SI], 1F
Direccionamientos
Dado que es necesario transferir datos, existen los siguientes tipos de direccionamiento:
Valor de un registro Ejemplo: MOV AX, DX
Constante Ejemplo: MOV BX, 1AB
Valor apuntado por una constante Ejemplo: MOV AX, [1000]
Apuntado por un registro de segmento y uno de offset (Solo puede ser BX, BP, DI o SI) Ejemplo: MOV CX,
ES:[DI]
Apuntado por DS y la suma de BX con una constante o apuntado por SS y la suma de BP con una constante
Ejemplo: MOV DX, DS:[BP+1000]
Apuntado por DS y la suma de DI o SI con una constante Ejemplo: MOV BX, DS:[SI+6F9]
Apuntado por DS y la suma de BX y SI o BX y DI con una constante o apuntado por SS y la suma de BP y
SI o BP y DI con una constante
Ejemplos
MOV AX, DS:[BX][SI]+1FB9
probablemente se bloquear la PC hasta encontrar un carcter '$', inclusive puede ser que nunca lo encuentre.
A continuacin ensamblar las siguientes instrucciones (A partir de 0100h):
MOV AH, 09
MOV DX, 1000
INT 21
INT 20
Luego ejecutar el ejemplo con la orden "g"
El programa mostrar el mensaje "Hola mundo", luego el debug mostrar un mensaje diciendo que el programa ha
terminado normalmente.
Al provocar la interrupcin 21h se llama a un servicio de DOS, el nmero de servicio est determinado por la parte
alta de AX (AH).
El servicio 09h muestra la informacin en forma de carcteres a partir del comienzo apuntado por el registro DX (El
offset, en ste caso 1000h), muestra la informacin hasta el carcter anterior al carcter '$' (Anteriormente
mencionado).
Luego se provoca la interrupcin 20h que finaliza el programa.
La orden escribir del debug tambin acepta bytes individuales, por ejemplo:
E 3000 0, BF, 5F, C4
Tambin acepta en forma mixta (Bytes individuales y cadenas de carcteres)
E 3000 'JRJGOR', 0, 21, 'Ejd', 2F
Es decir la orden ensamblar est acompaada del offset de los datos a escribir y de los items.
Un item puede ser un byte individual o una cadena de carcteres (Que sta ltima debe estar entre simples comillas).
A veces un programa debe cambiar el flujo del programa en forma incondicional o bajo una condicin (Para tomar
una decisin), por lo tanto debe haber instrucciones que permitan cambiar el flujo de un programa sin ningn
requisito, o en caso de que una condicin se cumpla. Existen instrucciones para ste propsito. Son las instrucciones
de saltos incondicionales y condicionales, que saltan a un determinado punto si se cumpla la condicin.
Saltos incondicionales
La nica instruccin que existe para ste fin es JMP (Abreviatura de JUMP, que significa en ingls SALTAR). La
sintaxis es la siguiente.
JMP XXXX
XXXX: Es la ubicacin de la instruccin en donde se continuar el programa (A partir de sta se ejecutan las
siguientes).
Ejemplo:
XXXX:0100 MOV AX, 1000
XXXX:0103 JMP 0107
XXXX:0105 XOR AX, AX
XXXX:0107 INT 20
En ste caso al ejecutarse la instruccin de salto incondicional (JMP), se contina la ejecucin a partir de la
instruccin (INT 20h), no ejecutandose la instruccin XOR (sta instruccin realiza la operacin XOR de el
operando 2 sobre el operando 1) que provocara el borrado de registro AX (Que provocara que AX tome el valor 0),
si se ejecuta.
Es decir, se ejecutan las siguientes instrucciones:
MOV AX, 1000
JMP 0107
INT 20
No se ejecuta "XOR AX, AX" por el salto incondicional.
El operando puede ser una direccin constante (Por ejemplo 0107), un salto a nivel de offset, tambin puede ser un
salto largo (Que cambie los valores de los registros CS e IP), (Por ejemplo FFFF:0000, que salta al ROM BIOS).
Tambin puede ser el valor de un registro, por ejemplo:
JMP DI
En ste caso salta a la instruccin apuntada por DI.
Tambin puede ser un valor apuntado por un registro puntero, por ejemplo:
JMP [SI]
En ste caso salta a la instruccin apuntada por el valor apuntado por SI.
El operando puede ser cualquier direccionamiento vlido (Puede ser cualquiera de los direccionamientos utilizados en
el operando origen de la instruccin MOV, explicados anteriormente).
Comparaciones
Saltos condicionales
Son similares a JMP en la sintaxis, pero la diferencia es el nombre.
Las instrucciones son las siguientes:
JE o JZ: Salta si est prendido el bit Zero del registro de banderas.
Objetivo: Saltar si la ltima comparacin realizada da igual.
JA o JNBE: Salta si el bit carry (CF) o el bit zero (ZF) del registro de banderas est desactivado.
Objetivo: Saltar si la ltima comparacin realizada con nmeros naturales da mayor.
JB o JNAE: Salta si CF est activada.
Objetivo: Saltar si la ltima comparacin realizada con nmeros naturales da menor.
JG o JNLE: Salta si ZF es cero o si OF y SF son iguales.
Objetivo: Saltar si la ltima comparacin realizada con nmeros enteros da mayor.
JL o JNGE: Saltar si SF es diferente a OF
Objetivo: Saltar si la ltima comparacin realizada con nmeros enteros da menor.
JC: Saltar si CF est prendida
Objetivo: Saltar si hay acarreo
JO: Saltar si OF est prendido
Objetivo: Saltar si hay desbordamiento
JP: Saltar si PF est prendido
Objetivo: Saltar si hay paridad
JS: Saltar si SF est prendido
Objetivo: Saltar si es negativo
JNE o JNZ: Comportamiento inverso a JE o JZ
JNA o JBE: Comportamiento inverso a JA o JNBE
JNB o JAE: Comportamiento inverso a JB o JNAE
JNG o JLE: Comportamiento inverso a JG o JNLE
JNL o JGE: Comportamiento inverso a JL o JNGE
JNC: Comportamiento inverso a JC
JNO: Comportamiento inverso a JO
JNP o JPO: Comportamiento inverso a JP
JNS: Comportamiento inverso a JS
Hay otras instrucciones que hacen saltos condicionales, pero que no necesitan la instruccin CMP, son las siguientes:
JCXZ: Salta si el registro CX es cero.
LOOP: Decrementa CX, restndole 1 y salta si CX es distinto de cero.
Objetivo: Hacer un bucle, utilizando como contador CX
LOOPE: Decrementa CX en 1 y salta si CX es distinto de cero y ZF est prendido.
Objetivo: Hacer un bucle, utilizando como contador CX y terminar si el contador llega a cero, o se apaga el bit Zero.
LOOPNE: Decrementa CX en 1 y salta si ZF est prendido
Objetivo: Hacer un bucle que siga funcionando hasta que se apague el bit Zero.
La sintaxis de stas instrucciones son similares a la instruccin JMP, lo nico que cambia es el nombre.
Instruccin genrica para comparar[editar]
La instruccin es CMP, sta permite comparar 2 operandos, la sintaxis es la siguiente:
CMP <Operador 1>, <Operador 2>
El operador 1, se compara con el 2.
Los operandos pueden ser cualquier direccionamiento vlido, cumpliendo las reglas de la instruccin MOV con
respecto a los operandos.
sta instruccin compara 2 operandos y luego cambia el registro de banderas en base al resultado de la comparacin.