jueves, 29 de agosto de 2013

Actividad # 6 Leer y Ejecutar los Comandos del debug

Primer Programa en Ensamblador
El primer paso es iniciar el Debug, este paso consiste únicamente en teclear debug [Enter] en el prompt del sistema operativo.



En la siguiente linea aparecerá un guión, éste es el indicador del Debug, en este momento se pueden introducir las instrucciones del Debug. Utilizando el comando:




Se desplegaran todos los contenidos de los registros internos de la UCP; una forma alternativa de mostrarlos es usar el comando "r" utilizando como parametro el nombre del registro cuyo valor se quiera visualizar. Por ejemplo:

- rbx




Esta instrucción desplegará unicamente el contenido del registro BX y cambia el indicador del Debug de " - " a " : "

Para ensamblar un programa en el Debug se utiliza el comando "a" (assemble); cuando se utiliza este comando se le puede dar como parametro la dirección donde se desea que se inicie el ensamblado, si se omite el parametro el ensamblado se iniciará en la localidad especificada por CS:IP, usualmente 0100H, que es la localidad donde deben iniciar los programas con extensión .COM, y sera la localidad que utilizaremos debido a que debug solo puede crear este tipo específico de programas.

Aunque en este momento no es necesario darle un parametro al comando "a" es recomendable hacerlo para evitar problemas una vez que se haga uso de los registros CS:IP, por lo tanto tecleamos:


- a0100 [Enter]




Al hacer ésto aparecerá en la pantalla algo como: 0C1B:0100 y el cursor se posiciona a la derecha de estos números, nótese que los primeros cuatro dígitos (en sistema hexagesimal) pueden ser diferentes, pero los últimos cuatro deben ser 0100, ya que es la dirección que indicamos como inicio.

Ahora podemos introducir las instrucciones:

0C1B:0100 mov ax,0002 ;coloca el valor 0002 en el registro ax
0C1B:0103 mov bx,0004 ;coloca el valor 0004 en el registro bx
0C1B:0106 add ax,bx ;le adiciona al contenido de ax el contenido de bx
0C1B:0108 int 20 ; provoca la terminación del programa.
0C1B:010A


No es necesario escribir los comentarios que van despues del ";". Una vez digitado el último comando, int 20, se le da [Enter] sin escribir nada mas, para volver al prompt del debuger.




No es necesario escribir los comentarios que van despues del ";".

Una vez digitado el último comando, int 20, se le da [Enter] sin escribir nada mas, para volver al prompt del debuger.

Para ejecutar el programa que escribimos se utliza el comando "g", al utilizarlo veremos que aparece un mensaje que dice: "Program terminated normally".

Naturalmente con un mensaje como éste no podemos estar seguros que el programa haya hecho la suma, pero existe una forma sencilla de verificarlo, utilizando el comando "r" del Debug podemos ver los contenidos de todos los registros del procesador, simplemente teclee:

- r [Enter]





Cargar y Guardar el programa

Al terminar de ensamblar el programa se vería así: 





Para obtener la longitud de un programa se utiliza el comando "h", el cual nos muestra la suma y resta de dos números en hexadecimal.

Para obtener la longitud del nuestro le proporcionamos como parámetros el valor de la dirección final de nuestro programa (10A) y el valor de la dirección inicial (100).

El primer resultado que nos muestra el comando es la suma de los parámetros y el segundo es la resta.

El comando "n" nos permite poner un nombre al programa.

El comando "rcx" nos permite cambiar el contenido del registro CX al valor que obtuvimos del tamaño del archivo con "h", en este caso 000a, ya que nos interesa el resultado de la resta de la dirección inicial a la dirección final.

Por último el comando w escribe nuestro programa en el disco, indicandonos cuantos bytes escribió.

Para cargar un archivo ya guardado son necesarios dos pasos:

Proporcionar el nombre del archivo que se cargará.

Cargarlo utilizando el comando "l" (load).

Para obtener el resultado correcto de los siguientes pasos es necesario que previamente se haya creado el programa anterior.

Dentro del Debug escribimos lo siguiente:

- n prueba.com
- l
- u 100 109
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 ADD AX,BX
0C3D:0108 CD20 INT 20

El último comando, "u", se utiliza para verificar que el programa se cargó en memoria, lo que hace es desensamblar el código y mostrarlo ya desensamblado. Los parámetros le indican a Debug desde donde y hasta donde desensamblar.


