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

miércoles, 6 de noviembre de 2013

Programas en C

 Implementación de la condición if-them

1. se pretende realizar un programa en lenguaje ensamblador equivalente al sig. 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;
              }

Código

 Enlazado y ensamblado:




Ejecución con debug:



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:
Código:  


#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;



Código:


Ensamblado y enlazado:

 Ejecución con debug:


miércoles, 30 de octubre de 2013

lunes, 28 de octubre de 2013

Instrucciones de Desplazamiento, Rotación y Adeudos.


Bits de un operando un determinado número de posiciones a la izquierda o a la derecha. La estructura de los operandos manejados por estas instrucciones y su significado es idéntico para las cuatro instrucciones. Todas ellas trabajan sobre un operando fuente y un operando destino.
El Operando Destino contiene el dato que va a ser objeto del desplazamiento y debe ser del tipo, registro o memoria.
El Operando Fuente determina la cantidad de posiciones que va a ser desplazado el operando destino. El operando fuente sólo puede ser un dato inmediato de 8 bits (I8) o bien el registro CL.
SHL (Shift Left = desplazamiento a la izquierda)
Se desplazan a la izquierda los bits del operando destino tantas posiciones como indique el operando fuente. El desplazamiento de una posición se realiza de la siguiente forma: el bit de mayor peso del operando se desplaza al bit CF del registro de estado, el resto de los bits se desplazan una posición hacia la izquierda, y la posición de menor peso se rellena con un 0. Este proceso se representa en la figura siguiente.



SHR (Shift Right = desplazamiento a la derecha)
La instrucción shr funciona de la misma forma que shl, pero desplazando los bits a la derecha en lugar de a la izquierda, tal y como se muestra en la figura siguiente.

SAR (Shift Arithmetic Right = desplazamiento aritmético a la derecha)
Esta instrucción desplaza los bits del operando destino a la derecha tantos bits como indique el operando fuente. Esta forma de funcionamiento es similar a la de la instrucción shr; sin embargo, ambas instrucciones se diferencian en que sar, en vez introducir ceros por la izquierda del operando, replica el bit de mayor peso (bit de signo) en cada desplazamiento. esquemáticamente, la instrucción sar trabaja de la siguiente forma:



El desplazamiento a la derecha realizado por la instrucción sar recibe el nombre de aritmético porque sirve para dividir un operando entre una potencia entera de 2.
El desplazamiento aritmético a la derecha de un operando (considerado con signo) n posiciones equivale a la división entera del operando entre 2n.

SAL (Shift Arithmetic Left = desplazamiento aritmético a la izquierda)
El objetivo de un desplazamiento aritmético a la izquierda es multiplicar un operando, interpretado con signo, por una potencia de 2.

Para llevar a cabo este tipo de desplazamiento, hay que desplazar los bits del operando hacia la izquierda introduciendo ceros por su derecha. En realidad, este tipo de desplazamiento es idéntico al llevado a cabo por la instrucción shl; por tanto, sal y shl son, de hecho, la misma instrucción y se codifican con el mismo codigocodigo

Instrucciones de Rotación
digo máRCL DESTINO,CONTADOR ;Rota destino a través de carry a la izquierda contador veces
RCR DESTINO,CONTADOR ;Rota destino a través de carry a la derecha contador veces
ROL DESTINO,CONTADOR ;Rota destino a la izquierda contador veces
ROR DESTINO,CONTADOR ;Rota destino a la derecha contador veces
SAL DESTINO,CONTADOR ;Desplaza destino a la izquierda contador veces y rellena con ceros
SAR DESTINO,CONTADOR ;Desplaza destino a la derecha contador veces y rellena con bit SF
SHR DESTINO,CONTADOR ;Desplaza destino a la derecha contador veces y rellena con ceros
NOTA: El DESTINO va a ser la dirección y el CONTADOR es el número de veces que se repite la instrucción.