Funcionamiento de los
Computadores
Ignacio Alvarez García
Octubre - 2004
Indice

Introducción al funcionamiento del computador

Ejecución de instrucciones de máquina

Lenguajes de alto y bajo nivel

Las zonas de memoria de un programa

Entrada/Salida
El computador

Máquina de ejecución secuencial de instrucciones
 Programa=secuencia de instrucciones

Instrucciones y datos almacenados en memoria
 Memoria organizada en direcciones

Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Instrucciones, datos y operaciones en binario
Contenido
01101100
00101110
11111100
...
11101100
MOV X,3
01101101
MOV Z,X
Inst3:
11101011
ADD Z,Y
...
X:
Y:
Z:
00000000
0
00000111
7
00000010
2
...
Instrucciones codificadas
en binario
Datos codificados en
binario
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
Partes del computador
Unidad de Control (CU):
organiza el funcionamiento del
computador




Unidad Aritmético Lógica
(ALU): ejecuta operaciones
aritméticas (+,-,*,/) y lógicas a
nivel de bit (AND, OR, …)
Registros: lugares de
almacenamiento temporal de
información
Memoria: lugar principal de
almacenamiento de
información (código y datos)
CPU
CU
registros

ALU
Memoria
Dispositivos de E/S:
permiten la comunicación con
el exterior
E/S
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Instrucción:
Inst1
CPU
Operando1:
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000000
00000111
00000010
0
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst1
Instrucción:
11101100
CPU
Operando1:
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Contenido
01101100
00101110
11111100
...
11101100
11101011
MOV X,3
MOV Z,X
Inst3:
01101101
...
ADD Z,Y
X:
Y:
Z:
00000000
00000111
00000010
0
7
2
Inst1:
Inst2:
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst1
Instrucción:
MOV X,3
11101100
CPU
Operando1:
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000000
00000111
00000010
0
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst1
Instrucción:
MOV X,3
11101100
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000000
00000111
00000010
0
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst1
Instrucción:
MOV X,3
11101100
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000000
00000111
00000010
0
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst1
Instrucción:
MOV X,3
11101100
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000000
00000111
00000010
3
0
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst1
Inst2
Instrucción:
MOV X,3
11101100
Operando1:
00000011
+1
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000010
3
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst2
Instrucción:
11101011
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Contenido
01101100
00101110
11111100
...
11101100
11101011
MOV X,3
MOV Z,X
Inst3:
01101101
...
ADD Z,Y
X:
Y:
Z:
00000011
00000111
00000010
3
7
2
Inst1:
Inst2:
00000011
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst2
Instrucción:
MOV Z,X
11101011
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000010
3
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst2
Instrucción:
MOV Z,X
11101100
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000010
3
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst2
Instrucción:
MOV Z,X
11101100
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000010
3
7
2
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst2
Instrucción:
MOV Z,X
11101100
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000010
00000011
3
7
2
3
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst2
Inst3
Instrucción:
MOV Z,X
11101100
Operando1:
00000011
+1
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000011
3
7
3
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst3
Instrucción:
01101101
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Contenido
01101100
00101110
11111100
...
11101100
11101011
MOV X,3
MOV Z,X
Inst3:
01101101
...
ADD Z,Y
X:
Y:
Z:
00000011
00000111
00000011
3
7
3
Inst1:
Inst2:
00000011
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst3
Instrucción:
ADD Z,Y
01101101
Operando1:
00000011
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000011
3
7
3
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst3
Instrucción:
ADD Z,Y
11101100
Operando1:
00000011
00000111
CPU
Operando2:
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000011
3
7
3
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst3
Instrucción:
ADD Z,Y
11101100
Operando1:
00000111
Operando2:
00000011
CPU
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000011
3
7
3
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst3
Instrucción:
ADD Z,Y
11101100
Operando1:
00000111
Operando2:
00000011
CPU
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00000011
00001010
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000011
3
7
3
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst3
Instrucción:
ADD Z,Y
11101100
Operando1:
00000111
Operando2:
00000011
CPU
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00001010
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00000011
00001010
3
7
10
3
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Ejecución de instrucciones

