Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
Introducción:
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.
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.
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.
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 mv dato,ax
4
Lab. 5 SDG115
printf (“Resultado:”);
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:
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:
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.
12
Lab. 5 SDG115
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.
13
Lab. 5 SDG115
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. }
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
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:
minimizar los defectos que ambos de manera individual poseen; como sabemos las
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
Las aplicaciones mas elementales del ensamblador embedido o hibrido con C son los
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
necesidades específicas, como por ejemplo un tostador, una lavadora y demás aparatos.
18
Lab. 5 SDG115
19