domingo, 9 de octubre de 2016

Mnemónicos de Lenguaje Ensamblador

Un código mnemotécnico (o código nemotécnico), es un sistema sencillo utilizado para recordar una secuencia de datos, nombres, números, y en general para recordar listas de items que no pueden recordarse fácilmente.

El concepto de mnemotécnico fue utilizado en ensamblador para la definición de unas palabras que sustituye a un código de operación (lenguaje de máquina), las cuales fueron llamadas mnemónicos. 

Estas representan con unas cuantas letras una operación que es traducida durante el proceso de ensamblaje a código binario para que pueda ser interpretado por el procesador. La creación de estos códigos abreviados dio origen a lo que hoy conocemos como lenguaje ensamblador.

Dentro de los principales mnemónico tenemos:
MOV (transferencia)
Sintaxis: MOV dest, origen.
Transfiere datos de longitud byte o palabra del operando origen al operando destino. Pueden ser operando origen y operando destino cualquier registro o posición de memoria direccionada de las formas ya vistas, con la única condición de que origen y destino tengan la misma dimensión. Existen ciertas limitaciones, como que los registros de segmento no admiten el direccionamiento inmediato: es incorrecto MOV DS,4000h; pero no lo es por ejemplo MOV DS,AX o MOV DS,VARIABLE. 


Ejemplos:
mov ds,ax
mov bx,es:[si]
mov si,offset dato


En el último ejemplo, no se coloca en SI el valor de la variable dato sino su dirección de memoria o desplazamiento respecto al segmento de datos.
LEA (carga dirección efectiva)
Sintaxis: LEA destino, origen
Transfiere el desplazamiento del operando fuente al operando destino. Otras instrucciones pueden a continuación utilizar el registro como desplazamiento para acceder a los datos que constituyen el objetivo. El operando destino no puede ser un registro de segmento. En general, esta instrucción es equivalente a MOV destino,OFFSET fuente y de hecho los buenos ensambladores (TASM) la codifican como MOV para economizar un byte de memoria. Sin embargo, LEA es en algunos casos más potente que MOV al permitir indicar registros de índice y desplazamiento para calcular el offset:
lea dx,datos[si]
En el ejemplo de arriba, el valor depositado en DX es el offset de la etiqueta datos más el registro SI. 

Esa sola instrucción es equivalente a estas dos:
mov dx,offset datos
add dx,si


PUSH (introduce en la pila)
Sintaxis: PUSH origen
Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el operando origen a la cima de la pila. El registro CS aquí sí se puede especificar como origen, al contrario de lo que afirman algunas publicaciones.
Ejemplo: push cs
CALL (llamada a subrutina)


Sintaxis: CALL destino
Transfiere el control del programa a un procedimiento, salvando previamente en la pila la dirección de la instrucción siguiente, para poder volver a ella una vez ejecutado el procedimiento.
 El procedimiento puede estar en el mismo segmento (tipo NEAR) o en otro segmento (tipo FAR). A su vez la llamada puede ser directa a una etiqueta (especificando el tipo de llamada NEAR -por defecto- o FAR) o indirecta, indicando la dirección donde se encuentra el puntero. 

Ejemplos: call proc1
dir dd 0f000e987h
call dword ptr dir


En el segundo ejemplo, la variable dir almacena la dirección a donde saltar. De esta última manera -conociendo su dirección- puede llamarse también a un vector de interrupción, guardando previamente los flags en la pila (PUSHF), porque la rutina de interrupción retornará (con IRET en vez de con RETF) sacándolos
DIRECTIVAS DE DEFINICIÓN DE DATOS.
* DB (definir byte), DW (definir palabra), DD (definir doble palabra), DQ (definir cuádruple palabra), DT (definir 10 bytes): sirven para declarar las variables, asignándolas un valor inicial: anno DW 1991
mes DB 12
numerazo DD 12345678h
texto DB "Hola",13,10

Se pueden definir números reales de simple precisión (4 bytes) con DD, de doble precisión (8 bytes) con DQ y «reales temporales» (10 bytes) con DT; todos ellos con el formato empleado por el coprocesador. 


Con el operando DUP pueden definirse estructuras repetitivas. Por ejemplo, para asignar 100 bytes a cero y 25 palabras de contenido indefinido (no importa lo que el ensamblador asigne): ceros DB 100 DUP (0) 
DW 25 DUP (?)

