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.
 

lunes, 28 de octubre de 2013

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.


CLC/STC
Pone a 0 ó a 1, respectivamente, el bit CF del registro de estado.

Los siguientes son ejemplos de programas que contienen estas instrucciones:












 
 

Fuentes:
 


jueves, 24 de octubre de 2013

Programa Reverse

Primeramente se escribe el programa fuente en un editor de texto, en este caso el bloc de notas.
 
 
Luego hay que entrar al cmd, donde se ensambla y enlaza el programa fuente, de la siguiente manera.
 
 
Se entra al debug del programa para ver los registros DS, CS y SS, y comenzar a correr el programa paso por paso.
 
 
De la siguiente manera corre el programa paso por paso hasta que ocurre la interrupción y saca del debug.
 
 
Esto es lo que hace el programa cuando se ejecuta, invierte el orden de las palabras que se escriben.
 

Las siguientes imagenes muestran como se corre a mano el programa.


martes, 22 de octubre de 2013

Actividad lunes 21 de octubre

El siguiente bloc de notas muestra el programa modificado para que ejecute el programa 10 veces:
 
 
De la siguiente forma se ensambla y enlaza:

 
Se accede al debug y se muestran los registros DS, CS y SS

 
Se corre paso por paso el programa hasta que termina su ejecución:

 
Ahora se hace a mano la corrida del programa para ver como quedan los registros AX y BX:

domingo, 20 de octubre de 2013

Análisis de programas Loop y JMP

El siguiente programa contiene la instrucción loop.
 
 
Línea 1: Define el número máximo de líneas para listar en una página.
Línea 2: Define el titulo del programa.
Línea 3: Define el modelo de memoria.
Línea 4: Inicia el código.
Línea 5: Inicia la generación de código a partir del desplazamiento de dirección 100.
Línea 6: Comienza el proceso.
Línea 7: Mueve 01 al registro AX.
Línea 8: Mueve 01 al registro BX.
Línea 9: Mueve 01 al registro DX.
Línea 10: Mueve 10 al registro CX.
Línea 11: Nombre de la etiqueta indicando el número de iteraciones.
Línea 12: Suma 1 al registro AX.
Línea 13: Suma el valor de AX al registro BX.
Línea 14: Multiplica por dos a DX.
Línea 15: Comienza un ciclo, decrementando de uno en uno hasta que sea cero.
Línea 16: Mueve el valor 4C00 hexadecimal al registro AX
Línea 17: Ocurre la interrupción.
Línea 18: Termina el proceso.
Línea 19: Termina el programa.

 
En la imágen anterior se muestra como ensamblarlo y enlazarlo, donde se nos muestra una advertencia de que no se declaró stack segment, pero como no lo utilizamos no es ningún problema. En las siguientes imagenes se puede ver como al entrar al debug, se consigue ver el contenido de los registros DS, CS y SS, así como la corrida del programa paso por paso.



 
Al terminar de correr todo el programa nos saca del debug.
 
Si lo hicieramos directo en el debug podemos observer como va cambiando de dirección de acuerdo a la isntrucción que vamos poniendo.
 
 
Lo podemos comparar con el programa de acuerdo a la sig. imagen. Observando que coinciden las direcciones.
 
 
 
El siguiente programa es sobre la instrucción JMP.

 
Línea 1: Define el número máximo de líneas para listar en una página.
Línea 2: Define el titulo del programa.
Línea 3: Define el modelo de memoria.
Línea 4: Inicia el código.
Línea 5: Inicia la generación de código a partir del desplazamiento de dirección 100.
Línea 6: Comienza el proceso.
Línea 7: Mueve 01 al registro AX.
Línea 8: Mueve 01 al registro BX.
Línea 9: Mueve 01 al registro CX.
Línea 10: Nombre de la etiqueta indicando el número de iteraciones.
Línea 11: Suma 1 al registro AX.
Línea 13: Suma el valor de AX al registro BX.
Línea 14: Multiplica por dos a DX.
Línea 15: Salta a la etiqueta A20, realizando una especie de ciclo.
Línea 18: Termina el proceso.
Línea 19: Termina el programa.
 
 
En la imágen anterior se muestra como ensamblarlo y enlazarlo, donde se nos muestra una vez máas la advertencia de que no se declaró stack segment, pero no lo utilizamos por lo que no es ningún problema. En las siguientes imagenes se puede ver como al entrar al debug, se consigue ver el contenido de los registros DS, CS y SS, así como la corrida del programa paso por paso.



 
Al terminar de correr todo el programa nos saca del debug.
 
Si lo hicieramos directo en el debug podemos observer como va cambiando de dirección de acuerdo a la isntrucción que vamos poniendo.
 
 
Lo podemos comparar con el programa de acuerdo a la sig. imagen. Observando que coinciden las direcciones.