jueves, 28 de noviembre de 2013

Modificación de código

Modificar el siguiente código para que imprima en patalla los caracteres correspondientes a los valores 0-255
 
 
 
Los cambios que hay que hacerse son mínimos, solo hay que modificarlo para que corra como .exe y no como .com, agregandole el comando .DATA y moviendo la variable "CHAR" debajo de éste, agregarle el comando .STACK para la pila, con un tamaño de 256, es decir el número de caracteres que se imprimiran, y agregar las instrucciones para mover los registros de segmento y que puedan mostrarse en pantalla, es decir el MOV AX, @data y el MOV DS,AX , dentro de la etiqueta BEGIN pero antes de la instrucción JMP SHORT MAIN, lo que resta del código no necesita ser modificado.
 
 
Se ensambla y enlaza el programa para poder correrlo luego como .exe
 
 
Y el resultado es el siguiente
 
 
Y para comprobar aqui esta la tabla ASCII con los valores de los caracteres, aunque los primeros no se muestran por no ser caracteres si no "instrucciones" por asi llamarlo.
 
 
 
 

lunes, 25 de noviembre de 2013

Cuestionario

1. ¿Qué es el acceso a dispositivos de almacenamiento?
 
Forma en que se puede leer y escribir datos en un dispositivo auxiliar a la memoria principal.
 

Dispositivo de almacenamiento de acceso directo: Es cualquier tipo de dispositivo de almacenamiento secundario que tiene un tiempo de acceso bajo en proporción a su capacidad.

 
2. ¿Cómo se hace el acceso a disco usando lenguaje ensamblador?
 
Los datos se registran sobre la superficie del disco en una serie de circunferencias concentricas llamadas pistas (track).
 
Varias pistas , una por cada cara del disco (generalmente 2) , componen un cluster. Cada pista esta divida en porciones iguales llamadas sectores. Un sector es la unidad basica del almacenamiento en un disco, el tamaño de un sector se mide en bytes y depende de las caracteristicas del disco.

Un ejemplo de las 3 rutinas son : que permiten lectura y escritura absoluta de sectores, asi como la determinacion del espacio libre disponible en un disco.
 

 
3. Mencione y describa las unidades básicas del adaptador de video

El adaptador de video consta de tres unidades básicas:

1) El controlador de video: Esta unidad es el "caballo de batalla", genera las señales de rastreo del monitor para el modo seleccionado, texto o gráfico. El procesador de la computadora envía instrucciones a los registros del controlador y lee ahí la información de estado.

2) El video de BIOS: Actúa como una interfaz con el adaptador de video , contiene rutinas, como para establecer el cursor y desplegar caracteres.

3) El área de despliegue de video: En memoria contiene la información que el monitor va a mostrar. Las interrupciones que manejan el despliegue en pantalla de forma directa transfieren a esta área sus datos. Las localidades del adaptador de video dependen de los modos de video que esten usando . Para los adaptadores principales, a continuación están las direcciones del inicio de los segmentos de despliegue de video:

- A000:[0] Utilizada para descripción de fuentes cuando está en modo texto y para gráficos de alta resolución para EGA, MCGA y VGA.

- B000:[0] Modo de texto monocromático para MDA, EGA y VGA.

- B100:[0] Para HCG

-B800:[0] Modos de texto para CGA, MCGA, EGA y VGA y modos gráficos para CGA, EGA, MCGA y VGA.



Fuentes

http://www.sisman.utm.edu.ec/libros/FACULTAD%20DE%20CIENCIAS%20ZOOT%C3%89CNICAS/CARRERA%20DE%20INGENIER%C3%8DA%20EN%20INFORMATICA%20AGROPECUARIA/05/PROGRAMACION%20IV/P.%20Avanzada%20lenguaje%20ensamblador.PDF

http://books.google.com.mx/books?id=syAOv7jF3W4C&pg=PA154&lpg=PA154&dq=unidades+b%C3%A1sicas+de+adaptador+de+video&source=bl&ots=rIb-0kqkY_&sig=f7gG7JGiQ3fxQ5IV_5zdsE3NNJQ&hl=en&sa=X&ei=TvmTUoiyI-OL2wWvkoGwAg&ved=0CCgQ6AEwAA#v=onepage&q=unidades%20b%C3%A1sicas%20de%20adaptador%20de%20video&f=false

