Documentos de Académico
Documentos de Profesional
Documentos de Cultura
El microprocesador Z-80 dispone de una unidad aritmética-lógica que le permite realizar una serie
de operaciones, tanto aritméticas, como lógicas.
Las aritméticas incluyen la suma y resta con o sin acarreo, incremento y decremento de un
registro, comparaciones, ajuste decimal, complemento y negación.
Las lógicas incluyen las operaciones que se realizan con los operadores ͞AND͟, ͞OR͟ y ͞XOR͟.
Instrucciones lógicas:
AND
NEG
NOT
OR
TEST
XOR
Instrucciones aritméticas:
ADC
ADD
DIV
IDIV
MUL
IMUL
SBB
SUB
Instrucción AND
Sintaxis:
Con esta instrucción se lleva a cabo la operación ͞y͟ lógica de los dos operandos:
--------------------------------------------------------------------------------
11|1
10|0
01|0
00|0
Instrucción NEG
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
Instrucción NOT
Propósito: Lleva a cabo la negación bit por bit del operando destino.
Sintaxis:
NOT destino
Instrucción OR
Sintaxis:
OR destino, fuente
La instrucción OR lleva a cabo, bit por bit, la disyunción inclusiva lógica de los dos operandos:
--------------------------------------------------------------------------------
11|1
10|1
01|1
00|0
Instrucción TEST
Sintaxis:
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.
Instrucción XOR
Propósito: OR exclusivo
Sintaxis:
Su función es efectuar bit por bit la disyunción exclusiva lógica de los dos operandos.
Fuente Destino | Destino
---------
11|0
00|1
01|1
00|0
Instrucción ADC
Sintaxis:
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.
Instrucción ADD
Sintaxis:
Instrucción DIV
Sintaxis:
DIV fuente
Instrucción IDIV
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.
Instrucción MUL
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.
Instrucción IMUL
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.
Instrucción SBB
Esta instrucción resta los operandos y resta uno al resultado si CF está activada. El operando
fuente siempre se resta del destino.
Instrucción SUB
Propósito: Substracción
Sintaxis:
Instrucciones De Comparacion
Instrucciones de salto Son utilizadas para transferir el flujo del proceso al operando indicado.
JMP JA (JNBE) JAE (JNBE) JB (JNAE) JBE (JNA) JE (JZ) JNE (JNZ) JG (JNLE) JGE (JNL) JL (JNGE) JLE (JNG)
JC JNC JNO JNP (JPO) JNS JO JP (JPE) JS
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.
DEC INC
Instrucciones de comparación Son usadas para comparar operandos, afectan al contenido de las
banderas.
Instrucción JMP
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.
Instrucción JA (JNBE)
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).
Sintaxis:
JAE etiqueta
Instrucción JB (JNAE)
Sintaxis:
JB etiqueta
Salta si está abajo o salta si no está arriba o si no es igual.
Sintaxis:
JBE etiqueta
El salto se efectúa si CF está activado o si ZF está activado (que cualquiera sea igual a 1).
Instrucción JE (JZ)
Sintaxis:
JE etiqueta
Sintaxis:
JNE etiqueta
Instrucción JG (JNLE)
Sintaxis:
JG etiqueta
Salta si es más grande o salta si no es menor o igual.
Sintaxis:
JGE etiqueta
El salto se realiza si SF = OF
Instrucción JL (JNGE)
Sintaxis:
JL etiqueta
Sintaxis:
JLE etiqueta
Instrucción JC
Sintaxis:
JC etiqueta
Salta si hay acarreo.
El salto se realiza si CF = 1
Instrucción JNC
Sintaxis:
JNC etiqueta
El salto se efectúa si CF = 0.
Instrucción JNO
Sintaxis:
JNO etiqueta
El salto se efectua si OF = 0.
Sintaxis:
JNP etiqueta
El salto ocurre si PF = 0.
Instrucción JNS
Sintaxis:
JNP etiqueta
Salta si el signo esta desactivado.
El salto se efectúa si SF = 0.
Instrucción JO
Sintaxis:
JO etiqueta
El salto se realiza si OF = 1.
Instrucción JP (JPE)
Sintaxis:
JP etiqueta
El salto se efectúa si PF = 1.
Instrucción JS
Sintaxis:
JS etiqueta
El salto se efectúa si SF = 1.
Instrucción LOOP
Sintaxis:
LOOP etiqueta
La instrucción loopdecrementa CX en 1, y transfiere el flujo del programa a la etiqueta dada como
operando si CX es diferente a 1.
Instrucción LOOPE
Sintaxis:
LOOPE etiqueta
Instrucción LOOPNE
Sintaxis:
LOOPNE etiqueta
Esta instrucción decrementa en uno a CX y transfiere el flujo del programa solo si ZF es diferente a
0.
Instrucción DEC
Sintaxis:
DEC destino
Esta operación resta 1 al operando destino y almacena el nuevo valor en el mismo oeprando.
Instrucción INC
Sintaxis:
INC destino
Instrucción CMP
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.
Sintaxis:
Se utilizan DI como indice para el segmento extra de la cadena fuente y SI como indice de la
cadena destino.
Instrucción CLC
Sintaxis:
CLC
Esta instrucción apaga el bit correspondiente a la bandera de acarreo, o sea, lo pone en cero.
Instrucción CLD
Sintaxis:
CLD
Instrucción CLI
Sintaxis:
CLI
Instrucción CMC
Sintaxis:
CMC
Instrucción STC
Sintaxis:
STC
Instrucción STD
Sintaxis:
STD
Sintaxis:
STI
La instrucción activa la bandera IF, esto habilita las interrupciones externas enmascarables (las que
funcionan unicamente cuando IF = 1 ).
Instrucciones De Saltos
Empecemos por el salto sin condiciones, con el que podremos cambiar el control a cualquier punto
del programa.
Sería como el ͞Goto͟ del Basic, símplemente transferir el control a otro punto del programa. La
orden es
Si record is a estas alturas los registros CS:IP, se podra ver que͢ es lo que hace realmente la
instrucción, y no es mas que incrementar o decrementar IP para llegar a la zona del programa a la
que queremos transferir el control ( IP es el Offset que indica la zona de memoria que contiene la
siguiente instrucción a ejecutar, y CS el segmento )
El formato mas sencillo para el salto sería JMP 03424h, lo que saltaría a esa zona.
Pero es digamos que ͞algo pesado͟ calcular en que͢ dirección va a estar esa instrucción, con lo que
utilizaremos etiquetas. Aquí hay un ejemplo, en el que de paso se repasa un poco:
MOV AX,0CC34h
MOV CL,22h
JMP PALANTE
JMP FIN
JMP VUELVE
La etiqueta ha de estar continuada por dos puntos ͚:͛, y puede ser llamada desde cualquier lugar
del programa. Tambi͢n podremos hacer un MOV AX,[PALANTE], como hacíamos antes con un MOV
AX,[BX], pero asignando a AX el valor que haya en la dirección en la que esta ͞PALANTE͟.
El caso, que tras el salto a ͞PALANTE͟, se copia el valor del registro BX en AX, y se vuelve a
͞VUELVE͟. Se realiza una comparación entre AX y BX, que pondr el flag de cero a 1 ( recordemos la
anterior lección ), se saltar a ͞FIN͟, donde tan sólo se realizar la orden Xor CX,CX cuyo resultado,
por cierto, es poner CX a cero tenga el valor que tenga ( y esto se utilizar bastante programando,
por eso me ha dado por incluir la orden )
Volvamos con la sintaxis del JMP con algunos ejemplos de como utilizarlo:
JMP 100h
Salta a la dirección 100h. Un archivo .COM comienza normalmente en esa dirección, así que quiz lo
ve is en algunos virus.
JMP 542Ah:100h
Salta a la dirección 100h pero del segmento 542Ah. ¨ Os acordais aún de los Segments y Offsets?.
Se trata de un salto lejano.
Salto corto a la dirección 223Ah. Tranquilidad, ahora explico lo de salto corto, lejano,͙
JMP [100h]
bytes ) a la que apunta BX. O sea, si BX valiese 300h y en 300h los dos
Ahora voy a contar algo sobre los saltos lejanos, cercanos y cortos. El
sea, que la cantidad que se puede contener en un byte con signo. A veces
bytes, o sea, que el rango sería desde 32767 a о32768 bytes de distancia.
SALTOS CONDICIONALES
determinado.
las instrucciones ):
cero.
JC, JNAE, JB: Los tres sirven para lo mismo. Significan: Jump if Carry,
equivalente a < en una operación sin signo. Vamos, que si se compara así:
CMP 13h,18h, saltar , ya que 13h es menor que 18h. Tambi͢n se suelen usar
JNC, JAE, JNB: Otros tres que valen ex ctamente para lo mismo. Jump if
not Carry, Jump if Above or Equal y Jump if Not Below. Saltan por tanto si
JNZ o JNE: Jump if Not Zero o Jump if Not Equal. Salta si el flag de cero
segundo ( <= )
paridadest a uno.
JNP, JPO: Jump if Not Parity, Jump if Parity Odd. Salta si el flag de
paridadest a cero.
parrafito con uno, aunque algunos se usen poco, pero como veis para una
misma instrucción hay varios,͙ y para gustos no hay nada escrito, lo mismo
Vamos, que despu͢s de toda ͢sta aridez me temo que voy a tener que poner
MOV AX,1111h
MOV BX,1112h
CMP AX,BX
Espero que con ͢esto haya aclarado un poco la utilidad de los saltos.
Por cierto, que en los saltos condicionales se puede hacer como en los
JE 0022h
JNE 0030h
JNO AL
BUCLES
orden LOOP. Lo que hace ͢esta orden es comparar CX con cero; si es igual,
MOV CX,0005h
bucle: INC DX
CMP DX,0000h
JE Acaba
LOOP bucle
Acaba: ͙
Veamos como funciona ͢este programa. Se mueve a CX el valor 5h, que van
a ser las veces que se repita el bucle. Ahora, llegamos al cuerpo del bucle.
LOOP 0003h
LOOP [AL]
Y en fin, hemos terminado con los condicionales. Parece muy rido, pero
Macro, del griego ʅɲʃʌʉ significa ͞grande͟. En el ámbito informático es la abreviatura del término
͞macroinstrucción͟.
Una macro o macroinstrucción es una serie de instrucciones que se almacenan para que se
puedan ejecutar de forma secuencial mediante una sola llamada u orden de ejecución.
CARACTERISTICAS
Una macroinstrucción es por tanto una instrucción compleja, formada por otras instrucciones más
sencillas.
Además tiene que estar almacenada, el término no se aplica a una serie de instrucciones escritas
en la linea de comandos enlazadas unas con otras por redirección de sus resultados (piping) o para
su ejecución consecutiva.
Las macros suelen almacenarse en el ámbito del propio programa que las utiliza y se ejecutan
pulsando una combinación especial de teclas.
MACROS DE APLICACIONES
Las macros son grupos de instrucciones que tienen un seguimiento cronológico usadas para
economizar tareas; una macro no es más que un conjunto de instrucciones tales como ͞borrar
archivo͟, ͞añadir registro͟, etc., y que se almacenan en una ubicación especial (por ejemplo en
Microsoft Access observamos que hay una zona para crear macros, una macro en Access
trabajando para una base de datos podría ser un archivo que al llamarse desde otra instrucción:
borrara los registros de un cliente o accionista, luego borrara ciertos registros en otras tablas,
extraerá su información de un log, entre otras cosas.
MACROZ EN PROGRAMACION
Con el fin de evitar al programador la tediosa repetición de partes idénticas de un programa, los
ensambladores y compiladores cuentan con macroprocesadores que permiten definir una
abreviatura para representar una parte de un programa y utilizar esa abreviatura cuantas veces
sea necesario. Para utilizar una macro, primero hay que declararla. En la declaración se establece
el nombre que se le dará a la macro y el conjunto de instrucciones que representará.
El programador escribirá el nombre de la macro en cada uno de los lugares donde se requiera la
aplicación de las instrucciones por ella representadas. La declaración se realiza una sola vez, pero
la utilización o invocación a la macro (macrollamada) puede hacerse cuantas veces sea necesario.
La utilización de macros posibilita la reducción del tamaño del código fuente, aunque el código
objeto tiende a ser mayor que cuando se utilizan funciones.
Es tan común el empleo de macroinstrucciones que se les considera como una extensión de los
lenguajes. De manera similar se considera al procesador de macroinstrucciones o
macroprocesador como una extensión del ensamblador o compilador utilizado. El
macroprocesador se encarga, en una primera pasada, de registrar todas las declaraciones de
macros y de rastrear el programa fuente para detectar todas las macrollamadas. En cada lugar
donde encuentre una macro llamada, el macroprocesador hará la sustitución por las instrucciones
correspondientes. A este proceso de sustitución se le denomina expansión de la macro. El
macroprocesador elabora dos tablas para el manejo de las macros.
Interrupciones Ensamblador
Definición y Tipos de Interrupciones.
La primera cosa de todas, ¿qué son las interrupciones?, bien, las interrupciones son un
͞mecanísmo͟ por medio del cual hacemos que la CPU deje la tarea en la que estaba para que se
vaya a ocupar de otra cosa distinta, es decir, es una forma de llamar la atención de la CPU de tal
forma que cada dispositivo cuando necesita ser atendido por la CPU, emite una interrupción o
señal haciendo que la CPU vaya a atenderla de inmediato. Esto es importantísimo ya que de no
existir interrupciones, la CPU debería de ir preguntando, cada cierto tiempo, a los dispositivos para
ver si necesitan de su intervención y como podeis suponer, eso significaría lentitud, mucha
lentitud. Por tanto, quedaros con que las interrupciones sirven para controlar el hardware, ya que
son las que llaman a la CPU cuando este, el hardware, necesita la intervención de la misma.
La Tabla de Vectores de Interrupciones. Seguro que alguno se ha preguntado, ͞si cuando llamamos
a una interrupción se ejecuta una determinada rutina͙¿dónde narices se encuentra esta rutina?,
es más, ¿cómo sabe nuestra CPU dónde encontrarla?.͟ Bien, la respuesta a estas dos preguntas (y
muchas más) se encuentra en la tabla de vectores de interrupción. Dicha tabla es una estructura
que se crea durante la inicialización del ordenador y se coloca, en el principio de nuestra memoria
(segmento 0 y desplazamiento 0). Dicha estrucutura ocupa y de forma justa 1Kb, ya que dispone
de 256 entradas de 4 bytes cada una. Lo importante de todo esto es que, dicha estructura,
almacena la dirección, en memoria, de las distintas rutinas que van ligadas a las distintas
interrupciones, de tal modo que cuando invocamos, mediante interrupción software, o se invoca,
mediante hardware, una interrupción, lo que se hace es utilizar un índice que va ligado a la
interrupción, de tal manera que, con dicho índice, se acude a la tabla de vectores de interrupción
para que el sistema encuentre la dirección de la rutina en dónde se encuentra el verdadero
tratamiento a la interrupción, es decir, si se produce la interrupción x, lo que se hace es acudir a la
tabla con el índice x para encontrar la entrada (recordar que eran 256 entradas con 4 bytes cada
una) que contiene la dirección en memoria de la rutina que sirve para tratar a la interrupción de
índice x. Como cada entrada es de 4 bytes, es fácil adivinar que dichos 4 bytes forman la dirección,
ya que 2 de esos bytes se utilizan como segmento y los otros 2 como desplazamiento, total, que ya
tenemos la dirección de memoria con la rutina que hay que utilizar.