Está en la página 1de 19

Universidad de El Salvador

Facultad de Ingeniería y Arquitectura


Escuela de Ingeniería Eléctrica
Sistemas Digitales Programables

Laboratorio No. 5:
"Uso del lenguaje ensamblador con el compilador C"

Catedrático:
Ing. Ricardo Cortez
Coordinador: Instructor:
Br. Ernesto Cerón. Br. David Martínez

Bachilleres: Carnet:
Hernández Nieto, Jairo Alejandro HN14001
Sorto Castillo, Jairo Josué SC14009

Porcentaje Nota
Introducción 5%
Objetivos 5%
Marco Teórico 10%
Desarrollo de la practica 10%
Asignaciones 40%
P1 8%
P2 8%
P3 8%
P4 8%
P5 8%
Conclusiones 30%
Nota final

Ciudad Universitaria, viernes 19 de mayo del 2017


Lab. 5 SDG115

Introducción:

El presente informe de laboratorio contiene la práctica número 5 de la asignatura sistemas


digitales programables de la escuela ingeniería eléctrica de la Universidad del Salvador la cual
consta de hacer una combinación entre el lenguaje de programación C con ensamblador, como
sabemos en las asignaturas de programación de segundo año se profundiza en el lenguaje ANSI
C y C++; ahora con los conocimientos adquiridos sobre ensamblador para los microprocesadores
8086 y 8088 se busca combinar dichos lenguajes para facilitar la construcción de aplicaciones.

En la actualidad cada vez se necesitan aplicaciones que posean un ambiente gráfico amigable
para el usuario, interfaces que pueden realizarse utilizando lenguajes de programación de alto
nivel como Visual C, Visual Basic, GTK, Java, entre otras.

Cuando se requieren módulos de programación con rutinas que precisan alta velocidad como
lectura y escritura de puertos, es decir, manipulación directa de periféricos; resultan mucho más
rápidas las rutinas realizadas en lenguaje ensamblador que las escritas en lenguajes de alto nivel.
Además, si el lenguaje C corre en Windows se puede ejecutar una aplicación de control con la pc
mientras se ejecutan otras aplicaciones.

Entonces realizar la combinación de un lenguaje de alto nivel junto con ensamblador destaca las
virtudes de ambos tipos de programación y minimiza los defectos que estos tienen tanto para el
usuario como para las y los programadores.

Este reporte consta de un desarrollo de la práctica donde se describe lo realizado en la misma,


una serie de asignaciones propuestas por la catedra de la asignatura y las conclusiones de los
alumnos aparte de los elementos fundamentales de un reporte.

Todo esto se detalla a continuación.

2
Lab. 5 SDG115

Objetivo General:

 Realizar una introducción sobre las diferentes maneras de combinar lenguaje ensamblador
con el lenguaje C, para facilitar la construcción de aplicaciones.

Objetivos Específicos:
 Conocer las formas de combinar lenguaje ensamblador con el lenguaje C y las directivas
básicas para la elaboración de programas.

 Identificar las ventajas e importancia de combinar lenguaje ensamblador y el lenguaje C


para la elaboración de aplicaciones.

 Explicar con Claridad las asignaciones planteadas.

3
Lab. 5 SDG115

Marco Teórico:
Existe una relación muy estrecha entre la programación en C y la programación en ensamblador.
C fue creado para evitarle a los programadores del sistema operativo UNIX seguir escribiéndolo
en ensamblador. Las ventajas de programar en C lo mismo que antes se programaba en
ensamblador son obvias: portabilidad y legibilidad a través de un código bien estructurado. Sin
embargo, las partes del sistema en las que es necesario trabajar con características específicas del
hardware no pueden ser escritas en C.

En general hay dos estrategias para mezclar código en C con código en ensamblador. La primera
consiste en compilar archivos escritos en C y ensamblar otros escritos en código de ensamblador
para luego enlazarlos todos juntos. La segunda se trata de embeber código escrito en ensamblador
dentro de código escrito en C a través de algún mecanismo que ofrezca el compilador usado. En
este artículo se tratará sólo la primera estrategia.