jueves, 21 de noviembre de 2013

Acceso a discos en lenguaje ensamblador

¿Que es el acceso a dispositivos de almacenamiento?
 
Forma en que se puede leer y escribir datos en un dispositivo auxiliar a la memoria principal.
 
Dispositivo de almacenamiento de acceso directo: Es cualquier tipo de dispositivo de almacenamiento secundario que tiene un tiempo de acceso bajo en proporción a su capacidad.



¿Como se hace el acceso a disco usando lenguaje ensamblador?
 
Los datos se registran sobre la superficie del disco en una serie de circunferencias concentricas llamadas pistas (track).
 
Varias pistas , una por cada cara del disco (generalmente 2) , componen un cluster. Cada pista esta divida en porciones iguales llamadas sectores. Un sector es la unidad basica del almacenamiento en un disco, el tamaño de un sector se mide en bytes y depende de las características del disco.

Un ejemplo de las 3 rutinas son : que permiten lectura y escritura absoluta de sectores, asi como la determinacion del espacio libre disponible en un disco.



Ejemplo
 
rutina_absoluteRead: transfiere de un o mas sectores al buffer especificado accesando directamente a los sectores logicos, en caso de error se enciende el bit de acarreo y Ax con el codigo de error.

 
 
 
El programa no se ejecuta correctamente, ya que sale un error que dice que no es una aplicación Win32 válida, pero estos procesos son rutinas que se usan para acceder a disco en lenguaje ensamblador.
 
 
Fuentes:
 
 
 

martes, 12 de noviembre de 2013

Actividad para competencia


1. Pregunta de  código ( lenguaje ensamblador), corrección de error, contenido de registro, etc.
 
 

2. Sistemas numéricos ( conversiones, sumas, etc)
 
 
 

3. Conceptos ( registros, cpu, etc)
 

lunes, 11 de noviembre de 2013

Actividad 12

Actividad #12
En un lenguaje de su conocimiento debe Hacer un programa para imprimir 100 veces un mensaje
1. Sin usar procedimientos
2. Usando llamadas a procedimientos
3. Incluya una funcion de tiempo que imprima el tiempo de inicio y el tiempo al final para medir el tiempo de ejecución
 
El primer programa consta de cien líneas para la impresión, es decir una línea por impresión, lo que lo hace un código largo.
 

 
Ejecución del programa


 
El segundo programa hace lo mismo que el primero pero usa mucho menos líneas de código.
 
 
Ejecución del programa


 
Podemos observer que el tiempo en segundos es el mismo, pero en realidad tarda menos el segundo programa por el hecho de usar menos líneas de código, es decir, que no tiene que leer 100 líneas, sino solo el for.

Actividad 11


Actividad #11
Encuentre  2 programas que usen procedimeintos en lenguaje ensamblador y 2 programas que usen macros en Lenguaje ensamblador,  mencione las diferencias entre macros y procedimientos.

Procedimientos: Son bloques de sentencias a los que les asigna un nombre de tal forma que para ejecutar estas sentencias, solo basta escribir el identificador y en caso necesario facilita los parámetros necesarios.

Ejemplos de programas con procedimientos:



 
 
 

 

 
 
 
Macros: Es un conjunto de instrucciones que tiene un nombre que las identifica.

Hay dos tipos de macros, los internos y los externos. Los internos son aquellos que estan dentro del mismo programa y externos que estan fuera del codigo fuente, pero los agregas con un include.

Ejemplos de macros para programas en ensamblador son:

 
 



 
 
 
 
 
 
 
 
La diferencia entre un procedimiento y un macro, es que los procedimientos leen línea por línea el código, y los macros no, los procedimientos usan la sentencia call para ser llamados en caso de que no esten implícitos en el código, y los macros utilizan la sentencia include cuando son externos al programas, tomando un conjunto de instrucciones que ya estan definidas y solo se ejecutan tal y como estan.

