lunes, 4 de noviembre de 2013

Traducir de C a Ensamblador

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.

Codigo en Ensamblador para el programa de maximos.











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











Utilice el registro BX  AH para Contar los números positivos y BL para Contar los números negativos
y a continuacion vemos cuantos numeros negativos y positivos tenemos.






Instrucciones de Desplazamiento, Rotación y Adeudos

Investigar como funcionan y publicar un programa ejemplo de uso de cada instrucción ( un programa puede contener varias de este conjunto de instrucciones)



Básicamente permiten multiplicar y dividir por potencias de 2

· SHL, SAL desplazar a la izquierda (desplazamient o aritmético)
· SHR desplazar a la derecha
· SAR desplazamiento aritmético a la derecha
· ROL rotación a la izquierda
· ROR rotación a la derecha
· RCL rotación con acarreo a la izquierda
· RCR rotación con acarreo a la derecha
· CLC borrar acarreo
· STC poner acarreo a 1



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.







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.


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.







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.





ROL

Desplaza todos los bits de Rd una posición hacia la izquierda. El flag C se desplaza al bit 0 de Rd. El bit 7 se desplaza dentro del flag C. Esta operación combinada con LSL, multiplica valores multi-byte con o sin signo por dos.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.

ROR

Desplaza todos los bits de Rd una posición hacia la derecha. El flag C se desplaza al bit 7 de Rd. El bit 0 se desplaza dentro del flag C. Esta operación combinada con ASR, divide valores multi-byte con o sin signo por dos.


RCL

Realiza la rotación a la izquierda de los bits del operando a través del bit CF (acarreo) 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.




CLC

Esta instrucción apaga el bit correspondiente a la bandera de acarreo, o sea, lo pone en cero.
Propósito: Limpiar bandera de acarreo.


STD

La instrucción STD pone la bandera DF en 1.
Propósito: Activar la bandera de dirección.


Ejemplo con instruccion SHR

MOV CL, 03
MOV AL, 10110111B ; 10110111
SHR AL, 01 ; 11011011 Un corrimiento a la derecha
SHR AL, CL ; 00001011 Tres corrimientos adicionales a la derecha
SHR AX, 03 ; Válido para 80186 y procesadores posteriores








Programa Var1

Hacer manualmente la ejecución y comprobar con el debug

Programa escrito en Bloc de notas


Se crea el programa ejecutable, marca un error pero esto no afecta a la ejecución del programa



El programa se ejecuta normalmente




Ejecucion manual.


Programa Reverse

Subir la ejecución manual a su blog (imagen)
ejecute el siguiente programa ( masm,link.exe) con el debug y de manera manual
Conceptos( captura de cadenas desde el teclado, uso de pilas)


Programa escrito en Bloc de notas




Se obtiene el programa ejecutable sin errores



Se va ejecutando el programa con el debug.



Aqui podemos ver como trabaja el programa realmente, escribimos una palabra y el programa la escribe al revez



Ejecución del programa manualmente





Programa que se ejecuta 10 veces

Modifique el programa para que se ejecute 10 veces y demuestre manualmente cual es el valor de ax y bx al final de la ejecución



Programa Escrito en Bloc de notas




Se sigue presentando el error "no stack segment" pero aun asi podemos ejecutar el programa




Observamos como se va ejecutando el programa paso por paso y CX es igual a 10.





Aqui se muestra como cuando CX se vuelve 0 el Loop deja continuar el programa con la siguiente instruccion.



Ejecución del programa manualmente



domingo, 3 de noviembre de 2013

Programa con instrucción de Saltos para analizar

Que pasa en el siguiente programa y porque?




Código escrito en bloc de notas



Ejecutamos el programa de saltos, y se indica "no stack segment" pero el programa se ejecuta correctamente.



En esta captura podemos ver que al realizarse el salto la ejecución del programa se cicla, por lo que no termina de ejecutarse.



Primer programa con Instruccion Loop

Publique el análisis de todos  los programas en su blog.


Código en el Bloc de notas


Aqui podemos ver la iniciacion para la ejecucion del programa, al hacer nuestro programa ejecutable aparece una indicacion de "no stack segment" pero aun asi podemos ejecutarlo.




Aqui podemos observar como la instruccion Loop decrementa 1 el registro cx, y cuando CX se vuelve 0 pasa a la instruccion que sigue