Actividad # 5 Interrupciones y llamadas a servicios de sistema

Interrupciones

Una interrupción es una instrucción que detiene la ejecución de unprograma para permitir el uso de la UCP a un proceso prioritario. Una vez concluido este último proceso se devuelve el control a la aplicación anterior.



Para lograr administrar todas estas interrupciones, la computadora cuenta con un espacio de memoria, llamado memoria baja, donde se almacenan las direcciones de cierta localidad de memoria donde se encuentran un juego de instrucciones que la UCP ejecutará para después regresar a la aplicación en proceso.


Es una señal recibida por el procesador de un ordenador, indicando que debe "interrumpir" el curso de ejecución actual y pasar a ejecutar código específico para tratar esta situación.




Tipos de Interrupciones

Interrupciones hardware

Estas son asíncronas a la ejecución del procesador, es decir, se pueden producir en cualquier momento independientemente de lo que esté haciendo la CPU en ese momento. Las causas que lo producen son externas al procesador y a menudo suelen estar ligadas con distintos dispositivos de E/S.


Interrupciones software o excepciones  

Son aquellas que se producen de forma síncrona a la ejecución del procesador y por tanto podrían predecirse si se analiza con detenimiento la traza del programa que en ese momento estaba siendo ejecutado en la CPU. Normalmente las causas de estas interrupciones suelen ser realizaciones de operaciones no permitidas tales como la división por 0, el desbordamiento, el acceso a una posición de memoria no permitida, etc.



Llamadas a servicios de 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.


Las llamadas son peticiones a ejecución de rutinas y proporcionan la interfaz entre el sistema operativo y un programa en ejecución. Estas llamadas son instrucciones de lenguaje ensamblador y se presentan en los manuales que emplean los programadores de este lenguaje.

Una llamada al sistema es cuando un programa llama a un servicio del Kernel del sistema operativo. Generalmente estos servicios se encuentran disponibles como instrucciones de lenguaje ensamblador pero algunas veces también pueden llamarse desde lenguajes de alto nivel.




Kernel o núcleo

Este se considera el principal componente de los sistemas operativos sirve de interfaz entre aplicaciones y el proceso de los datos de bajo nivel hecho por el hardware del equipo. Entre sus funciones están administrar los recursos del sistema como memoria , uso de CPU por las aplicaciones o acceso a interfaces de entrada y salida del equipo. 


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.


FUENTES:

http://es.scribd.com/doc/28629796/Lenguaje-Ensamblador
http://www.itescam.edu.mx/principal/webalumnos/sylabus/asignatura.php?clave_asig=SCC-1014&carrera=ISIC-2010-224&id_d=16


http://1984.lsi.us.es/wiki-ssoo/index.php/Llamadas_al_sistema

miércoles, 28 de agosto de 2013

Actividad #4 : Investigar sobre los registros que contiene un cpu y sus funciones

Registros

Los registros del procesador se emplean para controlar instrucciones en ejecución  manejar direccionamiento de memoria y proporcionar capacidad aritmética  Los registros son direccionables por medio de un nombre.







Registros de segmento

Tienen 16 bits de longitud y facilita un área de memoria para direccionamiento conocida como el segmento actual.

Registro CS
CS(Registro del segmento de código)
Indica la posicion de comienzo del segmento de código, o sea las instrucciones del programa.

Registro DS

DS(Registro de segmento de datos):
Indica la posición donde empieza el segmento de datos, es decir , el area de memoria donde estan almacenados los datos del programa.

La dirección inicial de un segmento de datos de programa es almacenada en el registro DS. En términos sencillos, esta dirección, mas un valor de desplazamiento en una instrucción  genera una referencia a la localidad de un byte especifico en el segmento de datos.

El DS es un registro de segmento cuya función es actuar como policía donde se encuentran los datos. Cualquier dato, ya sea una variable inicializada o no, debe estar dentro de este segmento.


Registro ES

ES(Registro del segmento extra)
Indica la posición de memoria donde comienza el segmento extra, un segmento de datos adicional que también se utiliza para transferencia de datos entre segmentos.



Registro SS

SS(Registro del segmento de la pila)
Indica la posición de memoria donde empieza la pila.

El registro SS permite la colocación en memoria de una pila, para almacenamiento temporal de direcciones y datos.