Al momento de ejecutarse la macro cada parámetro es sustituido por el nombre o valor especificado al momento de llamarla.
Podemos decir entonces que un procedimiento es una extensión de un determinado programa, mientras que la macro es un módulo con funciones específicas que puede ser utilizado por diferentes programas.
Otra diferencia entre una macro y un procedimiento es la forma de llamar a cada uno, para llamar a un procedimiento se requiere el uso de una directiva, en cambio la llamada a las macros se realiza como si se tratara de una instrucción del ensamblador.

 
Fuentes:
 
 
 

miércoles, 30 de octubre de 2013

Actividad 28 Oct


#1(Implementación de la condición if-then)

Se pretende realizar un programa en lenguaje ensamblador equivalente al siguiente código en C:

#include < iostream.h>
main()
{
int a[] = {12, 5, 34, 75, 10, 25};
int n = 6;
int max, i;
for (max = i = 0; i < n; i++)
if (a[i] > max)
    max = a[i];
    cout << max << end1;
 }
 
Este programa calcula el máximo de los elementos del array a, almacenádolo en la variable max.

Analisis:
Primero que nada tome en cuenta que variables iba a utilizar el programa, que son el arreglo "a", "n", y "max", estas las declare despues de .DATA en mi codigo de lenguaje ensamblador. Luego tome en cuenta como debia actuar el programa, antes que nada tenia que hacer lo basico, que es mover AX a DS, luego cargar los valores de "a" y de "max", en SI y DI respectivamente, para luego comenzar un ciclo que compare cada uno de los numeros en el arreglo "a", con la variable "max", para que se guarde en max el numero con el que compara si este es mayor que lo que esta en max. Una vez que compara todos, sale al DOS.
 
 

Para comprobar que esta bien el programa, se utiliza el debug, primero escribiendo el programa en un bloc de notas y guardandolo como .asm, para despues ensamblaro y enlazarlo, y por ultimo usar el debug para ver como funciona, al correrlo paso por paso.


 
Ensamblado y enlazado
 
 
Mostrar registros DS,CS y SS
 
 
Ejecución del programa
 
 
 
Se observa como al correr paso por paso, las instrucciones van cambiando de acuerdo a lo que se tiene en el bloc de notas, y como se diseño el programa, observando que el registro CX decrement hasta ser 0 y es cuando el programa deja de ejecutarse, terminando su funcion, y estableciendo a "max" con el valor de 75.
 

#2: (Implementación de la condición if-then-else)

Se pretende realizar un programa en lenguaje ensamblador equivalente al siguiente código en C:

#include <iostream.h>
main()
{
int a[] = {-12, 5, -34, -75, -10, 25};
int n = 6;
int max, i;
int npos, nneg;
for (i = npos = nneg = 0; i < n; i++)
if (a[i] > 0)
npos++;
else
nneg++;
cout << “+: “ << npos << “; -: “ << nneg << end1;
}
 
Analisis:
Este programa es parecido al primero, con la unica diferencia que aqui usa un else, las variables a utilizar en el programa son el arreglo "a", "n", "npos" y "nneg", "max" no se usa para nada en este programa por lo que no lo tome en cuenta, estas las declare despues de .DATA en mi codigo de lenguaje ensamblador. Luego al igual que en el anterior tome en cuenta como debia actuar el programa, moviendo AX a DS para luego cargar los valores de "a" en SI, y despues comenzar un ciclo que compare cada uno de los numeros en el arreglo "a", con cero, para determinar si es positivo o negativo e ir incrementando npos o nneg, según sea el resultado, y por ultimo ir a la etiqueta salir para terminar el programa.



Para comprobar que esta bien el programa, se utiliza el debug, primero escribiendo el programa en un bloc de notas y guardandolo como .asm, para despues ensamblaro y enlazarlo, y por ultimo usar el debug para ver como funciona, al correrlo paso por paso. El tipo de salto utilizado en este programa es JNS para comprobar si el número resultante no tiene signo, y si es asi entonces salta, de lo contrario continua con la siguiente instrucción.
 

 
Ensamblado y enlazado
 


 
Mostrar registros DS, CS y SS
 



 
Ejecución del programa
 



Observamos como en el registro DX se guardaron las veces que se contaron número negativos y positivos, en la parte alta(DH) los positivos y en la parte baja(DL) los negativos.