Se admiten también los anidamientos. El siguiente ejemplo crea una tabla de bytes donde se repite 50 veces la secuencia 1,2,3,7,7: tabla DB 50 DUP (1, 2, 3, 2 DUP (7))
DIRECTIVAS DE DEFINICIÓN DE SÍMBOLOS.
* EQU (EQUivalence): Asigna el valor de una expresión a un nombre simbólico fijo: olimpiadas EQU 1992

Donde olimpiadas ya no podrá cambiar de valor en todo el programa. Se trata de un operador muy flexible. Es válido hacer: edad EQU [BX+DI+8]
MOV AX,edad

* = (signo ‘=’): asigna el valor de la expresión a un nombre simbólico variable: Análogo al anterior pero con posibilidad de cambiar en el futuro. Muy usada en macros (sobre todo con REPT). num = 19
num = pepe + 1
dato = [BX+3]
dato = ES:[BP+1].






Programas Lenguaje Ensamblador



Programa 1 : ¡Hola Mundo!

Programa 2: Uso de Constantes

Programa 4: Hola Mundo! Con Procedimiento

Programa 5: Identidad Con Procedimiento

Programa 6: Borrar Pantalla

Programas Lenguaje Ensamblador



Programa 1 : ¡Hola Mundo!

Programa 2: Uso de Constantes

Programa 4: Hola Mundo! Con Procedimiento

Programa 5: Identidad Con Procedimiento

Programa 6: Borrar Pantalla

sábado, 8 de octubre de 2016

Unidad 1 Introducción al Lenguaje Ensamblador

1.1 IMPORTANCIA DE LA PROGRAMACIÓN EN LENGUAJE ENSAMBLADOR

La importancia del lenguaje ensamblador radica principalmente que se trabaja directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de este, tiene la ventaja de que en él se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo pueden realizar. Otro punto sería que los programas en ensamblador ocupan menos espacio en memoria.
















1.2 EL PROCESADOR Y SUS REGISTROS INTERNOS
 Definición de registros:
un registro es una memoria de alta velocidad y poca capacidad, integrada en el microprocesador, que permite guardar transitoriamente y acceder a valores muy usados, generalmente en operaciones matemáticas.

Función de los registros:

Los registros están en la cumbre de la jerarquía de memoria, y son la manera más rápida que tiene el sistema de almacenar datos. Los registros se miden generalmente por el número de bits que almacenan; por ejemplo, un "registro de 8 bits" o un "registro de 32 bits“.

La CPU contiene un conjunto de localidades de almacenamiento temporal de datos de alta velocidad llamada registro. Algunos de los registros están dedicados al control, y solo la unidad de control tiene acceso a ellos. Los registros restantes son los registros de uso general y el programador es el usuario que tiene acceso a ellos.


Algunos registros básicos:

Dentro del conjunto básico de registros de control se deben incluir a los siguientes:

A.Contador de programa (PC).

B.Registro de direcciones de la memoria (MAR).

C.Registro de datos (RD).

D.Registro de instrucciones (IR).

E.Palabra de estado de programa (PSW).















1.3 LA MEMORIA PRINCIPAL (RAM)

RAM

Este tipo de memoria puede ser borrada y grabada las veces que deseemos. La única desventaja es que la información grabada en ella solo puede ser utilizada mientras tenga energía. En cuanto se corte la alimentación, los datos que se grabaron se borrarán instantáneamente. Se usan solo como almacenamiento temporal.



La RAM tiene dos modos de operación posibles:


RAM estática: flips-flops internos que almacenan información binaria. La información almacenada es válida mientras la unidad está encendida.


RAM dinámica: conjunto de pequeños condensadores que pueden estar cargados o descargados. Debe refrescarse cada pocos mili-segundos para impedir la pérdida de información. Tienen mayor capacidad que las estáticas.

















1.4 CONCEPTO DE INTERRUPCIONES

Una interrupción es una situación especial que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción para tratarla. Tal situación se da, por ejemplo, cuando un periférico requiere la atención del procesador para realizar una operación de E/S.

Las interrupciones constituyen quizá el mecanismo más importante para la conexión del micro-controlador con el mundo exterior, sincronizando la ejecución de programas con acontecimientos externos.


