jueves, 16 de mayo de 2013

Acceso a discos en lenguaje ensamblador

Dispositivo de almacenamiento de acceso directocualquier 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 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.


un ejemplo podria ser: 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.


martes, 7 de mayo de 2013

desplazamiento y rotacion

title desplaxamiento_rotacion
 .model SMALL
 .code
 .stack
 start:
  mov ax,10
  mov bx,20
  mov cx,3

 call DesplazaD
  call DesplazaI
  call RotaD
  call RotaI

 mov ax,400h
  init 21h

;subrutinarias
  DesplazoD PROC
  shr ax,1
  sar ax,1

 ret
  DesplazaD ENDP
  DesplazaI PROC

 shl ax,1
  sal ax,1

 ret
  DesplazaI ENDP

 RotaD PROC
  ROR bx,1
  ROC bx,1

 ret
  RotaD ENDP
  RotaI PROC
 
 ROL bx,1
  RCL bx,1

 ret
  RotaI ENDP

end start

Instrucciones de suma y resta


 .MODEL SMALL
 .CODE
 ORG 100H
 BEGIN: JMP SHORT MAIN
 ;----------------------------------------------------------------------------
 BYTEA DB 64H ;DATOS
 BYTEB DB 40H
 BYTEC DB 16H
 WORDA DW 4000H
 WORDB DW 2000H
 WORDC DW 1000H
 ;----------------------------------------------------------------------------
 MAIN PROC NEAR ;Procedimiento principal:
 CALL B10ADD ;Llama a la rutina ADD
 CALL C10SUB ;Llama a la rutina SUB
 INT 21H
 MAIN ENDP
 ; Ejemplos de suma (ADD) de bytes:
 ;----------------------------------------------------------------------------
 B10ADD PROC
 MOV AL, BYTEA
 MOV BL, BYTEB
 ADD AL, BL ;registro a registro
 ADD AL, BYTEC ;memoria a registro
 ADD BYTEA, BL ;registro a memoria
 ADD BL, 10H ;inmediato a registro
 ADD BYTEA, 25H ;inmediato a memoria
 RET
 B10ADD ENDP
 ; Ejemplos de resta (SUB) de palabras:
 ;----------------------------------------------------------
 C10SUB PROC
 MOV AX, WORDA
 MOV BX, WORDB
 SUB AX,BX ;Registro a registro
 SUB AX,WORDC ;Memora de registro
 SUB WORDA, BX ;Registro de memoria
 SUB BX, 1000H ;Inmediato de registro
 SUB WORDA, 256H ;Inmediato de memoria
 RET
 C10SUB ENDP
 END BEGIN

francisco cordero:

Captura de Cadenas

maria yesenia chagoyan


Incremento y Decremento (Lenguaje Ensamblador)

sergio castrillo
 

ciclos condicionales

codigo estefania

title p12cmpst
.model small
.stack 100h
.data
mensaje db 'mensaje'
.code
inicio proc near
start:
mov ax,@data
mov ds,ax
mov bl,5
mov ah,2
proceso:
add bl,30h
mov dl,bl
int 21h
mov dl,oah
int 21h
mov dl,0dh
int 21h
 sub bl,30h
 sub bl,1
 cmp bl,0
 jge proceso
 mov ax,4c00h
 int 21h

 inicio endp

 end inicio


programa :
 
 



Saltos en Ensamblador

ejercicio de diana

Comparación y prueba

codigo de sergio aranda:








programas unidad 2

10110467
10110485
10110592
10110610
10110625
10740056
10110840
10110980
10111256
10110077
10111421

actividad 13


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.

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.

Diferencia: La principal diferencia entra una macro y un procedimiento es que la macro hace posible el paso de parámetros y el procedimiento no( eso es aplicable solo para el TASM , hay otros lenguajes de programación que si lo permiten) .

PROCEDIMIENTOS PROGRAMA:




 
 
MACRO PROGRAMA:
 
al estar corriendo los tracers cai en conclusion que se habia ciclado , pero igual aqui estan las pantallas








lunes, 6 de mayo de 2013

actividad 12


pantalla principal: 



al ingresar el mensaje y dar inicio en el boton comenzar

al presionar TERMINAR y muestra el mensaje multiplicado por 100



codigo:


package civer;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 *
 * @author CRAZY
 */
 class mensaje extends JFrame implements ActionListener
 {
private JLabel pc1,nombre,tiempInicia,tiempoTermina,;
        private JTextField nomb,tiempoI,tiempoT;
        private JButton empieza,termina;
        private JPanel p1,p2,p3,p4;
        private Container con;
        private javax.swing.Timer t;
        private int horas,horas1;
        private int minutos,minutos1;
        private int segundos,segundos1;
        private String calculaTiempo,calculaTiempo1,nombr;
          int t1=1,t2,t3,t4,totalA,tt;
          double totalApagar;
    private final JLabel logo;
        public mensaje()
        {
        con=this.getContentPane();
        con.setLayout(new GridLayout(4,0));
        p1=new JPanel();
        p1.setLayout(new FlowLayout());
        p1.setBackground(new Color(255,98,21));
         p2=new JPanel();
        p2.setLayout(new FlowLayout());
        p2.setBackground(new Color(255,98,21));
         p3=new JPanel();
        p3.setLayout(new FlowLayout());
        p3.setBackground(new Color(255,98,21));
         p4=new JPanel();
        p4.setLayout(new FlowLayout());
        p4.setBackground(new Color(255,98,21));
        Icon logi=new ImageIcon("c:\\INTERFAZ_LOGO.jpg");
        logo=new JLabel(logi);
    p1.add(logo);
        nombre=new JLabel("mensaje");
        nomb=new JTextField(20);
     
        p2.add(nombre);
        p2.add(nomb);
        tiempInicia=new JLabel("Tiempo de inicio");
        tiempoI=new JTextField(10);
     
        tiempoTermina=new JLabel("Tiempo termina ");
        tiempoT=new JTextField(10);
     
     
        nomb.setBackground(new Color(236,153,62));
         tiempoI.setBackground(new Color(236,153,62));
        tiempoT.setBackground(new Color(236,153,62));
        p3.add(tiempInicia);
        p3.add(tiempoI);
        p3.add(tiempoTermina);
        p3.add(tiempoT);
     
        con.add(p1);
        con.add(p2);
        con.add(p3);
     
        empieza=new JButton("Comienza");
        empieza.setBackground(Color.ORANGE);
        termina=new JButton("Termina");
        termina.setBackground(Color.ORANGE);
        p4.add(empieza);
        p4.add(termina);
        con.add(p4);
        empieza.addActionListener(this);
        termina.addActionListener(this);
        this.setSize(300,500);
        this.setVisible(true);
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            t = new javax.swing.Timer(horas, this);
         
if(e.getSource()==empieza){
        Calendar now = Calendar.getInstance();
             horas   = now.get(Calendar.HOUR_OF_DAY);
             minutos = now.get(Calendar.MINUTE);
             segundos = now.get(Calendar.SECOND);
             calculaTiempo=horas+":"+minutos+":"+segundos;
             tiempoI.setText(String.valueOf(calculaTiempo));

        JOptionPane.showMessageDialog(null,"su mensaje a multiplicar es: \n"+ nomb.getText());
    }
        if(e.getSource()==termina){
        Calendar now = Calendar.getInstance();
             horas1   = now.get(Calendar.HOUR_OF_DAY);
             minutos1 = now.get(Calendar.MINUTE);
             segundos1 = now.get(Calendar.SECOND);
             calculaTiempo1=horas1+":"+minutos1+":"+segundos1;
             tiempoT.setText(String.valueOf(calculaTiempo1));

           
             JOptionPane.showMessageDialog(null,"mensaje: \n"+ nomb.getText()x100");
         
           

    }
     
     
     
        }
        public static void main(String[] args) {
         mensaje m=new mensaje();
     }
   
    }

actividad 11


Macros: es un grupo de instrucciones repetitivas en un programa que se codifican solo una vez y pueden utilizarse cuantas veces sea necesario. Al momento de ejecutarse la macrco cada parámetro es sustituido por el nombre o el valor especificado al momento de la llamada.
Para definir una macro, se utiliza la directiva MACRO. El formato deesta directiva es : (nombre_de_macro) MACRO (lista_parámetros).
Procedimientos: conjunto de instrucciones que tienen la finalidad de ejecutar una tarea especifica dentro de un programa. Los procedimientos son similiares alas macros
un procedimiento es un conjunto de instrucciones a los que podems dirigir el flujo de nuestro programa ,  y una vez terminada la ejecución de dichas instrucciones se devuleve el control ala siguiente línea a procesar del código que mando a llamar el procedimiento.
Diferencias:
-es una extensión de un determinado programa, mientras que la macro es  un modulo con funciones especificas que puede ser utilizado por diferentes programas.
 
-la forma de llamar a cada uno , para llamar a un procedimiento se requiere el uso de una directiva, em cambio la llamada alos macros se realiza como si se tratara de una instrucción del ensamblador.
 
-La principal diferencia entra una macro y  un procedimiento es que la macro hace posible el paso de parámetros y el procedimiento no( eso es aplicable solo para el TASM , hay otros lenguajes de programación que si lo permiten) . 

lunes, 29 de abril de 2013

exposicion" almacenamiento y captura de datos!!!"


La captura y almacenamiento de datos numéricos en el lenguaje ensamblador nos permite la opción de meter o introducir algún numero en un programa deceado , en el cual dando las instrucciones necesarias se pueden además de ser capturadas almacenarlas dentro del programa.
Para la introducción de los datos ya sea numéricos o carácter es necesario la interaccion a través de un dispositivo como : teclado, raton, monitor,etc.
Cuando un programa tiene mas variables que registros, el compilador almacena las variables mas utilizadas en los registros, y las restantes en memoria: derramar registros (spilling)
Solo las instrucciones de carga y almacenamiento acceden a memoria , según los cálculos efectuados sobre valores en los registros.
alineación: una cantidad esta alineada si su dirección de memoria es un múltiplo de su tamaño en bytes.
casi todas las instrucciones de carga y almacenamiento operan solo sobre datos alineados.
instrucciones para alinear datos o alineados son : lwl , lwr, swl y swr.








El ensamblador permite definir elementos para datos de diferentes longitudes de acuerdo con un conjunto de directivas especificas para ello. El formato general es el siguiente:

Donde dn es una de las directivas de la siguiente tabla:

Los datos se almacenan en memoria en el orden en que han sido declarados y podemos
acceder a ellos usando el nombre dado en la declaración. Por ejemplo, si declaramos los siguientes
datos:
Numero dw 5
Tabla 3, 4, 5
cadena  db ‘hola’
El aspecto de la memoria sería el siguiente:

Asimismo, al igual que cuando operamos con dos registros, el “tamaño de la variable” debe
ser el mismo que el del otro operando, esto es, operaciones como las siguientes darían un error al
ensamblar:
MOV AL, Numero
MOV AX, Tabla

Las constantes numéricas
se usan para definir valores aritméticos y direcciones de memoria.
Las constantes numéricas no llevan comillas, como sucede con las cadenas de caracteres, y van seguidas de un indicador de la base utilizada. Si se omite éste, se supone el sistema decimal.

Si el primer dígito de una constante hexadecimal es una letra (A..F), debe anteponerse un  cero, para que el ensamblador pueda distinguir que se trata de una constante numérica y no  una cadena de caracteres.
Existe un elemento en ensamblador  que es la DIRECTIVA que es la que se encarga de asociar el nombre de un símbolo con la expresión enterea.
La Directiva EQU.
La directiva EQU no define ningún tipo de dato, sino que define constantes, o sea, define  valores que el ensamblador puede sustituir en otras instrucciones. Por ejemplo,
VALOR EQU 100
Cada vez que en el programa aparezca VALOR, el ensamblador lo sustituirá por 100. Así,
MOV AX, VALOR
Es equivalente a
MOV AX, 100
Es muy útil para evitar tener que actualizar en varias instrucciones una constante que se repite  y que se modifica al depurar el programa




Ejemplos:
1
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 'DIGITE VALOR 2: $'
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    MOV AH, 09h        ;imprime mensaje VAL1 con la
    INT 21h            ;función 9h
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    PUSH AX
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    MOV AH, 09h        ;imprime mensaje VAL1 con la
    INT 21h            ;función 9h
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    MOV BL, AL
    POP AX
    ADD BX, AX
    MOV AH, 4Ch
    INT 21h
END inicio








2
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13, 10, 'DIGITE VALOR 2: $'
    numeros DB 0
.CODE
 
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    MOV AH, 09h   ;imprime mensaje VAL1 con la
    INT 21h    ;función 9h
    
    MOV AH, 01h  ;captura un valor del teclado
    INT 21h    ;y se guarda en AL
    
    sub al, 48  ;restamos al caracter el ASCII de 0 para convertirlo en     un numero
 
    mov numeros, al
    
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    MOV AH, 09h        ;imprime mensaje VAL1 con la
    INT 21h            ;función 9h
  
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    sub al, 48                     ;restamos al caracter el ASCII de 0 p ara convertirlo en un numero
    add numeros, al             ;aca tenemos el resultado de la suma
    
    MOV AH, 4Ch
    INT 21h
END inicio









3
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13,10,'DIGITE VALOR 2: $'
    MSG DB 13,10,'LA SUMA ES: $'
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    PUSH AX
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    MOV BL, AL         ;muevo el valor que se capturo en BL
    POP AX             ;saca el valor introducido a la pila
    ADD BX, AX         ;suma BX con AX y guarda en AX
    MOV AX, SEG MSG
    MOV DS, AX
    MOV DX, OFFSET MSG  ;Envia a DX el mensaje MSG
    CALL Print
    MOV AH, 02h
    MOV DX ,AX
    INT 21h    
    MOV AH, 4Ch
    INT 21h
Print Proc Near
    MOV AH, 09h        ;imprime mensaje con la
    INT 21h            ;función 9h
    RET
Print Endp
Capt Proc Near
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    RET    
Capt Endp
END inicio
Ejercicio 3



                                                 

4 PARA PRACTICAR ;)
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13,10,'DIGITE VALOR 2: $'
    MSG DB 13,10,'LA SUMA ES: $'
    RESU DB 0
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    MOV RESU, AL
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    ADD RESU, AL
    MOV AX, SEG MSG
    MOV DS, AX
    MOV DX, OFFSET MSG  ;Envia a DX el mensaje MSG
    CALL Print
    MOV AH, 02h
    MOV DX ,AX
    INT 21h    
    MOV AH, 4Ch
    INT 21h
Print Proc Near
    MOV AH, 09h        ;imprime mensaje con la
    INT 21h            ;función 9h
    SUB AL, 48          ;restamos al caracter el ASCII de 0 para convertirlo en un numero
    RET
Print Endp
Capt Proc Near
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    RET    
Capt Endp
END inicio