Ejemplo: x=3; z=x+y;
Cont. Prog.:
Inst3
Inst4
Instrucción:
ADD X,Y
11101100
Operando1:
00000111
Operando2:
00000011
+1
CPU
ALU
Resultado:
Dirección
000..00
000..01
000..10
Inst1:
Inst2:
Inst3:
X:
Y:
Z:
00001010
Contenido
01101100
00101110
11111100
...
11101100
11101011
01101101
...
MOV X,3
MOV Z,X
00000011
00000111
00001010
3
7
10
...
Lee instrucción
de memoria
Pasa a siguiente
instrucción
Decodifica
instrucción
Almacena
resultado
Obtiene
operandos
Calcula
resultado
ADD Z,Y
Lenguajes de alto y bajo nivel

El computador ejecuta lenguaje máquina:





Secuencias de 0s y 1s interpretadas como instrucciones
Instrucciones muy sencillas (copiar, sumar, ...)
Difícil de escribir, leer y depurar por el hombre
Fácil de almacenar e interpretar por el computador
El programador escribe lenguaje de alto nivel:
 Lenguaje textual con instrucciones no ejecutables
directamente por el computador
 Instrucciones más complejas
 Fácil de escribir, leer y depurar por el hombre
 Necesita un programa compilador o intérprete para convertir
a secuencia de instrucciones de máquina
Lenguajes de alto y bajo nivel

Ejemplo:
Programa de máquina
Programa de alto nivel
#include <stdio.h>
#include <stdlib.h>
main()
{
int i;
float x;
i=7;
x=1;
while (i>=1)
{
x=x*i;
i=i-1;
}
11000111
01000101
11111100
00001111
00000000
00000000
00000000
printf(“El factorial es %f”,x);
}
$L906:
$L907:
mov
mov
cmp
jl
fild
fmul
fstp
mov
sub
mov
jmp
fld
sub
fstp
push
call
add
DWORD PTR _i$[ebp], 7
DWORD PTR _x$[ebp], 1F
DWORD PTR _i$[ebp], 1
SHORT $L907
DWORD PTR _i$[ebp]
DWORD PTR _x$[ebp]
DWORD PTR _x$[ebp]
eax, DWORD PTR _i$[ebp]
eax, 1
DWORD PTR _i$[ebp], eax
SHORT $L906
DWORD PTR _x$[ebp]
esp, 8
QWORD PTR [esp]
OFFSET FACTORIAL
_printf
esp, 12
Alto nivel

Ventajas
 Programación más cerca
del lenguaje humano y
matemático
 Lenguajes estructurados
y tipados
 Facilidad de escritura,
lectura y depuración
 La complejidad se deja al
compilador
 Código portable de una
máquina a otra

Inconvenientes
 Dificultad de acceso a
todos los recursos de la
máquina
 El código máquina
resultante suele ser más
grande y lento
Alto nivel → código máquina

Pasos en la obtención
de código máquina:
Editor
 Escribir código fuente
(programa editor)
 Compilar código fuente Compilador
(programa compilador)
 Enlazar código objeto y
librerías (programa
Enlazador
enlazador)
.C
main()
{
int i;
...
printf(“x=%d..
}
.OBJ
_main:
00011100
00010100
…
exports _main
extern _printf
00011100
00010100
11011100
11010100
...
.EXE
.LIB
_printf:
11011100
11010100
…
extern _main
exports _printf
…
Ejecución del programa

Ejecución de un
programa:
 Cargar en memoria el
archivo ejecutable
(programa cargador)
 Poner en el PC la
dirección de la 1ª
instrucción del programa
 O bien cargar en
memoria y ejecutar paso
a paso con un programa
depurador
00011100
00010100
11011100
11010100
.EXE
...
Cargador
00011100
00010100
11011100
11010100
. . .
. . .
. . .
El programa en memoria

Partes del programa:
 Código
Código
Conjunto de funciones
 Datos
Variables globales (datos)
Variables locales: Pila (stack)
Variables de
almacenamiento dinámico:
Montón (heap)
Datos
Pila
Montón
La zona de memoria de código

El código está dividido en funciones
 Función: conjunto de instrucciones que
cumplen un objetivo común, separable del
resto y, en lo posible, reutilizable.
 Elementos de la función:
Parámetros
Variables locales
Sentencias de ejecución
Valor devuelto
tipodvto Funcion(tipo1 par1,tipo2 par2, …)
{
tipoL1 vloc1,vloc2,vloc3;
tipoL2 vloc4,vloc5;
...
Sentencias;
}
return valor;
Código
Datos
Pila
Montón
La zona de memoria de código

El código está dividido en funciones
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(8,3);
printf(“Comb=%d\n”,c);
}
Factorial
CombNM
Código
main
printf
Datos
Pila
Montón
La zona de memoria de datos

