Sei sulla pagina 1di 7

UNIVERSIDAD AUTÓNOMA GABRIEL RENÉ MORENO

FACULTAD CIENCIAS DE LA COMPUTACION.


CARRERA DE INGENIERÍA INFORMÁTICA, SISTEMAS Y REDES.

INF221 LENGUAJE ENSAMBLADOR GRUPOS “SA”, “SB”, “SC”

Semestre/Año: 1/2016

EJERCICIOS DE PROGRAMACIÓN EN LENGUAJE ENSAMBLADOR


PARA LA ARQUITECTURA x86-32
(INTEL ARCHITECTURE 32 BITS)

USO DEL NASM, GCC Y OLLYDBG

Escribir en lenguaje ensamblador, crear los ejecutables y probar el correcto


funcionamiento con OllyDbg de los siguientes programas de 32 bits para la
arquitectura x86-32 de Intel:

1.-) Escribir un programa que sume 10 veces 5 y almacenar dicha suma en


memoria en una variable denominada “resultado”. (Hacer uso de la
instrucción “loop”).

2.-) Dado un arreglo A de enteros positivos de dimensión N, (al definir un arreglo se debe
indicar el total de elementos N que lo formaran, a este total N se le conoce como
Dimensión del Arreglo), calcular la “suma” de los elementos del mismo y almacenar el
resultado en memoria en una variable llamada “suma”.

Realizar al efecto 3 programas:

a) usando el modo de direccionamiento “indirecto por registro”


b) con el modo “base + índice”
c) utilizando el modo “índice escalado”.

3.-) Programa para cargar un arreglo llamado A de dimensión N (inicialmente no


inicializado), los N primeros números “pares”.
4.-) Dado un arreglo A de dimensión N, realizar un programa a fin de “invertir” dicho
arreglo.

5.-) Contar el número de elementos que sean “pares” y de los “impares” de un arreglo A
de enteros positivos de dimensión N y almacenar el resultado en las variables de memoria
llamadas respectivamente “pares” e “impares”.

6.-) Contar el número de elementos “positivos” y “negativos” de un arreglo A de enteros


con signo de longitud N y almacenar el resultado en las variables de memoria llamadas
respectivamente “positivos” e “negativos”.

7.-) Dado un arreglo A de enteros positivos de dimensión N, crear un nuevo arreglo que
contenga los números de dicho arreglo que sean múltiplos de 3.

8.-) Encontrar el “mayor valor” y el “menor valor” existentes en un arreglo


llamado A de enteros con signo de dimensión N y almacenar el mayor y
menor valor encontrado en las variables de memoria llamadas MAYOR y
menor respectivamente.

9.-) Escribir un programa que calcule x = 16*y sin utilizar la instrucción de


multiplicación.

10.-) Escribir un programa que calcule x = y/32 sin utilizar la instrucción de


división.

11.-) Definir dos números sin signo a multiplicar llamados respectivamente:


multiplicando y multiplicador y realizar la multiplicación por software de los
mismo mediante el algoritmo de “sumas repetidas”, almacenando el
resultado del producto en memoria en la variable llamada “producto”.

12.-) Definir dos números sin signo a multiplicar llamados respectivamente:


multiplicando y multiplicador y realizar la multiplicación por software de los
mismo pero ahora mediante el algoritmo de “desplazamiento y sumas
repetidas”, almacenando el resultado del producto en memoria en una
variable llamada “producto”.
13.-) Definir un número a nivel de doble word y contar el “número de bits”
que se encuentran en 1, almacenar el resultado en memoria en una variable
llamada unos.

14.-) Dado un arreglo A de enteros con signo de dimensión N. El programa debe “duplicar”
el contenido de cada elemento del arreglo, almacenando el resultado en la misma posición
del arreglo original A.

15.-) Dado dos arreglos A y B de enteros con signo de la misma dimensión N, crear un
nuevo arreglo llamado C donde C[i] = A[i] + B[i]

