You are on page 1of 7

UNIVERSIDAD AUTNOMA GABRIEL REN MORENO

FACULTAD CIENCIAS EXACTAS Y TECNOLOGA.


CARRERA DE INGENIERA INFORMTICA

INF221 LENGUAJE ENSAMBLADOR GRUPO SA, SB, SC


Semestre/Ao:
1/2015

EJERCICIOS DE PROGRAMACIN EN LENGUAJE


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

USO DEL NASM, GCC Y OLLYDBG

Escribir en lenguaje ensamblador 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 instruccin loop).

2.-) Dado un arreglo A de enteros positivos de longitud N, 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 que escriba o almacene los nmeros del 1 al 10 en un arreglo de 10


posiciones (inicialmente no inicializados).

4.-) Contar el nmero de elementos que sean pares y de los impares de un


arreglo A de enteros positivos de longitud N y almacenar el resultado en las
variables de memoria llamadas respectivamente pares e impares.
5.-) Contar el nmero 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.

6.-) Dado un vector A de enteros positivos de longitud N, crear un nuevo vector que
contenga los nmeros de dicho vector que sean mltiplos de 3.

7.-) Buscar el valor mximo y mnimo de un arreglo llamado A de


enteros con signo de longitud N y almacenar el mximo y mnimo en
las variables de memoria llamadas max y min respectivamente.

8.-) Definir una cadena de caracteres MAYUSCULAS, como por


ejemplo PROGRAMACION ENSAMBLADOR (donde dicha cadena
finaliza con el carcter ASCII NUL para indicar el fin de la misma) y
convertir la misma a minsculas.

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


instruccin de multiplicacin.

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


instruccin de divisin.

11.-) Definir dos nmeros a multiplicar llamados respectivamente:


multiplicando y multiplicador y realizar la multiplicacin 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 nmeros a multiplicar llamados respectivamente:


multiplicando y multiplicador y realizar la multiplicacin por software
de los mismo pero ahora mediante el algoritmo de desplazamiento y
sumas repetidas, almacenando el resultado del producto en memoria
en la variable llamada producto.

13.-) Definir un nmero y contar el nmero de bits que se encuentran


en 1, almacenar el resultado en memoria en la variable llamada
unos.
14.-) Dado un arreglo A de enteros con signo de longitud N. El programa debe
duplicar el contenido de cada elemento del arreglo, almacenando el resultado en
la misma posicin del arreglo original A.

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

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

17.-) Dado un arreglo A de enteros positivos de longitud 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 longitud 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 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 nmeros sin signo
(SS) y en otro como nmeros con signo (CS):

a) 0x80 * 0x40

b) 0x8000 * 0x2000

c) 0x80 * 0x8000

Verificar los resultados realizando las respectivas multiplicaciones en decimal.

20.-) 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 nmeros sin
signo (SS) y en otro como nmeros 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
Esamblador:

1-)
// cdigo en lenguaje C

#include <stdio.h>

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

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

2-)
#include <stdio.h>

// cdigo en lenguaje C

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

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

3-)
#include <stdio.h>

//cdigo 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>

// cdigo en lenguaje C
int a, i;
a = 0;

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

5-)
#include <stdio.h>

// cdigo en lenguaje C

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

6-)
// cdigo 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 2015


Corrado Vallet

You might also like