Los datos son las variables utilizadas:
 Variable: zona reservada en direcciones de
memoria consecutivas, cuyo contenido
puede ser modificado y reutilizado por el
programa.
 Tipos de variables:
Variables globales
Variables locales
Parámetros de función
Variables de almacenamiento dinámico
tipoG1 vglob1,vglob2;
tipodvto Funcion(tipo1 par1,tipo2 par2, …)
{
tipoL1 vloc1,vloc2,vloc3;
tipoL2 vloc4,vloc5;
...
}
Código
Datos
Pila
Montón
La zona de memoria de datos

Los datos son las variables utilizadas:
 Variables globales:
Se alojan en el segmento de datos
Su espacio se reserva al cargar el programa
y se mantiene en toda su duración
Todas las funciones tienen acceso a estas
variables
Código
Datos
Pila
Montón
La zona de memoria de datos

Los datos son las variables utilizadas:
 Variables locales y parámetros de función:
Se alojan en el segmento de pila.
Su espacio se reserva al empezar a
ejecutar la función en que están declaradas,
y se libera al terminar su ejecución.
Sólo la función que las declara puede
utilizarlas.
Las variables locales y parámetros se van
apilando en memoria al llamar a otras
funciones, y desapilando al salir.
Los parámetros son variables locales cuyo
valor inicial se da en la llamada a la función.
Código
Datos
Pila
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
Datos
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
printf(“Comb=%d\n”,c);
}
Pila
SP
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
Datos
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
printf(“Comb=%d\n”,c);
}
SP
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
Datos
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
SP
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
Datos
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
SP
?
r
?
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
DIR RET 2: r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
Datos
SP
DIR RET 2
8
x
?
r
?
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
DIR RET 2: r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
Datos
SP
1
result
?
i
DIR RET 2
8
x
?
r
?
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
DIR RET 2: r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
Datos
SP
40320
9
result
i
DIR RET 2
8
x
?
r
?
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
Datos
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
DIR RET 2: r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
40320
9
DIR RET 2
8
SP
?
40320
r
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
DIR RET 3: return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
Datos
40320
9
SP
DIR RET 3
3
x
?
r
40320
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
DIR RET 3: return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
Datos
SP
1
result
9
i
DIR RET 3
3
x
?
r
?
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
DIR RET 3: return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
Datos
SP
6
result
4
i
DIR RET 3
3
x
?
r
?
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
Datos
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
DIR RET 3: return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
6
4
DIR RET 3
3
SP
6720
40320
r
num
DIR RET 1
8
n
5
m
?
c
3
y
8
x
Montón
La zona de memoria de datos

Código
El funcionamiento de la pila
Datos
int Factorial(int x)
{
int i,result=1;
for (i=1;i<=x;i++)
result=result*i;
return result;
}
6
4
DIR RET 3
3
6720
int CombNM(int n,int m)
{
int num,r;
num=Factorial(n);
r=num/Factorial(n-m);
return r;
}
void main()
{
int x=8,y=3,c;
c=CombNM(x,y+2);
DIR RET 1: printf(“Comb=%d\n”,c);
}
40320
DIR RET 1
8
5
SP
6720
c
3
y
8
x
Montón
Los dispositivos de Entrada/Salida
Dispositivos de E/S:
permiten la comunicación del computador
con el exterior
 Entrada: teclado, ratón,
conversor A/D, entrada
digital, temporizador, …
 Salida: pantalla, impresora, conversor D/A,
salida digital, …
 E y S: disco duro, comunicación serie, paralelo,