Existen dos procedimientos para combinar lenguaje ensamblador con el lenguaje C:

 El primero consiste en incluir las rutinas en ensamblador con el código escrito en C.


 El segundo consiste en ensamblar el código ensamblador y compilar el código escrito en
C por separado, para posteriormente enlazarlos juntos.

En esta práctica se explicará el primer caso, y para ellos hay dos formas de hacerlo:

1. Colocando la instrucción asm antes de cada línea de código en lenguaje ensamblador. Por

Ejemplo:

printf(“Mensaje”);

asm mov bx,0

asm add ax,bx

asm mv dato,ax

4
Lab. 5 SDG115

printf (“Resultado:”);

2. Colocando asm y luego encerrar entre llaves las instrucciones en ensamblador.

Por ejemplo:

printf (“Mensaje:”);

asm{

mov bx,0

add ax,bx

mov dato,ax

printf (“Resultado:”);

5
Lab. 5 SDG115

Desarrollo de la práctica:
1. Estudiar la sintaxis necesaria para insertar código en ensamblador en código C. Copiar el
código del apéndice 1 en un block de notas y guardar el archivo con la extensión “.cpp”,
en la dirección “C:\BORLANDC\BIN”.Código:

1. #include <stdio.h>
2. /* Este ejemplo muestra cómo combinar el código en lenguaje
3. Ensamblador con código C
4. Realiza las operaciones básicas suma, resta, multiplicación y
5.  División con dos números de 8 bits
6. */
7. int main()
8. {
9.  int dato1, dato2, suma, resta, multiplicacion,division;
10.  printf("Multiplicación de dos números \n");
11.  printf("\nPrimer número: ");
12.  scanf("%d", zdato1);
13. printf("Segundo número: ");
14. scanf("%d", zdato2);
15. asm{
16.  push dx //Introduciendo los registros a la pila
17.  push cx
18.  push bx
19.  push ax 
20. //Suma
21.  mov ax,dato1
22. add ax,dato2
23. mov suma,ax
24. //Resta
25. mov ax,dato1
26. sub ax,dato2
27.  mov resta,ax
28. //Multiplicacion
29.  mov ax,dato1
30.  imul dato2
31. mov multiplicacion , ax
32.  //Division
33.  mov ax,dato1
34. div dato2
35. mov ah,0
36. mov division,ax
37.  
38. pop ax
39. pop bx
40.  pop cx
41.  pop dx //Devolviendo los registros de la pila
42. }
43. printf("\nSuma: %d\n", suma);
44. printf("Diferencia: %d\n",resta);
45. printf("Producto: %d\n", multiplicacion);
46.  printf("Cociente: %d\n", division);
47. return 0;

6
Lab. 5 SDG115

48. }

7
Lab. 5 SDG115

8
Lab. 5 SDG115

Al compilarlo y correrlo:

Haciendo lo mismo con el apéndice B que se muestra acontinuacion:


Código:

1. #include <stdio.h>
2. main()
3. {
4. //El siguiente programa representa un ejemplo de una
5. //transmision de bytes de datos utilizando sus bits de paridad
6. //aunque los datos solo se miran en pantalla, en la
7. //practica se utiliza un puerto y la paridad para detectar
8. //errores en la recepcion.
9. int byte1,byte2, paridad;
10. printf("introdusca el primer byte en hexadecimal \n");
11. scanf("%x", zbyte1);
12. printf("introdusca el segundo byte en hexadecimal \n");
13. scanf("%x", zbyte2);
14. asm{
15. push ax
16.  //Guardamos los registros que usaremos
17. push bx //Por razones de seguridad
18. mov paridad,0
19. mov ax,0
20. mov bx,byte1
21. and bx,0ffh //Operacion logica que activa la bandera de paridad
22. pushf //Guardamos el registro de banderas en la pila
23. pop ax //Y lo recuperamos sin alterarlo
24. and ax,04h //Probamos la bandera de paridad
25. cmp ax,04h
26. jne seguir
27. inc paridad //Incrementamos el resultado si hay bit de paridad
28. }
29. seguir:
30. asm{
31. mov bx,byte2 //Repetimos lo mismo que hicimos
32. and bx,0ffh //con el primer byte
33. pushf
34. pop ax
35. and ax,04h
36. cmp ax,04h
37. jne final:
38. add paridad, 2h

9
Lab. 5 SDG115

39. }
40. final:
41. asm{
42. pop bx //Recuperacion de los registros antes
43. pop ax //De terminar las lineas de ensamblador
44. }
45. printf("\n byte con la paridad junto a los dos bytes originales:\n");
46. printf("%X%X%X\n",paridad,byte2,byte1);
47. return 0;
48. }

Abriendo:

Compilando:

10
Lab. 5 SDG115

Corriendo:

11
Lab. 5 SDG115

Asignaciones:

1. Mencionar 5 ventajas de combinar el lenguaje ensamblador con el compilador C.

a. Una de las grandes ventajas de la combinación es la portabilidad, ensamblador


dentro de sus grandes defectos esta que depende de la estructura interna del
microprocesador es decir solo se puede correr en los que tengan la misma
arquitectura, pero esto se arregla con la inclusión de C ya que generalmente un
programa escrito para un tipo de microcontrolador puede correr con mínimas
modificaciones en otro microcontrolador de diferente arquitectura.

b. Precisión en la operación del microprocesador, como sabemos la gran ventaja


que tiene ensamblador sobre los lenguajes de alto nivel es que controla y permite
al programador precisión en las operaciones; permitiendo escribir código más
flexible, optimizado y por ende veloz, cosa de la cual los lenguajes de alto nivel no
pueden presumir dado que los códigos ocupan más memoria para una misma
aplicación que la que usa ensamblador(en la actualidad existen algoritmos de
optimización que logran reducir tremendamente esta diferencia).

c. Los códigos son más fáciles de entender, modificar y ampliar , como hemos
experimentado es difícil tratar de leer código en ensamblador y mediamente fácil
en C, por lo que la estructura del código en embebido mantiene la facilidad de
lectura e interpretación de C, dado que los segmentos de código en ensamblador
son cortos y definidos mediante bloques de instrucciones.

d. Mayor control de datos con menos trabajo, es decir ensamblador por sí mismo no
posee ninguna herramienta que permita controlar el tipo de datos, manualmente se
debe cuidar que la estructura del programa sea la adecuada desde las definiciones
hasta el final del código, mientras que C proporciona estructura, abstracción y
control de tipos de datos, es de tener en cuenta que esas herramientas de C no son
tan trabajadas como los otros lenguajes de alto nivel como Python.

e. Optimización y diseños de interfaces más cómodas para el usuario; el usuario


tiene interfaces más limpias, fluidas, ordenadas y estilizadas gracias al lenguaje C,
y optimización al nivel de control del dispositivo que lo otorga ensamblador por
su menor consumo de memoria y menor número de instrucciones que se traduce
en menor procesamiento.

12
Lab. 5 SDG115

2. Mencione 5 aplicaciones posibles de programas que utilicen lenguaje ensamblador


con el compilador C.
Nota: Es de aclarar que estas tecnologías han cambiado significativamente desde el auge de
ensamblador hibrido con C. Así que es posible que utilicen modos y formas más agiles y livianos
que los que produce el lenguaje que estamos estudiando.

a. controlar un proceso de montaje o producción. una o varias máquinas que se


encargue de una tarea específica dentro el circuito manufactura donde se
involucren numerosos circuitos electrónicos y eléctricos para el control de
motores, hornos, etc. que deben ser gobernados por un procesador, el cual ofrece
un interfaz persona a máquina para ser dirigido por un operario e informarle al
mismo de la marcha del proceso.

b. Puntos de servicio o Venta: las cajas donde se paga la compra en un


supermercado son cada vez más completas, integrando teclados numéricos,
lectores de códigos de barras mediante laser, lectores de tarjetas bancarias de
banda magnética o chip, pantalla alfanumérica de cristal líquido, etc. El sistema
embebido en este caso requiere numerosos conectores de entrada y salida y unas
características robustas para la operación continuada.

c. Puntos de información al ciudadano. En oficinas de turismo, grandes almacenes,


bibliotecas, etc. existen equipos con una pantalla táctil donde se puede pulsar
sobre la misma y elegir la consulta a realizar, obteniendo una respuesta
personalizada en un entorno grafico amigable.

d. Set-top boxes para la recepción de televisión . cada vez existe un mayor número de
operadores de televisión que aprovechando las tecnologías vía satélite y de red de
cable ofrecen un servicio de televisión de pago diferenciado del convencional. En
primer lugar, envían la señal en formato digital con lo que es necesario un
procesado para decodificarla y mandarla al televisor. Además, viaja cifrada para
evitar que la reciban en claro usuarios sin contrato, lo que requiere descifrarla
en casa del abonado. También ofrecen un servicio de televisión interactiva que
necesita de un software específico para mostrar páginas web y con ello un
sistema basado en procesador con salida de señal de televisión.

e. Todos los Sistemas embebidos en general: Sistema Embebido es un sistema


electrónico diseñado para realizar pocas funciones en tiempo real, según sea el
caso. Al contrario de lo que ocurre con las computadoras, las cuales tienen un

13
Lab. 5 SDG115

propósito general, ya que están diseñadas para cubrir un amplio rango de


necesidades y los Sistemas Embebidos se diseñan para cubrir necesidades
específicas.

3. Hacer un programa con 5 posiciones en memoria c/u de las cuales contienen un dato
diferente, el usuario introduce un dato que es comparado con las posiciones de
memoria, si el dato coincide, despliegue un mensaje a USTED ES Ganadora de lo
contrario despliegue el mensaje a SUERTE LA PROXIMA VEZ a. Recuerde: Hacer
el programa lo más vistoso y práctico para el usuario con las herramientas conocidas
de C o C++, es decir la captura de datos y despliegue de mensajes, las demás
instrucciones deben realizarse con ensamblador.

4. Hacer un programa que espere una clave desde consola por ejemplo programables;
el programa debe comprobar la clave tecleada con la que se encuentra en una
variable, y si coinciden encender un led verde, si son diferentes encender un led rojo.
Puede utilizar el puerto paralelo. Hágalo con instrucciones de C para escribir en el
puerto, y también hágalo accesando el puerto con lenguaje ensamblador. Comente
diferencias.
Codigo escribiendo en puerto paralelo con c:

1.         #include <stdio.h>
2.         #include <dos.h>
3.          
4.         int main (){
5.                 char passin[9];
6.                 int est;
7.                 char pass[9]="password";
8.                 printf("Contra: \n");
9.                 scanf("%s", &passin);
10.                 asm{
11.                 cld
12.                 push dx
13.                 push cx
14.                 push bx
15.                 push ax
16.                 mov est,0
17.                 mov cx,10d
18.                 mov si, offset passin
19.                 mov di, offset pass
20.                 repe cmpsb
21.                 jnz salir
22.                 mov est, 1d
23.                 };

14
Lab. 5 SDG115

24.                 salir:
25.                 asm{
26.                 pop ax
27.                 pop bx
28.                 pop cx
29.                 pop dx
30.                 }
31.                 if(est==0){
32.                 outportb(0x378,1);// enciende led verde
33.                 printf("\nCORRECTO");
34.                 }
35.                 else {
36.                 outportb(0x378,2);//enciende led rojo
37.                 printf("\nINCORRECTO");
38.                 }
39.                 return 0;
40.         }

Codigo escribiendo en puerto paralelo con ensamblador:

1.      
  #include <stdio.h>
2.      
   
3.      
  int main (){
4.      
          char passin[9];
5.      
          int est;
6.      
          char pass[9]="password";
7.      
          printf("Contra: \n");
8.      
          scanf("%s", &passin);
9.      
          asm{
10.                 cld
11.                 push dx
12.                 push cx
13.                 push bx
14.                 push ax
15.                 mov est,0
16.                 mov cx,10d
17.                 mov si, offset passin
18.                 mov di, offset pass
19.                 repe cmpsb
20.                 jnz salir
21.                 mov est, 1d
22.                 };
23.                 salir:
24.                 asm{
25.                 pop ax
26.                 pop bx
27.                 pop cx
28.                 pop dx
29.                 }
30.                 if(est==0){
31.                 // enciende led verde
32.                 printf("\nCORRECTO");
33. asm{

15
Lab. 5 SDG115

34. mov al,01


35. mov dx, 0378
36. out dx,al
37. }
38.                 }
39.                 else {
40.                 //enciende led rojo
41.                 printf("\nINCORRECTO");
42.                 asm{
43. mov al,02
44. mov dx, 0378
45. out dx,al
46. }
47.
48. }
49.                 return 0;
50.         }

5. Investigar cómo se puede trabajar con lenguaje ensamblador en el sistema operativo


Linux, es decir con que programa se puede aensamblara y alinkeara un código de
este lenguaje, y cómo usar en este sistema el lenguaje c con lenguaje ensamblador.
Ilustrar un ejemplo sencillo de cada caso.
Para desarrollar programas ensamblador en Linux, deberemos elegir el compilador de
ensamblador que queremos utilizar. La eleccién logica es usar GAS (as), el estandar que lleva

16
Lab. 5 SDG115

toda distribucion Linux. GAS tiene la desventaja de utilizar la sintaxis AT&T, que difiere
bastante de la sintaxisIntel (la que conocemos del ensamblador bajo MSDOS). Una alternativa es
utilizar NASM, que ofrece la misma funcionalidad que GAS, pero utiliza la sintaxis de Intel. Sin
embargo, puesto que gcc utiliza as coma ensamblador, para realizar la préctica de optimizacién
de cédigo con ensamblador en línea debemos dominar la sintaxis AT&T.

17
Lab. 5 SDG115

Conclusiones:

 Existe una relación muy estrecha entre la programación en C y la programación en

ensamblador, la combinación de ambos permite obtener las virtudes de cada uno y

minimizar los defectos que ambos de manera individual poseen; como sabemos las

ventajas de programar en C lo mismo que antes se programaba en ensamblador son obvias

portabilidad y legibilidad a través de un código bien estructurado. Sin embargo, las partes

del sistema en las que es necesario trabajar con características específicas del hardware no

pueden ser escritas en C por lo que la unión de ambos nos proporciona la mejor opción.

 Las ventajas de usar ensamblador combinado con C destaca las virtudes de ambos tipos

de programación y minimiza los defectos que estos tienen tanto para el usuario como para

las y los programadores, por ejemplo cuando se requieren módulos de programación con

rutinas que precisan alta velocidad como lectura y escritura de puertos, es decir,

manipulación directa de periféricos; resultan mucho más rápidas las rutinas realizadas en

lenguaje ensamblador que las escritas en lenguajes de alto nivel, mientras que el lenguaje

C corre en Windows se puede ejecutar una aplicación de control con la pc mientras se

ejecutan otras aplicaciones, además de brindar opciones para desarrollar entornos de

trabajo limpios y fluidos.

 Las aplicaciones mas elementales del ensamblador embedido o hibrido con C son los

Sistema Embebido el cual es un sistema electrónico diseñado para realizar pocas

funciones en tiempo real, según sea el caso. Al contrario de lo que ocurre con las

computadoras, las cuales tienen un propósito general, ya que están diseñadas para cubrir

un amplio rango de necesidades y los Sistemas Embebidos se diseñan para cubrir

necesidades específicas, como por ejemplo un tostador, una lavadora y demás aparatos.

18
Lab. 5 SDG115

19

También podría gustarte