Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ejemplo 1
1: void main()
2: {
3: // Aquí escribimos nuestro programa!!
4: }
Ejemplo 2
1: int main()
2: {
3: // Aquí también podemos escribir nuestro programa!!
4: return 0;
5: }
El ejemplo 1 declara y define la función main vacía (no hace nada). En el segundo ejemplo,
main incluye solo una línea (4) return 0; que indica terminar la función devolviendo el valor
0.
Sintaxis
Tipos básicos
Ejemplos:
1: char c;
2: int x;
En el ejemplo se declaran dos variables, la variable c de tipo char (puede almacenar 1 byte) y
la variable x, de tipo entero o int (puede almacenar un entero de 16 bits en el rango de -215
hasta 215-1).
El tipo float depende de la arquitectura del sistema. En un 8086/88 en modo mínimo no
existe coprocesador matemático, luego, se debe evitar utilizar el tipo float. No obstante, las
operaciones con flotantes siempre se pueden definir por software (no sin esfuerzo), lo que
penalizara al sistema en términos de rendimiento.
Calificadores
unsigned : Positivo
signed : Con signo (por defecto, se usa poco)
short : El menor tamaño (posible) asignado al tipo de dato
long : El mayor tamaño (posible) asignado al tipo de dato
const : Nunca cambia
volatile : Nunca se sabe cuándo va a cambiar
Declara la variable ux de tipo sin signo (positivo), por lo que el rango de valores cambia a 0
hasta 216-1.
En los calificadores long y short sus significados dependen del compilador y son aplicables a
enteros y flotantes (sólo long para este último caso). En el caso del compilador Digital Mars
(DMC) para 8086/88, el calificador short se ignora, mientras que long es aplicable a int y
extiende a 32 bits o doble palabra. Ejemplos
1: unsigned long d;
2: long int c;
En el primer caso se han combinado dos calificadores (unsigned y long), obsérvese además
que se ha omitido la palabra int que se asume por defecto. El rango de la variable d
corresponde a los enteros entre 0 y 2 32-1. El segundo ejemplo declara la variable c, también de
32 bits en el rango de -231 hasta 231-1.
Tipos de almacenamiento
Operadores
Aritméticos
+ Suma y positivo
- Resta y negativo
* Multiplicación
/ División
% Modulo (Resto de la división entera)
En DMC para 8086/88 de los operadores aritméticos, sólo suma y positivo junto con resta y
negativo se definen para todos los tipos enteros de 8 (char), 16 y 32 bits. La multiplicación,
división y módulo son aplicables en las siguientes condiciones.
Multiplicación
Ambos operandos pueden ser 16 bits, pero deben ser tales que su multiplicación no cause
desbordamiento para 16 bits.
División
Módulo
Relacionales
== Igualdad
!= Desigualdad
< Menor que
> Mayor que
<= Menor igual
>= Mayor igual
|| Disyunción (OR)
&& Conjunción (AND)
Operador ternario
?:
Estructuras codicionales
1: if(expresion_1)
2: {
3:
4: }
5: else if (expresion_2)
6: {
7:
8: }
9: else
10: {
11:
12: }
1: if(Nota < 3)
2: DESAPROBADO = 1;
3: else
4: DESAPROBADO = 0;
1: switch(expresión)
2:{
3: case 0:
4: // Sentencias para el caso 0
5: ......
6: break;
7:
8: case 1:
9: // Sentencias para el caso 1
10: ......
11: break;
12:
13: default:
14: // Sentencias para el caso por defecto
15: ......
16: break;
17: }
En el for todas las partes son opcionales, no obstante se deben mantener los (;). Un for(;;)
indica un ciclo infinito o en otras palabras la condición es evaluada siempre como verdadera.
1: do
2: {
3: // Sentencias a repetir
4: }
5: while(cond)
do..while ejecuta primero el contenido del bucle (código entre llaves) y a continuación evalúa
cond, esto garantiza que el contenido del bucle se ejecute al menos una vez
independientemente a si la condición es falsa desde el inicio.
1: while(cond)
2: {
3: // Sentencias a repetir
4: }
Arreglos y punteros
Un arreglo es una variable que almacena la dirección de una zona de memoria de un tamaño
específico, con la particularidad que dicha zona corresponde a un mismo tipo de dato. Los
arreglos comienzan en 0 y terminan en N-1 donde N es su tamaño.
Un puntero es una variable que almacena la dirección de otra. Un puntero tiene 3 momentos
fundamentales, (1) declaración, (2) inicialización y (3) uso. Los punteros se declaran
empleando el operador de referencia (*)
1: char *p; // Declara un puntero p de tipo char (puede apuntar a variables de este
tipo)
2: int *v; // Declara un puntero v de tipo int
Las dos primeras etapas se pueden realizar en una misma línea empleando el operador
dirección de (address of, &)
Es así que un puntero es una forma de acceder indirectamente a una variable, se puede
incluso modificar su valor. Por ejemplo, empleando la declaración e inicialización de arriba,
Siempre que se refiera a la dirección se emplea el nombre del puntero, cuando se refiera al
valor al cual apunta se emplea * y el nombre del puntero a continuación. Ejemplos
Funciones
Las funciones son la piedra angular de la programación estructurada. Una función es una
fragmento de código reutilizable que puede ejecutarse una o varias veces dentro de un
programa. Estructuralmente las funciones tienen un nombre, un tipo, una lista de argumentos y
un cuerpo. Ejemplo
El nombre puede ser cualquier identificador válido, el tipo corresponde al tipo de dato (char, int,
etc.) que devuelve la función. Si no devuelve nada se usa la palabra reservada void. La lista de
argumentos corresponde a los datos de entrada (y sus respectivos tipos) de la función. El
cuerpo es el conjunto de sentencias que ejecuta la función. El cuerpo siempre va entre llaves.
Ejemplos
1: /****************************************************************
2: Función vacía, no lleva argumentos, no devuelve valor
3: ****************************************************************/
4: void foo()
5: {
6: }
1: /****************************************************************
2: Función suma, devuelve la suma de sus argumentos a y b
3: ****************************************************************/
4: int suma(int a, int b)
5: {
6: return (a+b);
7: }
1: /****************************************************************
2: Función suma, devuelve la suma de sus argumentos a y b
3: ****************************************************************/
4: int suma(int a, int b)
5: {
6: return (a+b);
7: }
8:
9: void main()
10:{
11: int a, b, c;
12:
13: a = 5;
14: b = 10;
15:
16: // Llamada a la función suma
17: c = suma(a, b)
18: }
C y ensamblador.
1: asm
2: {
3: // Sentencias en ensamblador
4: };
La siguiente función realiza un acceso a puerto de bajo nivel. Obsérvese como se puede
acceder directamente a los valores de los argumentos de la función utilizando el nombre dentro
del bloque asm (líneas 8 y 9)
Si existen uno o varios periféricos complejos se puede hacer una biblioteca independiente para
cada uno. Asumiendo el periférico que hemos llamado deviceX
Un ejemplo concreto se puede encontrar en el sistema de control de LED vía UART aquí.