miércoles, 20 de noviembre de 2013

martes, 12 de noviembre de 2013

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

Codigo del programa en java:

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\n Escribe el mensaje que deseas imprimir: ");
        mensaje = new Scanner(System.in).next();
        System.out.print("\nDesea ejecutarlo:\n Con procedimiento Teclea 1 \n Sin procedimiento Teclea 2\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);
    }
}

Con procedimiento:

Sin procedimiento:



Actividad #11

Ejemplos de programas usando procedimiento

Codigo fuente:
;En este ejemplo se muestra una rutina que imprime un string, esta rutina imprime un
;string el cual tiene un byte O como terminador.
.MODEL SMALL
.DATA
.STACK 100H
STR1 DB 'Esta es una prueba',0
.CODE
INICIO PROC NEAR
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
; DS y ES apuntan al segmento donde estan los strings
MOV DX,OFFSET STR1
CALL PUTS
MOV AH,4CH
INT 21H
INICIO ENDP
PUTS PROC NEAR
; Entrada:
; DS:DX = Segmento:Offset dei string terminado con O
; Llama:
; PUTCHAR
PUSH AX
PUSH DX
PUSH SI
PUSHF
CLD ; Asegurar que SI y DI incrementaran
MOV SI,DX ; SI Apunta ai inicio dei string
OTRO_CAR:
LODSB ; Carga en AL ei byte que esta en DS:SI
MOV DL,AL
CALL PUTCHAR
OR AL,AL
JNE OTRO_CAR
;
POPF
POP SI
POP DX
POP AX
RET
PUTS ENDP
PUTCHAR PROC NEAR
; Entrada:
; DL = Caracter a imprimir
PUSH AX
MOV AH,2 ; Servicio para imprimir un caracter
INT 21h ; Llamar a MS—DOS
POP AX
RET
PUTCHAR ENDP

END INICIO


Ensamble del programa y corrida: 
Programa 2 con procedimiento

Codigo fuente del programa:
   .MODEL small
    .STACK 256
    .DATA
MSG1     DB 'Escriba una letra minuscula: $'
MSG2     DB 0Dh,0Ah,'En mayuscula es: '
CHAR     DB ?,'$'
exCode   DB 0
    .CODE
MAIN    PROC
;initialize ds
    mov     ax,@data     ; Initialize DS to address
    mov     ds,ax        ; of data segment
;print user prompt
    mov     ah,9         ; display string fcn
    lea     dx,MSG1      ; get first message
    int     21h          ; display it
;input a character and convert to upper case
    mov     ah,1         ; read char fcn
    int     21h          ; input char into AL
    sub     al,20h       ; convert to upper case
    mov     CHAR,al      ; and store it
;display on the next line
    mov     dx,offset MSG2 ; get second message
    mov     ah,9         ; display string function
    int     21h          ; display message and upper case
;return to DOS
Exit:






Ensamble y corrida del programa:



Programas usando macros

Codigo del primer programa:

Este programa utiliza macros de forma externa llamando al archivo que contiene las instrucciones de macros para eso necesitamos 2 archivos un archivo .txt y el archivo usual .asm ambos archivos deben estar dentro de la carpeta de masm.

Codigo del archivo txt:

inicializa macro
mov ax,@data
mov ds,ax
MOV cx, 6
Mov di,offset max
MOV SI,offset a
endm

 

Codigo del archivo .asm:
 INCLUDE macro.txt
.MODEL SMALL
.STACK
.DATA
a DB 12,5,34,75,10,25
max DB 0
numero DB '12$'
diez DB 10
msgl DB 'Numero maximo = $'
msg2 DB 1O,13,'Caracter ASCII = $'
.CODE
Inicio:
inicializa
Comparar:
MOV AL,[SI]
MOV BL,[DI]
CMP BL,AL
JNB Incrementa
MOV [DI],AL
Incrementa:
INC SI
LOOP Comparar
;convertir el numero a cadena intoString
MOV AL,max
MOV AH,0
DIV diez
ADD AH,'0'
MOV numero[1],AH
ADD AL,'0'
MOV numero[0] ,AL
; desplegar mensaje
MOV DX,OFFSET msgl
MOV AH,09H
INT 21H
MOV DX,OFFSET numero
MOV AH,09H
INT 21H
MOV DX,OFFSET msg2
MOV AH,09H
INT 21H
MOV DL,[DI]
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
END Inicio
END




Ejemplo 2 de macros:

Proceso de enlazado y ensamble(ejecucion):





La principal diferencia entre una macro y un procedimiento es que en la macro se hace posible el paso de parámetros y en el procedimiento no (esto es aplicable solo para el MASM, hay otros lenguajes de Programación que si lo permiten). Al momento de ejecutarse la macro cada parámetro es sustituido por el nombre o valor especificado al momento de llamarla. 