El SS tiene la tarea exclusiva de manejar la posición de memoria donde se encuentra la pila (stack). Esta es una estructura usada para almacenar datos en forma temporal, tanto de un programa como de las operaciones internas de la computadora personal.

Registros FS y GS

Son registros extras de segmentos en los procesadores 80386 y posteriores.



Registro de apuntador de instrucciones

El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta.El IP esta asociado con el registro CS en el sentido de que el IP indica la instrucción actual dentro del segmento de código que se esta ejecutando actualmente.


Registros apuntadores

Los registros SP(apuntador de la pila) y BP (apuntador base) estan asociados con el registro SS y permiten al sistema accesar datos en el segmento de pila.


Registro SP.

SP (Puntero de pila)
Indica la posición de la cabecera de la pila.

El registro SP apunta a un área especifica de memoria que sirve para almacenar bajo la estructura LIFO(ultimo en entrar, primero en salir), conocida como pila stack.

El apuntador de la pila de 16 bits esta asociado con el registro SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que esta siendo procesada en la pila.

En el ejemplo siguiente, el registro SS contiene la dirección de segmento 27B3[0]H y el SP, el desplazamiento 312H. Para encontrar la palabra actual que se esta siendo procesada en la pila, la computadora combina las direcciones en el SS y el SP:











Registros BP

BP (puntero base)
indica la dirección de comienzo de la pila.

El BP de 16 bits facilita la referencia de parámetros  los cuales son datos y direcciones trasmitidos via la pila. Los procesadores 80386 y posteriores tienen un BP ampliado de 32 bit llamado el registro EBP.

El registro BP se usa para manipular la pila sin afectar al registro de segmentos SS. Es utili cuando se usa interfaz entre lenguajes de alto nivel y el ensamblador.


Registros de propósito general

Los registros de propósito general AX, BX, CX y DX son únicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte.El ultimo byte de la izquierda es la parte "alta", y el ultimo byte de la derecha es la parte baja.


Registro AX.

AX (Acumulador)
Principal registro utilizando en las operaciones aritméticas.


El registro AX se usa para almacenar resultados, lectura o escritura desde o hacia los puertos.

El registro AX es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmética. Por ejemplo, las instrucciones para multiplicar, dividir y traducir suponen el uso del AX.


Registro BX

BX(base)
Se utiliza para indicar desplazamiento.


El Registro BX sirve como apuntador base o indice.

El registro BX es conocido como el registro base ya que es el unico registro de proposito general que puede ser un indice para direccionamiento indexado. Tambien es comun emplear el BX para cálculos.







Registro CX

CX(contador)
Se utiliza como contador en bucles y en operaciones de tipo repetitivo.


El registro CX es conocido como el registro contador. Puede contener un valor para controlar el numero de veces que un ciclo se repite o un valor para corrimiento de bits, hacia la derecha o hacia la izquierda. El CX también es usado para muchos cálculos.

Se utiliza en operaciones de iteracion, como un contador que automáticamente se incrementa o decrementa de acuerdo con el tipo de instrucción usada.





Registros DX

DX (dato)
Se utiliza en operaciones aritméticas.

El registro DX es conocido como el registro de datos. Algunas operaciones de entrada/ salida requieren de su uso, y las operaciones de multiplicación y division con cifras grandes supenen al DX y al AX trabajando juntos.


El registro se usa como puente para el acceso de datos.

Registros Indice

Los registros SI y DI están disponibles para direccionamiento indexado y para sumas y restas.

 
Los registros SI y DI son útiles para manejar bloques de cadenas en memoria, siendo el primero el indice fuente y el segundo indice destino. En otras palabras, SI representa la direccion donde se encuentra la cadena y DI la dirección donde sera copiada.

Registros SI

El registro indice de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI esta asociado con el registro DS.



Registro de banderas

Sirven para indicar el estado actual de la maquina y el resultado del procesamiento. Muchas instrucciones que piden comparaciones y aritmética cambian el estado de las banderas, algunas de cuyas instrucciones pueden realizar pruebas para determinar la acción subsecuente.

Las banderas están en el registro de banderas en las siguientes posiciones:





FUENTES:

Lenguaje Ensamblador Prog Ibm

 Escrito por Peter Abel

Informatica. Temario A. Volumen Ii. Profesores de Educacion Secundaria E-book
 