red, …
registros

CPU
CU
ALU
Memoria
E/S
Programación de E/S: puertos
Puertos de E/S:
 Lugares de almacenamiento de información que, cuando
son leídos o escritos, provocan acciones en los dispositivos
de E/S
 Organizados en direcciones
CPU
Memo
E/S
...

4000 1 1 1 0 0 1 1 1
5000 0 1 1 0 1 0 1 0
...
Interfaz
dispositivo
1
Dispositivo
Interfaz
dispositivo
2
Dispositivo
1
2
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

Interfaz
impresora
1 1100111
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

0 1100001
Interfaz
impresora
ESCRITO
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

0 1100001
Interfaz
impresora
ESCRITO
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

0 1100001
Interfaz
impresora
ESCRITO
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

0 1100001
Interfaz
impresora
ESCRITO
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

0 1100001
Interfaz
impresora
ESCRITO
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

0 1100001
Interfaz
impresora
ESCRITO
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

0 1100001
Interfaz
impresora
ESCRITO
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Salida: impresora
 El programador
escribe en un puerto
del dispositivo
 La electrónica del
interfaz genera las 3000
acciones
correspondientes en
el dispositivo
OUT
3000,’a’
E/S
...

Interfaz
impresora
0 1100001
Impresora
M
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Entrada: teclado
 La electrónica del
interfaz reacciona
ante cambios en el
dispositivo,
modificando el/los
2000
puertos
2001
 El programador lee
del/los puertos del
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

Interfaz
teclado
0 0000000
1 0010111
Teclado
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Entrada: teclado
 La electrónica del
interfaz reacciona
ante cambios en el
dispositivo,
modificando el/los
2000
puertos
2001
 El programador lee
del/los puertos del
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

Interfaz
teclado
0 0000000
1 0010111
Teclado
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Entrada: teclado
 La electrónica del
interfaz reacciona
ante cambios en el
dispositivo,
modificando el/los
2000
puertos
2001
 El programador lee
del/los puertos del
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

Interfaz
teclado
0 0000000
1 0010111
Teclado
Funcionamiento de dispositivos
Funcionamiento de
un dispositivo de
Entrada: teclado
 La electrónica del
interfaz reacciona
ante cambios en el
dispositivo,
modificando el/los
2000
puertos
2001
 El programador lee
del/los puertos del
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

Interfaz
teclado
0 0000000
1 0010111
Teclado
Funcionamiento de dispositivos
Funcionamiento de un
dispositivo de Entrada:
teclado
 La electrónica del
interfaz reacciona ante
cambios en el
dispositivo, modificando
el/los puertos
 El programador lee
2000
del/los puertos del
2001
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

Interfaz
teclado
0 0000000
1 0010111
Teclado
Funcionamiento de dispositivos
Funcionamiento de un
dispositivo de Entrada:
teclado
 La electrónica del
interfaz reacciona ante
cambios en el
dispositivo, modificando
el/los puertos
 El programador lee
2000
del/los puertos del
2001
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

0 0000001
Interfaz
teclado
RECIBIDO
0 1100001
Teclado
Funcionamiento de dispositivos
Funcionamiento de un
dispositivo de Entrada:
teclado
 La electrónica del
interfaz reacciona ante
cambios en el
dispositivo, modificando
el/los puertos
 El programador lee
2000
del/los puertos del
2001
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

0 0000001
Interfaz
teclado
RECIBIDO
0 1100001
Teclado
Funcionamiento de dispositivos
Funcionamiento de un
dispositivo de Entrada:
teclado
 La electrónica del
interfaz reacciona ante
cambios en el
dispositivo, modificando
el/los puertos
 El programador lee
2000
del/los puertos del
2001
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

0 0000001
Interfaz
teclado
RECIBIDO
0 1100001
Teclado
Funcionamiento de dispositivos
Funcionamiento de un
dispositivo de Entrada:
teclado
 La electrónica del
interfaz reacciona ante
cambios en el
dispositivo, modificando
el/los puertos
 El programador lee
2000
del/los puertos del
2001
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