PASOS PARA EL PROCESAMIENTO

1. Terminar la ejecución de la instrucción máquina en curso.

2. Salva el valor de contador de programa, IP, en la pila, de manera que en la CPU, al terminar el proceso, pueda seguir ejecutando el programa a partir de la última instrucción.

3. La CPU salta a la dirección donde está almacenada la rutina de servicio de interrupción (ISR, Interrupt Service Routine) y ejecuta esa rutina que tiene como objetivo atender al dispositivo que generó la interrupción.

4. Una vez que la rutina de la interrupción termina, el procesador restaura el estado que había guardado en la pila en el paso 2 y retorna al programa que se estaba usando anteriormente.

EJEMPLOS DE INTERRUPCIONES

int 01h-->un solo paso
int 02h-->interrupcion no enmascarable
int 03h--> punto de interrupcion
int 04h-->desbordamiento
int 05h-->impresion de pantalla
int 08h-->Cronometro
int 15h-->Servicios del sistema
int 16h-->Funciones de entrada del teclado
int 18h-->Entrada con el Basic de Rom
int 19h-->Cargador ed arranque
int 1Ah-->Leer y establecer la hora
int 1Bh-->Obtener el control con una interrupcion de teclado.
int 20h-->Terminar un programa
int 33h->Funciones del Raton



1.5 LLAMADAS A SERVICIOS DEL SISTEMA


Una llamada al sistema es un método o función que puede invocar un proceso para solicitar un cierto servicio al sistema operativo. Dado que el acceso a ciertos recursos del sistema requieren la ejecución de código en modo privilegiado, el sistema operativo ofrece un conjunto de métodos o funciones que el programa puede emplear para acceder a dichos recursos. En otras palabras, el sistema operativo actúa como intermediario, ofreciendo una interfaz de programación (API) que el programa puede usar en cualquier momento para solicitar recursos gestionados por el sistema operativo.


Algunos ejemplos de llamadas al sistema son las siguientes:


Time: que permite obtener la fecha y hora del sistema.


Write: que se emplea para escribir un dato en un cierto dispositivo de salida, tales como una pantalla o un disco magnético.


Read: que es usada para leer de un dispositivo de entrada, tales como un teclado o un disco magnético.


Open: que es usada para obtener un descriptor de un fichero del sistema, ese fichero suele pasarse a write.



1.6  MODOS DE DIRECCIONAMIENTO


Los llamados modos de direccionamiento son las diferentes maneras de especificar en informática un operando dentro de una instrucción en lenguaje ensamblador.

Un modo de direccionamiento especifica la forma de calcular la dirección de memoria efectiva de un operando mediante el uso de la información contenida en registros y / o constantes, contenida dentro de una instrucción de la máquina o en otra parte.




1.7  PROCESO DE ENSAMBLADO Y LIGADO


1. El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como archivo de código fuente.

2. El ensamblador lee el archivo de código fuete y produce un archivo de código objeto, una traducción del programa a lenguaje máquina. De manera opcional, produce un archivo de listado. Si ocurre un error, el programador debe regresar al paso 1 y corregir el programa.

3. El enlazador lee el archivo de código objeto y verifica si el programa contiene alguna llamada a los procedimientos en una biblioteca de enlace. El enlazador copia cualquier procedimiento requerido de la biblioteca de enlace, lo combina con el archivo de código objeto y produce el archivo ejecutable. De manera opcional, el enlazador puede producir un archivo de mapa.

4. La herramienta cargador (loader) del sistema operativo lee el archivo ejecutable y lo carga en memoria, y bifurca la CPU hacia la dirección inicial del programa, para que éste empiece a ejecutarse.







1.8  DESPLEGADO DE MENSAJES EN EL MONITOR

Todos los gráficos y el texto que se muestran en el monitor se escriben en la RAM de visualización de video, para después enviarlos al monitor mediante el controlador de video. El controlador de video es en sí un microprocesador de propósito especial, que libera a la CPU principal del trabajo de controlar el hardware de video.

Un monitor de pantalla de cristal líquido (LCD) digital directo recibe un flujo de bits digitales directamente desde el controlador de video, y no requiere del barrido de trama.
















                                                                             Unidad 1 : Introduccion al Lenguaje Ensamblador