Microcomputadoras al detalle




domingo, 25 de agosto de 2013

Investigar la estructura y organización de un procesador (CPU).

Procesador



El procesador es la parte mas importante de un computador, se trata de la unidad encargada de ejecutar las instrucciones y procesar los datos necesarios para todas las funcionalidades del computador.

Estructura de un procesador:
















Unidad aritmético Lógica (ALU)

Es el componente hardware que dota al procesador de la capacidad de cálculo. Es un módulo especializado en realizar las operaciones matemáticas y lógicas básicas.


Registros

Un registro es una memoria de alta velocidad y poca capacidad, integrada en el procesador, que permite guardar y acceder a valores muy usados, generalmente en operaciones matemáticas. Su uso se debe a que en la jerarquía de memorias se encuentra por encima de la memoria principal del sistema, esto significa que la velocidad de transferencia entre el procesador y los registros es mayor a la velocidad de transferencia entre la memoria principal y el procesador.


Ruta de datos

La Ruta de Datos es responsable de la manipulación de los datos e
Incluye:

1. Unidades funcionales como sumadores, registros de desplazamiento, multiplicadores, ALUs, comparadores, etc.

2. Registros y otros elementos de memoria para el almacenamiento temporal de datos.

3. Buses y multiplexores para la transferencia de datos entre los diferentes componentes de la ruta de datos.

 

Unidad de Control

Es la encargada de activar o desactivar los diversos componentes del procesador en función de la instrucción y etapa en que se encuentre que el procesador este ejecutando.



FUENTES:

Problemas resueltos de estructura de computadores

 Escrito por Félix García Carballeira

Conceptos de lenguaje ensamblador

1.Que es el Lenguaje ensamblador?


El lenguaje ensamblador expresa las instrucciones de una forma más natural al hombre a la vez que muy cercana al microcontrolador, ya que cada una de esas instrucciones se corresponde con otra en código máquina.

El lenguaje ensamblador trabaja con nemónicos, que son grupos de caracteres alfanuméricos que simbolizan las órdenes o tareas a realizar.



En el lenguaje ensamblador el programador utiliza instrucciones simbólicas en lugar de instrucciones de máquina y nombres descriptivos para los elementos de datos y para las localidades de memoria.

2.- En que se utiliza el lenguaje ensamblador? 

La escritura en lenguaje máquina es tediosa y proclive a errores, el lenguaje ensamblador facilita la tarea de la escritura sin perder la cercanía a la máquina y tambien proporciona más control sobre el manejo particular de los requerimientos de hardware.

Un programa  ensamblador: traduce el lenguaje ensamblador al lenguaje máquina de la CPU.




Un programador escribe el programa origen en lenguaje ensamblador utilizando cualquier editor de textos o procesador de palabras que sea capaz de producir una salida de texto en ASCII.Una vez que el código origen ha sido escrito, el archivo origen es ensamblado mediante su procesamiento a través de algún ensamblador.



3.- Que es un lenguaje de alto nivel, de bajo nivel y lenguaje de máquina?



Lenguaje Maquina

Es el lenguaje natural de una computadora en particular, está definido por el diseño del hardware de dicha computadora. Por lo general, los lenguajes maquina consisten en cadenas de números 0 y 1 que instruyen a las computadoras para realizar sus operaciones más elementales, una por una.





Lenguaje de Alto Nivel:

Estos lenguajes permiten a los programadores escribir instrucciones que se parecen mucho al inglés común, y contienen la notación matemática común.




Lenguaje de Bajo Nivel:


Un lenguaje de programación  de bajo nivel de abstracción es el que proporciona un conjunto de instrucciones aritmeticológicas sin la capacidad de encapsular dichas instrucciones en funciones que no estén ya contempladas en la arquitectura del hardware.





4.- Cual es la importancia de lenguaje ensamblador?





La programación en lenguaje maquina era demasiado lenta y tediosa para la mayoría de los programadores. En lugar de utilizad las cadenas de números que las computadoras podían entender de manera directa, los programadores comenzaron a utilizar las abreviaturas del inglés para representar las operaciones básicas de la computadora.

Estas abreviaturas formaron la base de los lenguajes ensambladores. Los programas ensambladores se desarrollaron para convertir programas en lenguaje ensamblador a lenguaje maquina a la velocidad de la computadora.




FUENTES: