jueves, 28 de noviembre de 2013

Codigo imprimir caracteres

código original:



modificaciones:

-Se agrego el Stack Segment   a 256 para los números del 0 al 255 (.STACK 256)
-Se puso el .DATA para poder declarar el tipo de dato CHAR
-Después del BEGIN inicializamos el registro de datos.
MOV AX,@DATA
MOV DS, AX



Código modificado:


Ensamblado y enlazado:


ejecución del programa:





martes, 26 de noviembre de 2013

Preguntas

1. ¿Qué es el acceso a dispositivos de almacenamiento?
Es la forma en que se va tener acceso a los datos y se clasifica según el modo de acceso:
  • Secuencial
  • Aleatorio

Aleatorio: Accede a los datos de manera directa y veloz, sin interactuar directamente con datos ó espacio físico dónde se encuentran otros datos.
Secuencial: Accede a los datos de manera que es necesario interactuar directamente con los datos ó el espacio físico dónde se encuentran otros datos.

2. 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 tamamañ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 de adaptador de video

El adaptador de video consta de tres unidades básicas:
* 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.

* El video del Bios: Actúa como una interfaz con el adaptador de video , contiene rutinas, como para establecer el cursor y desplegar caracteres.
*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.

jueves, 21 de noviembre de 2013

Dispositivos de Almacenamiento


Acceso a Disco.

 

El sistema de almacenamiento en disco constituye el soporte externo de la información. Los datos se registran sobre la superficie del disco en una serie de circunferencias concéntricas llamadas pistas (track).

 

Varias pistas, una por cada cara del disco (generalmente 2), componen un cluster. Cada pista está dividida en porciones iguales llamadas sectores. Un sector es la unidad básica de almacenamiento en disco. El tamaño de un sector se mide en bytes, y depende de las características del disco.

 En esta sección se presentan 3 rutinas que permiten lectura y escritura absoluta de sectores, así como la determinación del espacio libre disponible en un disco.

 

 


 

 

Rutina _AbsoluteRead: Transfiere el contenido de un o más sectores del disco al buffer especificado, accesando directamente a los sectores lógicos. En caso de error, se enciende el bit de acarreo y AX contiene el código del error.

 

Invocación:      push <unidad de disco
push <número de sectores a leer
push <primer sector a leer>
push SEG <buffer>
push OFFSET <buffer>
call _AbsoluteRead
PUBLIC _AbsoluteRead
_AbsoluteRead PROC NEAR
ARG Buffer:DWORD,Start:WORD,NumSect:WORD,Drive:BYTE= ArgLen
push bp ; salvar BP
mov bp,sp ; permitir acceso a los argumentos
push bx ; salvar registros
push cx
push dx
push ds
mov al,Drive ; lectura absoluta de disco
mov cx,NumSect
mov dx,Start
lds bx,Buffer
int 25h
pop bx
pop ds ; recuperar registros
pop dx
pop cx
pop bx
pop bp
ret ArgLen
_AbsoluteRead ENDP

 

 

 

 

Rutina _AbsoluteWrite: Transfiere el contenido del buffer especificado a uno o más sectores de disco, accesando directamente a los sectores lógicos. En caso de error, se enciende el bit de acarreo y AX contiene el código del error.

 

Invocación:      push <unidad de disco>
push <número de sectores a escribir>
push <primer sector a escribir>
push SEG <buffer>
push OFFSET <buffer>
call _AbsoluteWrite
PUBLIC _AbsoluteWrite
_AbsoluteWrite PROC NEAR
ARG Buffer:DWORD,Start:WORD,NumSect:WORD,Drive:BYTE= ArgLen
push bp ; salvar BP
mov bp,sp ; permitir acceso a los argumentos
push bx ; salvar registros
push cx
push dx
push ds
mov al,Drive ; escritura absoluta a disco
mov cx,NumSect
mov dx,Start
lds bx,Buffer
int 26h
pop bx
pop ds ; recuperar registros
pop dx
pop cx
pop bx
pop bp
ret ArgLen
_AbsoluteWrite ENDP

Rutina _FreeDiskSpace: Devuelve en DX:AX el espacio libre en disco (en Kb). En caso de error, se enciende el bit de accarreo.

 