16.-) Dado dos arreglos A y B de enteros con signo de la misma dimensión N, crear un
nuevo arreglo C donde C[i] = A[i] / 2 + 2*B[i]

17.-) Dado un arreglo A de enteros positivos de dimensión N calcular el “promedio” de


todos los elementos del mismo, almacenando el resultado en memoria en una variable
llamada “promedio”.

18.-) Dado un arreglo A de enteros positivos de dimensión N, calcular la suma de los


elementos que se encuentran en las posiciones “impares” (índice impar) (A[1] + A[3] +
A[5] + …..), almacenando el resultado en memoria en una variable llamada “suma_impar”,
el resultado de dicha suma.

19.-) Definir una cadena de caracteres “MAYUSCULAS”, como por ejemplo


“PROGRAMACION ENSAMBLADOR”, 0 (donde dicha cadena finaliza con el
carácter ASCII “NUL” para indicar el fin de la misma como mostrado) y
convertir la misma a “minúsculas”.

20.-) Definir las variables inicializadas: 0x80, 0x40 a nivel de “byte” y las siguientes
variables 0x2000, 0x8000 a nivel de “word” y realizar un programa que realice las
siguientes multiplicaciones sea considerando en un caso como números sin signo (SS) y en
otro como números con signo (CS):

a) 0x80 * 0x40

b) 0x8000 * 0x2000
c) 0x80 * 0x8000

Verificar los resultados realizando las respectivas multiplicaciones en “decimal.”

21.-) Definir las variables inicializadas: 0x80, 0x16 a nivel de “byte” y las siguientes
variables 0x2000, 0x10, 0x1000 a nivel de “word” y realizar un programa que realice las
siguientes divisiones, sea considerando en un caso como números sin signo (SS) y en otro
como números con signo (CS):

a) 0x2000 / 0x40

b) 0x80 / 0x16

c) 0x100000 / 0x2000

d) 0x2000 / 0x1000

Verificar los resultados realizando las respectivas multiplicaciones en “decimal.”

PROGRAMAS EN LENGUAJE “C”


a) Traducir los siguientes programas escritos en lenguaje “C” a lenguaje
“Ensamblador”:

1-)
// código en lenguaje C

#include <stdio.h>

int a, b, c;
a=27;
b=541;

main()
{
c= a+b;
b=a;
}

2-)
#include <stdio.h>

// código en lenguaje C

int a, b, c;
a= 27;
b= 541;
c= 32;

main()
{
c= (a+b)/c;
}

3-)
#include <stdio.h>

//código en lenguaje C
unsigned a = 1;
unsigned b = 2;
unsigned c = 3;

main() {
a = b + c;
if (a == 4)
b = 3;
else
c = a & b;
while (a > 0) a--;
}

4-)
#include <stdio.h>
// código en lenguaje C
int a, i;
a = 0;

main()
{
for(i=0; i<10; i++);
a = a + 1;
}

5-)
#include <stdio.h>

// código en lenguaje C

//-------funcion---------
int funcion(int a, int b, int c)
{
return a*b + c;
}
//-------main------------
int main()
{
funcion(1, 2, 3);
return 0;
}

6-)
// código en lenguaje C
#include <stdio.h>

// Global variables example

void f(int x, int y, int *suma, int *producto)


{
*suma= x+y;
*producto= x*y;
};
int suma, producto; //global

void main()
{
f(5, 10, &suma, &producto);
};

b) Posteriormente compilar dichos programas escritos en lenguaje C a fin de crear el


correspondiente programa ejecutable (.exe).
Usar para el efecto el compilador de lenguaje C “gcc” instalado en MinGW. Ejemplo:

gcc –o P1 P1.c

Una vez que el compilador creo el programa ejecutable “P1.exe”, cargar dicho programa
ejecutable en el “OllyDbg” y comparar el programa ensamblador creado por el compilador
de lenguaje C “gcc”, con el programa escrito en forma manual del primer punto.

revisado: abril 2016


corrado vallet

Potrebbero piacerti anche