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.


miércoles, 23 de octubre de 2013

Ejercicio Reverse

Tecleamos el código:




Ensamblado y enlazado:





 Ejecución con debug:



ejecución sin el debug:


martes, 22 de octubre de 2013

Ejercicio Modificar programa instrucción JMP

modificar el programa para que se ejecute  10 veces 

Programa Original:



Programa modificado:



Ensamblado y enlazado:


Ejecución con debug:





Instrucción LOOP

Tecleamos el código y lo guardamos como .asm


Análisis del código:
1. Se define con la instrucción PAGE el numero máximo de lineas para una página.
2. Con TITLE definimos el titulo que le daremos
3. Definimos el modelo de memoria, en este caso SMALL
4.Indicamos inicia el código
5.Nuestro codigo que vamos a generar iniciara con un desplazamiento de direccion 100
6.Entramos a iniciar nuestro proceso  PROC NEAR
7.Inicializamos AX, Transfiere 01 a AX
8.Transfiere a BX 01
9.Transfiere a DX 01
10. Transfiere a CX 01;Iniciar.
11.Una etiqueta la cual representa el numero de iteraciones.
12. Sumar 01 a AX
13.Sumas AX a BX
14. SHL Multiplicar por dos a DX
15. Decrementar CX (Iterar si este es diferente de cero)
16.Transferir 4c00h a AX
17.Interrupción 21, salida a dos
18. fin del begin
19. Fin del programa

Ensamblado y enlazado:


Con el comando TYPE se puede ver la estructura del programa


Y por ultimo ejecutamos con el debug




Instrucción JMP

Tecleamos el código:


análisis por linea:
1. Se define con la instrucción PAGE el numero máximo de lineas para una página.
2. Con TITLE definimos el titulo que le daremos
3. Definimos el modelo de memoria, en este caso SMALL
4. Indicamos inicia el código
5.Nuestro código que vamos a generar iniciara con un desplazamiento de dirección 100
6.Entramos a iniciar nuestro Main y proceso PROC NEAR
7. Inicializamos AX, Transfiere 01 a AX
8.Transfiere a BX 01
9. Transfiere a CX 01;
10. Etiqueta A20:
11. Sumar a AX: 01
12 Sumar a BX lo contenido en AX
13.Multiplicar por dos a CX
14.Saltar a la etiqueta A20.
15. Fin del main
16. Fin del programa

Ensamblado y enlazado

Ejecución