martes, 20 de abril de 2010

INSTRUCCIONES DE LENGUAJE ENSAMBLADOR

1.- Instrucciones aritméticas

Instrucciones lógicas. Son utilizadas para realizar operaciones lógicas sobre los operandos.

AND
NEG
NOT
OR
TEST
XOR

Instrucciones aritméticas. Se usan para realizar operaciones aritméticas sobre los operandos.

ADC
ADD
DIV
IDIV
MUL
IMUL
SBB
SUB

Instrucción ADC

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.
Instrucción ADD

Propósito: Adición de los operandos.

Sintaxis:

ADD destino, fuente

Suma los dos operandos y guarda el resultado en el operando destino.
Instrucción DIV

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.
Instrucción IDIV

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.
Instrucción MUL

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.
Instrucción IMUL

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.
Instrucción SBB

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.
Instrucción SUB

Propósito: Substracción

Sintaxis:

SUB destino, fuente Resta el operando fuente del destino.

http://www.monografias.com/trabajos32/microcontroladores/Image4748.gif


2.- Instrucciones de comparación

Compare


CMP


Compara 2 valores binarios sin signo almacenados en un canal especificado y envía el resultado a los indicadores aritméticos del área auxiliar

Double compare


CMPL 060


Compara 2 valores binarios sin signo almacenados en dos canales especificados y envía el resultado a los indicadores aritméticos del área auxiliar

Signed binary compare


CPS 114


Compara 2 valores binarios con signo almacenados en un canal especificado y envía el resultado a los indicadores aritméticos del área auxiliar

Double signed binary compare


CPSL 115


Compara 2 valores binarios con signo almacenados en dos canales especificados y envía el resultado a los indicadores aritméticos del área auxiliar

Table Compare


TCMP 085


Compara el valor de un canal con el de 16 canales consecutivos, poniendo a ON el bit correspondiente del canal de resultado

Multiple Compare


MCMP 019


Compara el contenido de 16 canales consecutivos con el de otros 16 canales consecutivos, poniendo a ON el bit correspondiente en el canal de resultado donde los contenidos de los canales no son iguales

Block Compare


BCMP 068


Determina si el valor de un canal está en el rango predeterminado

http://spilledpak.files.wordpress.com/2008/03/anzuelo31.png


3.- Instrucciones de salto
Las instrucciones del ensamblador

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.

LOOP
LOOPE
LOOPNE

Instrucciones de conteo Se utilizan para decrementar o incrementar el contenido de los contadores.

DEC
INC

Instrucciones de comparación Son usadas para comparar operandos, afectan al contenido de las banderas.

CMP
CMPS (CMPSB) (CMPSW)

Instrucciones de banderas Afectan directamente al contenido de las banderas.

CLC
CLD
CLI
CMC
STC
STD
STI

Instrucción JMP

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.
Instrucción JA (JNBE)

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).
Instrucción JAE (JNB)

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.
Instrucción JB (JNAE)

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.
Instrucción JBE (JNA)

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).
Instrucción JE (JZ)

Propósito: salto condicional

Sintaxis:

JE etiqueta

Salta si es igual o salta si es cero.

El salto se realiza si ZF está activada.
Instrucción JNE (JNZ)

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.
Instrucción JG (JNLE)

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.
Instrucción JGE (JNL)

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
Instrucción JL (JNGE)

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.
Instrucción JLE (JNG)

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
Instrucción JC

Propósito: salto condicional, se toman en cuenta las banderas.

Sintaxis:

JC etiqueta

Salta si hay acarreo.

El salto se realiza si CF = 1
Instrucción JNC

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.
Instrucción JNO

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.
Instrucción JNP (JPO)

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.
Instrucción JNS

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.
Instrucción JO

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.
Instrucción JP (JPE)

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.
Instrucción JS

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.
Instrucción LOOP

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.
Instrucción LOOPE

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.
Instrucción LOOPNE

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.
Instrucción DEC

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.
Instrucción INC

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.
Instrucción CMP

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.
Instrucción CMPS (CMPSB) (CMPSW)

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.
Instrucción CLC

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.
Instrucción CLD

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.
Instrucción CLI

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.
Instrucción CMC

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.
Instrucción STC

Propósito: Activar la bandera de acarreo.

Sintaxis:

STC

Esta instrucción pone la bandera CF en 1.
Instrucción STD

Propósito: Activar la bandera de dirección.

Sintaxis:

STD

La instrucción STD pone la bandera DF en 1.
Instrucción STI

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 ).


http://sistemas.itlp.edu.mx/tutoriales/ensamblador/img41.gif

4.-¿Instrucciones para el stack?
Durante la ejecución de un programa, se utilizan varias zonas de memoria bien diferenciadas para guardar los parámetros, el contexto de la ejecución, las variables locales, el código, etc.... Son la pila de llamadas (call stack), el área de datos dinámicos, conocida como el montón o montículo (heap), el área de datos estáticos y el área de código. En este artículo se describe de manera básica y genérica cómo son utilizadas estas zonas durante la ejecución de un programa.

Cuando se realiza un programa compilado compuesto de varias funciones (o métodos, si estamos utilizando un lenguaje orientado a objetos), los compiladores traducen cada función y su contenido a código máquina dependiente de la plataforma.

Cuando se inicia la ejecución de ese programa, el sistema operativo carga el código ejecutable en una zona de memoria que esté libre, y además, reserva al menos dos espacios más de memoria para que el programa pueda ejecutarse, y almacene allí los datos que necesite: son el stack y el heap.

En aquellos lenguajes que además, permiten la creación de variables globales (como C o Pascal), se reserva además una tercera zona llamada zona de datos, área de datos o algo similar.

Supongamos que vamos a ejecutar un programa, y en un momento dado sólo está cargado el sistema operativo en la memoria principal.

Cuando le pedimos al sistema operativo que ejecute el programa, se carga el código ejecutable en una zona libre de la memoria, y el sistema operativo, además, reserva:

* Una zona de datos para las variables globales y las constantes. Como en tiempo de compilación se conocen perfectamente las variables globales y las constantes, se reserva el espacio justo y necesario. Ni un byte de más. Además, aquellas variables globales que sean inicializadas a un valor concreto y también las constantes, se les puede dar valor cuando se reserva la zona de datos.
* Una zona para las llamadas (stack) que almacenará los parámetros de las funciones, las variables locales y los valores de retorno de las funciones (o métodos).
* Una zona para la gestión dinámica de memoria (el heap). Es decir, aquella memoria que se solicita durante la ejecución del programa. Por ejemplo, en C con la orden malloc, en Pascal con getMem o en la mayoría de lenguajes más modernitos (Java, C#, C++ etc...) con new.



A partir de este momento, el programa está listo para ser ejecutado. El sistema operativo indicará a la CPU que para ejecutarlo debe apuntar con el registro del puntero de instrucciones (IP, instruction pointer) a la primera instrucción del código, y que debe apuntar con su puntero de pila (SP, stack pointer) a la primera dirección del área reservada para pila.

La gestión del heap y del area de datos suele quedar a cargo del compilador, que habrá introducido código para gestionarlas, y no de la CPU.

En otros casos, el sistema operativo no prepara un área de heap para cada aplicación, sino que él mismo gestiona un heap global utilizado por todas las aplicaciones que están en ejecución.

Todas las aplicaciones tienen un punto de entrada (la función main o similar). Cuando empieza la ejecución, el IP de la CPU apunta a la dirección de este punto de entrada.

LA PILA o STACK

Una pila es una estructura de datos en la cual, el último elemento en llegar es el primero en salir (a menudo este comportamiento se abrevia con las siglas LIFO.- Last Input First Output). Se llama así porque su comportamiento se asemeja a una pila de cosas. Por ejemplo, imagina una pila de platos iguales, uno sobre otro. La forma de añadir un plato nuevo a la pila es colocándolo encima. Cuando queremos retirar un plato también cogemos el de arriba.

La pila de llamadas también tiene este comportamiento. Cuando empieza la ejecución, la pila está inicialmente vacía. En el transcurso de la ejecución, seguro que se efectúan llamadas a otras funciones (o métodos). En cada llamada, en la pila se almacena lo siguiente:

* La dirección a la que se debe retornar después de la llamada, es decir, la dirección de la instrucción siguiente a la propia llamada.
* Los datos pasados como parámetros de la llamada.
* Las variables locales utilizadas por la función llamada
* Si la función devuelve algo, lo dejará en la pila también.

Por ejemplo, observa este sencillo código en C#


01 class Program
02 {

04 static int metodo1(int a)
05 {
06 int b = metodo2(a+6);
07 return a + b;
07 }

09 static int metodo2(int c)
10 {
11 return c - 3;
12 }

14 static void Main(string[] args)
15 {
16 Console.WriteLine(metodo1(43));
17 Console.WriteLine("Fin");
18 }
19 }


http://upload.wikimedia.org/wikipedia/commons/thumb/d/d3/Call_stack_layout.svg/342px-Call_stack_layout.svg.png


5.-¿Que son los macros y para que sirven?
Macro
De Wikipedia, la enciclopedia libre
Saltar a navegación, búsqueda

' 'Para la fotografía, véase Macrofotografía.
Para el museo, véase Museo de Arte Contemporáneo de Rosario.

Una macro (del griego μακρο; significa «grande»), abreviatura de 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. Dicho de otra forma, una macroinstrucción es una instrucción compleja, formada por otras instrucciones más sencillas. Esto permite la automatización de tareas repetitivas.

El término no se aplica a una serie de instrucciones escritas en la línea 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 o un botón especialmente creado y asignado para tal efecto.

La diferencia entre una macroinstrucción y un programa es que en las macroinstrucciones la ejecución es secuencial y no existe otro concepto del flujo de programa, y por tanto, no puede bifurcarse.

Editar y ejecutar macros.



Las funciones y las subrutinas se pueden implementar en el editor de Visual Basic (Alt-F11).

Para usar una función en una hoja de Excel se debe, en el editor de VB, insertar un módulo y editar la función en este módulo. Esta acción de describe más adelante. De la misma manera se pueden editar subrutinas en un módulo.

Una función se invoca en una hoja, como se invoca una función de Excel o una fórmula. Una subrutina se puede invocar por ejemplo desde la ventana de ejecución de macros (Alt-F8) o desde un botón que hace una llamada a la subrutina (como respuesta al evento de hacer clic sobre él, por ejemplo).

El código que ejecuta un botón puede llamar a subrutinas y a las funciones de la hoja. El código del botón no está en un módulo. En la hoja de edición donde se encuentra el código del botón, se pueden implementar funciones para uso de este código pero que serán desconocidas para la hoja (mensaje de error #¿NOMBRE?).

Nota: un error frecuente es editar una función en un módulo que corresponde a una hoja y llamarlo desde otra hoja. En este caso se despliega el error (mensaje de error #¿NOMBRE?).

http://www.aulaclic.es/word2003/graficos/codigo_macro.gif


6.-¿Que son las interrupciones y a quienes afectan?

INTERRUPCIONES.

Como se mencionó anteriormente la PC esta constituida lógicamente por su BIOS y sistema operativo. La mayoría de las rutinas que controlan al computador están grabadas en el ROM del BIOS, aunque muchas rutinas son establecidas por el sistema operativo y se cargan en RAM al momento de encender al computador. Estas rutinas son denominadas interrupciones y son activadas mediante la instrucción: INT número. Una interrupción es una operación que invoca la ejecución de una rutina específica que suspende la ejecución del programa que la llamó, de tal manera que el sistema toma control del computador colocando en el stack el contenido de los registros CS e IP. El programa suspendido vuelve a activarse cuando termina la ejecución de la interrupción y son restablecidos los registros salvados. Existen dos razones para ejecutar una interrupción: (1) intencionalmente como petición para la entrada o salida de datos de un dispositivo, y (2) un error serio y no intencional, como sobreflujo o división por cero.



El operando de una interrupción indica cuál es la rutina a activar. La dirección de la rutina es localizada por medio de una tabla que el sistema mantiene a partir de la dirección 0000:0000h. Existen 256 entradas de 4 bytes de longitud, y cada interrupción proporciona varias funciones. Las interrupciones de 00h a 1Fh corresponden al BIOS y de 20h a FFh son del DOS y BASIC. El apéndice F proporciona una lista de las interrupciones para equipo XT.

http://3.bp.blogspot.com/_KI_9mwIhDrU/Sho2zGRGsrI/AAAAAAAAABU/hghGD9uQ8Mk/S1600-R/head2.jpg

No hay comentarios:

Publicar un comentario