Invocación:      push <unidad de disco>
call _FreeDiskSpace
PUBLIC _FreeDiskSpace
_FreeDiskSpace PROC NEAR
ARG Drive:BYTE= ArgLen
push bp ; salvar BP
mov bp,sp ; permitir acceso a los argumentos
push bx ; salvar registros
push cx
mov ah,36h ; función 36h
mov dl,Drive
int 21h ; del DOS
mul cx ; DX:AX= bytes por cluster
mov cx,1024 ; CX= 1 Kb
div cx ; DX:AX= Kb por cluster
mul bx ; DX:AX= Kb libres en el disco
pop cx ; recuperar registros
pop bx
pop bp
ret ArgLen
_FreeDiskSpace ENDP

 

lunes, 11 de noviembre de 2013

Actividad #12

package UnidadIII;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class interfaz implements Runnable {

    public static void main(String[] args) {
        String mensaje = "";
        byte opcion = 1;

        System.out.print("Repetir mensaje 100 veces\nEscribe tu mensaje: ");
        mensaje = new Scanner(System.in).next();
        System.out.print("\nDesea ejecutarlo...\n1) Con procedimiento\n2) Sin procedimiento\n: ");
        opcion = new Scanner(System.in).nextByte();

        Proc proc=new Proc();
        new Thread(new interfaz()).start();
        new Thread(proc).start();

        if (opcion == 1) {
            new interfaz().procedimiento(mensaje, 0);
        } else if (opcion == 2) {
            for (int i = 0; i < 100; i++) {
                System.out.println(mensaje);
            }
        } else {
            System.err.println("Opcion no valida!");
        }
        System.out.println("Tiempo: " + proc.paraYDevuelve()+ " milisegundos");
    }

    public void procedimiento(String mensaje, int iteracion) {
        System.out.println(mensaje);
        if (iteracion < 100) procedimiento(mensaje, iteracion + 1);
    }

    @Override public void run() {}
}

class Proc implements Runnable {
    private boolean continua = true;
    private int contador = 0;

    public int paraYDevuelve() {
        continua = false;
        return contador;
    }

    @Override public void run() {
        do {
            try {
                Thread.sleep(1);
            } catch (InterruptedException ex) {
                Logger.getLogger(interfaz.class.getName()).log(Level.SEVERE, null, ex);
            }
            contador++;
        } while (continua);
    }
}

domingo, 10 de noviembre de 2013

Actividad #11 : Macros y Procedimientos

Macro

Una macro es un conjunto de instrucciones asociadas a un identificador: el nombre de la macro.
Este conjunto de instrucciones es invocado como una sola instrucción o macroinstrucción.
Normalmente las instrucciones de una macro se repiten varias veces en un programa o aparecen
frecuentemente en los programas. Para emplear una macro en un programa debemos de hacer dos
cosas: Definir la macro e invocar la macro.
La definición de una macro establece el nombre al que se asocia la macro, el número y nombre de
sus parámetros formales y qué instrucciones contiene la macroinstrucción. La sintaxis de la
definición de una macro es la siguiente:
macro nomMacro [parForm[, parForm]...]
proposición
[proposición]
...
endm [nomMacro]
donde las directivas macro y endm marcan el inicio y el final de la definición de la macro. No
generan código.
nomMacro es el nombre de la macro y se emplea al invocar la macro.
parForm es cada uno de los parámetros formales de la macro. Los parámetros permiten que una
misma macro opere sobre datos distintos.


PROCEDIMIENTO


Un procedimiento es una colección de instrucciones relacionadas que realiza una

tarea específica. También un procedimiento puede contener un conjunto de instrucciones que
deseamos que se ejecuten en varias partes del programa. Los procedimientos del lenguaje
ensamblador tienen su contraparte en los lenguajes de alto nivel, por ejemplo, en el lenguaje C estos
procedimientos se llaman funciones.

Dependiendo de su extensión y complejidad, un programa puede contener uno, algunos o inclusive
cientos de procedimientos. Para emplear un procedimiento en un programa se requiere definir el
procedimiento y llamarlo. Al definir a un procedimiento escribimos las instrucciones que contiene.
Al llamar al procedimiento transferimos el control del flujo del programa al procedimiento para que
sus instrucciones se ejecuten.


Definición de un procedimiento

La sintaxis de la definición de un procedimiento es la siguiente:
proc nomProc

proposición
[proposición]
...
endp [nomProc]
Las directivas proc y endp marcan el inicio y el final del procedimiento. No generan código.
nomProc es el nombre del procedimiento y etiqueta la primera instrucción del procedimiento.

La llamada a un procedimiento normalmente tiene la siguiente forma:
call nomProc