La principal diferencia entre una macro y un procedimiento es que en la macro se hace posible el paso de parámetros y en el procedimiento no (esto es aplicable solo para el MASM, hay otros lenguajes de Programación que si lo permiten). Al momento de ejecutarse la macro cada parámetro es sustituido por el nombre o valor especificado al momento de llamarla. 


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.
 

lunes, 28 de octubre de 2013

Instrucciones de Desplazamiento, Rotación y Adeudos

Instrucciones de Desplazamiento, Rotación y Adeudos


SAL/SHL
Realiza desplazamiento a la izquierda del primer operando tantos bits como indique el segundo operando, introduciendo un 0 y guardando el bit que sale en el bit CF del registro de estado.



Admite los siguientes formatos:
SAL/SHL reg, 1; desplaza 1 vez el contenido de reg
SAL/SHL mem, 1
SAL/SHL reg, CL; desplaza tantas veces el contenido de reg como indique CL.
SAL/SHL mem, CL
Afecta a los bit OF, CF del registro de estado.
SHR
Realiza el desplazamiento a la derecha del operando, introduciendo un 0 y guardando el resultado en el bit CF del registro de estado.
Admite los siguientes formatos:
SHR reg, 1; desplaza 1 vez el contenido de reg
SHR mem, 1
SHR reg, CL; desplaza tantas veces el contenido de reg como indique CL.



SHR mem, CL

Afecta a los bit OF, CF del registro de estado.
 
SAR
Realiza el desplazamiento a la derecha del operando, repitiendo el bit de signo y guardando el resultado en el bit CF del registro de estado.


Admite los siguientes formatos:

SAR reg, 1; desplaza 1 vez el contenido de reg
SAR mem, 1
SAR reg, CL; desplaza tantas veces el contenido de reg como indique CL.
SAR mem, CL
Afecta a todos los bit del registro de estado.




ROL
Realiza la rotación a la izquierda de los bits del operando, ignorando el bit CF del registro de estado, aunque en CF se almacena el bit que se rota.
Admite los siguientes formatos:
ROL reg, 1; desplaza 1 vez el contenido de reg
ROL mem, 1
ROL reg, CL; desplaza tantas veces el contenido de reg como indique CL.
ROL mem, CL
Afecta a los bit OF, CF del registro de estado.
ROR
Realiza la rotación a la derecha de los bits del operando, ignorando el bit CF del registro de estado, aunque en CF se almacena el bit que se rota.

Admite los siguientes formatos:
ROL reg, 1; desplaza 1 vez el contenido de reg
ROL mem, 1
ROL reg, CL; desplaza tantas veces el contenido de reg como indique CL.
ROL mem, CL
Afecta a los bit OF, CF del registro de estado.
RCL
Realiza la rotación a la izquierda de los bits del operando a través del bit CF (acarreo) del registro de estado.
Admite los siguientes formatos:
RCL reg, 1; desplaza 1 vez el contenido de reg
RCL mem, 1
RCL reg, CL; desplaza tantas veces el contenido de reg como indique CL.
RCL mem, CL
Afecta a los bit OF, CF del registro de estado.
 
RCR
Realiza la rotación a la derecha de los bits de operando a través del bit CF del registro de estado.
Admite los siguientes formatos:
RCR reg, 1; desplaza 1 vez el contenido de reg
RCR mem, 1
RCR reg, CL; desplaza tantas veces el contenido de reg como indique CL.
RCR mem, CL
Afecta a los bit OF, CF del registro de estado.



STC (pone a uno el indicador de acarreo)
Sintaxis: STC
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - 1
Pone a 1 el indicador de acarreo CF sin afectar a ningún otro indicador.


CLC (baja el indicador de acarreo)
Sintaxis: CLC
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - 0
Borra el indicador de acarreo (CF) sin afectar a ninguno otro.

jueves, 24 de octubre de 2013

Hacer manualmente la ejecución y comprobar con el debug

Codigo de nuestro programa:
.MODEL SMALL
.DATA
Var1 DW 10 ;Declaracián de una variable de tipo entero ;dw reserva una palabra en memoria o dos bytes.
 ;inicializada con 10.
.CODE ; begin
inicio: ;Punto de entrada al programa
Mov AX,5 ;AX=5
Mov BX,10 ;BX1O
Add AX,BX ;AX=AX+BX
Mov CX,8 ;CX=8
Add CX,Var1 ;CX=CX+Varl
Inc AX ;AX=AX+1
Dec BX ;BX=BX-1
Inc Var1 ;VarlVarl+l
Dec Var1 ;VanlVarl-1
Mov AX,4C00h ;Terminar programa y salir al DOS
Int 21h ; llamada al sistema operativo
END Inicio
END





Proceso de ensamblado y enlace



Despues ejecutamos el debug y abrimos los segmentos cs,ss y ds
Usamos -t para rastrear el programa
Hasta llegar a la interrupcion hasta que nos saque del debug