0 0000001
Interfaz
teclado
RECIBIDO
0 1100001
Teclado
Funcionamiento de dispositivos
Funcionamiento de un
dispositivo de Entrada:
teclado
 La electrónica del
interfaz reacciona ante
cambios en el
dispositivo, modificando
el/los puertos
 El programador lee
2000
del/los puertos del
2001
dispositivo
ESPERA:
TEST 2000,000000001b
JZ
ESPERA
IN
R0,2001
E/S
...

Interfaz
teclado
0 0000000
0 1100001
Teclado
Sincronización de E/S
Muestreo o polling:
 El programa comprueba el
estado del dispositivo
leyendo los puertos
 Ocupa mucho tiempo de
CPU

Interrupciones:
 La CPU está ejecutando
otro programa
 Cuando el dispositivo avisa
2000
de algún evento, se
2001
abandona temporalmente la
ejecución del programa y se
pasa a ejecutar una ISR. Se
retoma el programa al
terminar la ISR.
INST1
INST2
INST3
...
ISR:
IN R0,2001
IRET
E/S
...

Interfaz
teclado
0 0000000
1 0010111
Teclado
Sincronización de E/S
Muestreo o polling:
 El programa comprueba el
estado del dispositivo
leyendo los puertos
 Ocupa mucho tiempo de
CPU

Interrupciones:
 La CPU está ejecutando
otro programa
 Cuando el dispositivo avisa
2000
de algún evento, se
2001
abandona temporalmente la
ejecución del programa y se
pasa a ejecutar una ISR. Se
retoma el programa al
terminar la ISR.
INST1
INST2
INST3
...
ISR:
IN R0,2001
IRET
E/S
...

Interfaz
teclado
0 0000000
1 0010111
Teclado
Sincronización de E/S
Muestreo o polling:
 El programa comprueba el
estado del dispositivo
leyendo los puertos
 Ocupa mucho tiempo de
CPU

Interrupciones:
 La CPU está ejecutando
otro programa
 Cuando el dispositivo avisa
2000
de algún evento, se
2001
abandona temporalmente la
ejecución del programa y se
pasa a ejecutar una ISR. Se
retoma el programa al
terminar la ISR.
INST1
INST2
INST3
...
ISR:
IN R0,2001
IRET
E/S
...

0 0000001
Interfaz
teclado
RECIBIDO
0 1100001
Teclado
Sincronización de E/S
Muestreo o polling:
 El programa comprueba el
estado del dispositivo
leyendo los puertos
 Ocupa mucho tiempo de
CPU

Interrupciones:
 La CPU está ejecutando
otro programa
 Cuando el dispositivo avisa
2000
de algún evento, se
2001
abandona temporalmente la
ejecución del programa y se
pasa a ejecutar una ISR. Se
retoma el programa al
terminar la ISR.
INST1
INST2
INST3
...
ISR:
IN R0,2001
IRET
E/S
...

0 0000001
Interfaz
teclado
RECIBIDO
0 1100001
Teclado
Sincronización de E/S
Muestreo o polling:
 El programa comprueba el
estado del dispositivo
leyendo los puertos
 Ocupa mucho tiempo de
CPU

Interrupciones:
 La CPU está ejecutando
otro programa
 Cuando el dispositivo avisa
2000
de algún evento, se
2001
abandona temporalmente la
ejecución del programa y se
pasa a ejecutar una ISR. Se
retoma el programa al
terminar la ISR.
INST1
INST2
INST3
...
ISR:
IN R0,2001
IRET
E/S
...

Interfaz
teclado
0 0000000
0 1100001
Teclado
Sincronización de E/S
Muestreo o polling:
 El programa comprueba el
estado del dispositivo
leyendo los puertos
 Ocupa mucho tiempo de
CPU

Interrupciones:
 La CPU está ejecutando
otro programa
 Cuando el dispositivo avisa
2000
de algún evento, se
2001
abandona temporalmente la
ejecución del programa y se
pasa a ejecutar una ISR. Se
retoma el programa al
terminar la ISR.
INST1
INST2
INST3
...
ISR:
IN R0,2001
IRET
E/S
...

Interfaz
teclado
0 0000000
0 1100001
Teclado