Índice
Capítulo 1: Arquitectura y lenguaje ensamblador
Capítulo 2: Señales analógicas y binarias
Capítulo 3: Bits y sus patrones
Capitulo 4: Sistemas informáticos
Nota: Por ahora estos son los únicos que hay. Seguiré subiendo contenido poco a poco
Capítulo 1: La arquitectura y el lenguaje ensamblador
El lenguaje ensamblador se usa con el objetivo de escribir programas compuestos de operaciones básicas a realizar por el procesador. En esta guía se tratará sobre el lenguaje del procesador MIPS32.
Placa madre perteneciente a "un sistema portátil de videojuegos" con dos procesadores MIPS integrados
La arquitectura de una computadora es una descripción lógica de sus componentes y sus operaciones básicas. En lenguaje ensamblador puro, una instrucción de lenguaje ensamblador corresponde a una operación básica del procesador. Cuando un programador escribe en lenguaje ensamblador, el programador solicita las operaciones básicas del procesador. La arquitectura del procesador es visible en cada declaración del programa.
El lenguaje de ensamblaje puro es raro. La mayoría de los programas están escritos en un lenguaje de alto nivel. Incluso cuando se usa el lenguaje ensamblador, generalmente se ha mejorado. Se le agregan características para que sea más amigable con los programadores. Este lenguaje de ensamblaje extendido incluye declaraciones que corresponden a varias operaciones básicas de la máquina. El lenguaje de ensamblaje extendido MIPS hace esto, pero el chip del procesador aún es visible.
Los programas en lenguajes de alto nivel como C o Pascal son (en su mayoría) independientes del procesador en el que se ejecutan. Los programas en Java son totalmente independientes del procesador. Pero en lenguaje ensamblador el programa está escrito totalmente en términos del procesador.
Distintas arquitecturas
Niveles de computación
La arquitectura de un chip de procesador es una descripción de sus componentes básicos y de sus operaciones básicas.
Cada familia de procesadores tiene su propia arquitectura. El lenguaje ensamblador es una vista de programación de la arquitectura de un procesador en particular. Cada tipo de procesador tiene su propio lenguaje ensamblador.
Cuando estudias un lenguaje ensamblador, estudias la arquitectura de un procesador en particular. El estudio de cualquier lenguaje ensamblador aumenta su comprensión profesional de las computadoras. Estas notas son sobre el procesador MIPS, que es un buen procesador para estudiar. Los conceptos en el ensamblaje de MIPS son universales.
Estas notas discuten el lenguaje ensamblador desde una perspectiva informática. Explican lo que está sucediendo en un sistema informático a nivel del lenguaje ensamblador. Esta es una vista que está por encima de la vista electrónica de la arquitectura de la computadora, pero está debajo de la vista de los sistemas operativos del sistema de la computadora. Los científicos informáticos entienden las computadoras en muchos niveles. Ellos entienden cómo los muchos niveles se construyen uno encima de otro. Cada uno de estos niveles corresponde a uno o más cursos en un programa de grado en ciencias de la computación.
Fundamentos
La arquitectura MIPS es moderna y está bien diseñada. El chip MIPS se diseñó desde cero en 1985. Su diseño incluye las mejores ideas de arquitectura informática. Puede sorprenderte que algo hecho en 1985 pueda llamarse "moderno". Sin embargo, los fundamentos de cualquier ciencia cambian lentamente, si es que lo hacen. El MIPS es un excelente chip para estudiar si quieres aprender los fundamentos de cómo funcionan las computadoras.
Un programa de lenguaje en ensamblador describe exactamente qué debe hacer el hardware, paso a paso, en términos de las operaciones básicas del hardware. En un lenguaje de programación de alto nivel como C o Java, un programador desconoce la arquitectura de la computadora. El mismo programa fuente puede ejecutarse (después de la compilación) en cualquier familia de procesadores.
Estas notas son acerca de la arquitectura de computadora de nivel de ensamblaje fundamental. Para hacer esto de manera efectiva, es necesario aprender el lenguaje ensamblador y los detalles de un procesador en particular, y escribir programas para él. Esto es algo así como los experimentos que hiciste en la química de la escuela secundaria. Su objetivo era enseñarte los fundamentos de la química, no enseñarte cómo hacer tubos de ensayo llenos de agua colorida. Pero sin los coloridos experimentos, su comprensión de la química podría seguir siendo abstracta y vaga, y pronto sería olvidada.
Ciclo del procesador
La mayoría de los procesadores repiten infinitamente tres pasos básicos. Cada ciclo de máquina da como resultado la ejecución de una instrucción de máquina. Un procesador moderno realiza millones de ciclos de máquina por segundo.
Una instrucción de máquina es un patrón de bits que corresponde a una operación fundamental del procesador, como agregar dos enteros de 32 bits o probar si un valor es cero. Los detalles del ciclo de la máquina difieren entre las familias de procesadores. El ciclo de la máquina de la mayoría de los chips de procesador tiene el siguiente aspecto:
Obtener la instrucción. La instrucción se extrae de la memoria. El contador de programa (PC) es parte del procesador. Contiene la dirección de la instrucción en memoria.
Incrementar el contador del programa. El contador del programa ahora apunta a la siguiente instrucción.
Ejecutar la instrucción. La operación solicitada por la instrucción actual de la máquina se realiza.
En un procesador de 32 bits, las direcciones de memoria tienen 32 bits de ancho, por lo que el contador de programa (PC) tiene una dirección de 32 bits.
Instrucciones del procesador
Las instrucciones se ejecutan normalmente en secuencia. El contador del programa avanza a través de la memoria una instrucción a la vez. Cada vez que se ejecuta una instrucción, la siguiente se selecciona automáticamente para el siguiente ciclo de ejecución.
Las operaciones como "agregar dos enteros" y "comparar dos enteros" son operaciones que hace un procesador en un ciclo de máquina. Los bucles y las ramas requieren instrucciones de la máquina que alteran la secuencia normal.
Una instrucción de máquina es un patrón de bits que dirige al procesador para realizar una operación de máquina. Aquí está la instrucción de máquina que ordena al procesador MIPS que agregue dos registros de 32 bits juntos (un registro es una parte del procesador que contiene un patrón de bits).
0000 0001 0010 1011 1000 0000 0010 0000
La instrucción tiene 32 bits de largo. Cada bit es 0 o 1. Cuando se muestran patrones de bits en un libro, generalmente se muestran en grupos de cuatro (como aquí). Por supuesto, los espacios entre grupos son una convención de impresión y no son realmente parte del patrón de bits.
Algunos de los bits en la instrucción especifican la operación (agregando dos registros), otros bits especifican qué dos registros agregar. Algunos bits más dicen que fueron para poner el resultado.
Declaración en lenguaje ensamblador
El diseño de una instrucción de máquina es parte de la arquitectura de un chip de procesador. Sin conocer el diseño, no puede decir lo que significa la instrucción. Incluso si conoce el diseño, es difícil recordar lo que significan los patrones y las instrucciones de la máquina difíciles de escribir.
Una declaración en lenguaje ensamblador puro corresponde a una instrucción de máquina. El lenguaje de ensamblaje es mucho más fácil de escribir que el lenguaje de máquina. Aquí está la instrucción de la máquina anterior y el lenguaje ensamblador al que corresponde:
Código del procesador:
0000 0001 0010 1011 1000 0000 0010 0000
Declaración en lenguaje ensamblador:
$t0,$t1,$t2
La instrucción significa: agregue los enteros en los registros $ t1 y $ t2 y coloque el resultado en el registro $ t0. Para crear la instrucción de la máquina a partir de la declaración del lenguaje ensamblador, se utiliza un programa de traducción llamado ensamblador.
Los humanos encuentran que el lenguaje ensamblador es mucho más fácil de usar que el lenguaje de máquina por muchas razones.
Es difícil para los humanos hacer un seguimiento de unos y ceros.
Al usar símbolos, los programadores ganan flexibilidad al describir el cálculo.
El lenguaje ensamblador es una notación compacta.
El lenguaje de ensamblaje mejorado incluye características de conveniencia adicionales. Tiene instrucciones (llamadas pseudoinstrucciones) que corresponden a varias instrucciones de la máquina.
Traducción del programa
La declaración en lenguaje ensamblador dice lo mismo que la instrucción de lenguaje de máquina, pero debe traducirse en un patrón de bits antes de que pueda ejecutarse. Un programa de lenguaje ensamblador consiste en declaraciones en lenguaje ensamblador, declaraciones que definen datos y cierta información adicional que ayuda en la traducción. Aquí hay un fragmento de un programa de lenguaje ensamblador y su traducción a patrones de bits.
Código máquina
0011 0100 0000 0001 0000 0000 0000 1001
0000 0000 0100 0001 0000 0000 0001 1000
0000 0000 0000 0000 0100 0000 0001 0010
0011 0100 0000 0001 0000 0000 0000 1001
0000 0000 0100 0000 0000 0000 0100 1000
Declaraciones en ensamblador:
ori $1, $0, 9
mult $2, $1
mflo $8
ori $1, $0, 5
div $8, $1
Hace años, para ejecutar un programa escrito en FORTRAN, utilizó un compilador para traducir el programa al lenguaje ensamblador. Luego utilizó un ensamblador para traducir el lenguaje ensamblador al lenguaje de máquina. Finalmente, cargó el lenguaje de la máquina en la memoria de la computadora y ejecutó su programa.
Los compiladores modernos generalmente traducen un programa de origen directamente al lenguaje de máquina que está contenido en un archivo llamado módulo de objeto (más sobre esto más adelante). Pero, por ahora, pensemos en traducir FORTRAN al lenguaje ensamblador.
FORTRAN es un lenguaje de alto nivel. Está destinado a ejecutarse en todo tipo de computadoras, independientemente de la arquitectura. Los enunciados de FORTRAN se pueden escribir sin conocer la arquitectura de la computadora y se pueden ejecutar en cualquier computadora (después de la traducción).
Traducciones
Todos los lenguajes de programación que no sean el lenguaje de máquina deben traducirse al lenguaje de máquina antes de que puedan ejecutarse. Un lenguaje de alto nivel es independiente de la arquitectura. Requiere un traductor específico (compilador) para cada arquitectura. Cuanto más moderno es el idioma, más distante es el código fuente del lenguaje de la máquina. FORTRAN tiene 50 años y está más cerca del lenguaje de máquina que los idiomas modernos. Aquí hay una declaración en FORTRAN:
result = 6*alpha+beta
Aquí hay una traducción de esa declaración al lenguaje ensamblador de MIPS:
lw $t0,alpha # copy alpha to register $t0
lw $t1,beta # copy beta to register $t1
mul $t2,$t0,6 # multiply $t0 times 6; result in $t2
add $t2,$t2,$t1 # add $t2 and $t1; result in $t2
sw $t2,result # copy answer to result
Aquí hay una traducción de esa declaración en el lenguaje ensamblador VAX de Digital Equipment Corporation:
MULL3 #6,ALPHA,R5
ADDL3 R5,BETA,RESULT
Código máquina
No hay solo un lenguaje llamado "lenguaje ensamblador". Cada familia de procesadores (como Intel, VAX, MIPS, Alpha, ...) tiene sus propias instrucciones de máquina y un lenguaje ensamblador correspondiente. El lenguaje de ensamblaje MIPS es solo para procesadores MIPS. El lenguaje ensamblador VAX es solo para procesadores VAX. Hay un lenguaje ensamblador diferente para las computadoras mainframe de IBM, y otras para las PC basadas en Intel.
Todos los procesadores siguen el mismo ciclo básico de la máquina. (Véase más arriba). Las diferencias entre los procesadores están en los detalles de las operaciones que se realizan en la fase de "ejecución" del ciclo básico de la máquina.
El lenguaje ensamblador describe los cálculos en términos del hardware de un procesador en particular. Un lenguaje de programación de alto nivel (idealmente) describe los cálculos en términos del problema que se está resolviendo. Como hay muchos tipos de problemas, hay muchos idiomas de alto nivel, cada uno diseñado para tipos particulares de problemas. Por ejemplo, los lenguajes orientados a objetos, describen cálculos en términos de los objetos del problema y las operaciones con ellos.
Es mucho más fácil programar una computadora en un lenguaje de alto nivel que en lenguaje ensamblador, especialmente cuando el lenguaje de programación coincide con el problema. Nunca habrá un lenguaje de programación universal ya que ningún idioma es el mejor para todos los problemas.
Almacenamiento
El lenguaje ensamblador no coincide con el problema cuando el problema es la operación del sistema informático. El lenguaje ensamblador se usa para sistemas operativos, compiladores, comunicaciones, gráficos de bajo nivel y otros programas donde la arquitectura del procesador debe estar visible. A menudo, con estos programas, las partes cruciales se escriben en ensamblaje y el resto en un lenguaje de alto nivel (generalmente C). El uso más común del lenguaje ensamblador es en la programación de sistemas integrados. Aquí un chip de procesador es parte de una máquina construida para un propósito específico. Los ejemplos son electrónica de aviación, satélites de comunicación, reproductores de DVD, robots, electrónica del automóvil, teléfonos celulares y consolas de juegos. Los chips MIPS se usan comúnmente en estos (y por esta razón, se fabrican más chips MIPS cada año que cualquier otro procesador).
Ahora pasemos a la memoria de un sistema informático. Ocho bits componen un byte. Un bit es un único valor de encendido / apagado. Las primeras computadoras tenían filas de interruptores de palanca que se usaban para establecer los valores de los bits en la memoria principal. Puede programar estas computadoras ingresando los bits de cada instrucción de la máquina desde los interruptores del panel frontal. Una luz sobre cada interruptor mostraba si estaba encendida o apagada (1 o 0). Las computadoras modernas tienen métodos más convenientes para mover patrones de bits a la memoria.
Los bytes que componen las instrucciones de la máquina de un programa se almacenan en la memoria principal y se almacenan en el procesador según sea necesario. Los datos también se guardan en la memoria principal. Mantener tanto los datos como las instrucciones en la memoria principal es una de las características de una máquina Von Neumann, el nombre del diseño básico de la mayoría de las computadoras modernas.
En el MIPS, como en la mayoría de las computadoras, cada byte de la memoria principal tiene una dirección. Una dirección es un número entero que identifica de manera única el byte. Las direcciones se ejecutan desde 0 hasta aproximadamente cuatro mil millones. Sin embargo, en el MIPS, los programas y datos del usuario (como los que va a escribir) están restringidos a las primeras dos mil millones de direcciones.
Capítulo 2: Señales análogicas y binarias
Todo el mundo sabe que las computadoras son "digitales" y que usan números "binarios". Probablemente tengas una idea de lo que significan estos términos. Pero debemos tener claro su significado preciso y tener claro por qué las computadoras son digitales.
Temas del capítulo:
-Señales binarias.
-Señales analógicas.
-Ventajas del uso binario sobre el analógico
-Bits.
-"Noisy Signals" (Traducción literal: "Señales ruidosas")
Es necesario un estudio cuidadoso de estos temas para poder entender lo que sucede dentro de los ordenadores.
Binario
Binario significa "dos estados". Los dos estados a veces se llaman "1" y "0", o llamados "verdadero" y "falso", o llamados "on" y "off", (u otros nombres). La característica esencial es que un solo dispositivo binario puede estar en solo uno de dos estados posibles.
Un bit es un único valor "encendido / apagado".
Un buen ejemplo es un interruptor de palanca, como un interruptor de luz. Puede activarlo o desactivarlo, pero no (en funcionamiento normal) otra cosa. Un interruptor de luz contiene un bit de información.
Un atenuador de luz no es un dispositivo binario: tiene muchas posiciones entre "apagado" y "totalmente encendido". Si desea que un atenuador de luz se configure en un 25%, debe ajustarlo con cuidado.
¿Por qué los ordenadores usan binario?
El interruptor de encendido de un automóvil es discreto, tiene estados definidos, pero generalmente hay más de dos estados (apagado, funcionamiento, inicio, acc ...) Un botón en una calculadora es un dispositivo binario. Está encendido o apagado. Por lo general, está "apagado". Cuando lo presionas, está "encendido". Vuelve a "apagado" cuando lo sueltas, que es diferente de un interruptor de palanca, pero sigue siendo un dispositivo binario.
Hay muchas ventajas en el binario. Aquí hay cuatro razones importantes (un tanto superpuestas) para usar el binario:
-Simple y fácil de construir.
-Señales no ambiguas (por lo tanto, inmunidad al ruido).
-Se pueden hacer copias impecables.
-Todo lo que se puede representar con algún tipo de patrón se puede representar con patrones de bits.
Estas características del binario fueron realizadas por Claude Shannon, un matemático de Bell Telephone Laboratories. Su artículo de 1948 Una teoría matemática de la comunicación es la base de la teoría de la información y gran parte de la informática.
Ventajas del binario 1: Simpleza
Un interruptor de encendido / apagado es simple y fácil de construir. Un interruptor de encendido / apagado mueve dos piezas de metal juntas o las separa. Un atenuador de luz debe cambiar gradual y suavemente la corriente que llega a la luz. Tiene más componentes que un interruptor de encendido / apagado y debe ser ensamblado cuidadosamente. Un dimmer preciso (donde el 25% significa exactamente el 25%) es aún más difícil de construir.
Lo mismo es cierto para los pequeños dispositivos dentro de un chip de silicio. Los interruptores de encendido / apagado son relativamente fáciles de fabricar. Fácil de construir significa que los dispositivos son baratos, pequeños y confiables, y millones de ellos pueden colocarse en un área pequeña.
Ventajas del binario 2: Señales no ambiguas
Tallar un bloque de madera en una página de libro requiere una gran habilidad técnica y artística. La tarea es compleja y laboriosa. Un pequeño error podría arruinar todo el bloque. Los talladores de madera del Renacimiento fueron tan habilidosos como lo fueron siempre los talladores de madera.
El tipo de configuración de señales binarias es comparativamente fácil. Se requiere poca habilidad artística o técnica. Las piezas individuales de tipo simplemente se colocan en su lugar. El método es robusto y confiable; los errores pueden ser corregidos El tipo puede ser reutilizado muchas veces.
Es una paradoja que los avances en la tecnología a menudo conducen a métodos simples. El tallado en madera es complejo; el tipo de configuración es fácil. La revolución de la computadora (alrededor de 1950-) a menudo se compara con la de Gutemberg sobre 1450.
Por ejemplo podríamos utilizar la siguiente analogía:
Considerad que habéis lanzado una moneda. Si asignamos a cara el valor (1) y a cruz el valor (2), sabemos que sólo podemos obtener esos valores, sin ninguno de los infinitos resultados que hay entre ellos.
Eso es lo que llamanos una señal discreta porque tienen un número exacto de estados definidos. En algunos casos se suele emplear el término digital para referirse a dicha señal.
Señales analógicas
Una señal analógica puede cambiar continuamente de valor. Sus valores pueden ser cualquier cosa dentro de un rango de valores, y su valor exacto en cualquier momento es importante. El siguiente gráfico representa una señal analógica. El valor exacto en cada momento es parte de la información que contiene. Por ejemplo, el valor en el tiempo "T2" se debe medir exactamente.
Ahora supón que se está observando el voltaje de un cable. Se ha acordado que cualquier voltaje por debajo de un umbral se contará como una señal de "apagado", y que cualquier valor por encima del umbral se contará como una señal de "encendido".
Señal binaria
Las señales analógicas cambian continuamente de valor. Al usar un umbral, las señales analógicas pueden representar datos binarios (datos "on / off"). Es fácil y rápido (para la electrónica, así como para los humanos) determinar si un voltaje está por encima o por debajo de un umbral. La figura muestra una señal que transmite "off" y luego "on". (La señal se examina a veces T1 y T2).
Transmisión imperfecta
Los "ons" y "offs" de la señal anterior son claros. Pero, ¿qué pasa si la señal se envía por un cable largo y alguien cercano enciende una aspiradora? El motor eléctrico giratorio y chispeante crea una gran cantidad de ruido eléctrico. El gráfico muestra la señal en el otro extremo del cable.
Aunque la señal es ruidosa (en el nivel analógico), los valores binarios se transmiten perfectamente. Usted (y los componentes electrónicos) todavía pueden decir que en el tiempo T1 la señal representa "apagado" y que en el tiempo T2 la señal representa "encendido". El extremo receptor solo necesita obtener los valores binarios.
Como solo importa la información de "encendido" "apagado", el ruido analógico es irrelevante, y la señal original se recibe perfectamente (en lo que respecta a la información binaria).
Ventajas del binario 3: Se pueden hacer copias impecables
El extremo de recepción de la señal solo está interesado en los valores binarios. Todo lo que tiene que hacer es verificar si la señal está por encima o por debajo del umbral. Esto se puede hacer perfectamente (siempre que el ruido no sea demasiado grande). Por ejemplo, aquí está la señal ruidosa con los valores "on" / "off" recuperados de ella:
La señal original se ha recuperado sin problemas. Este proceso puede ocurrir tantas veces como sea necesario con una copia perfecta hecha cada vez. Esto es esencial en un sistema de computadora, donde los patrones de bits (patrones de uno y cero, o encendido y apagado) se copian hacia adelante y hacia atrás entre el procesador y la memoria millones de veces por segundo. Las copias deben ser perfectas.
Frecuencia del procesador
Los sistemas digitales están construidos de manera que el valor de "encendido" "apagado" (binario) solo se prueba en ciertos momentos, dando al cable (o transistor, o ...) la oportunidad de cambiar su estado entre estos tiempos. Esta es la razón por la cual los sistemas informáticos tienen un "reloj": para mantener todos estos tiempos sincronizados. Por lo tanto, los relojes más rápidos significan que los cables se pueden probar más veces por segundo, y todo el sistema funciona más rápido.
Los chips de procesador (y las computadoras que los contienen) a menudo se describen en términos de velocidad de reloj. La velocidad del reloj se mide en hercios, donde un hercio es un tic del reloj por segundo.
El símbolo MHz significa mega Hertz, un millón de tics de reloj por segundo. El símbolo GHz significa giga Hertz, mil millones de tics de reloj por segundo.
Un procesador de 700 MHz comprueba los valores binarios 700 millones de veces en cada segundo. Entre estos tiempos, los valores pueden cambiar y establecerse. Cuanto más rápido es un chip de procesador, más veces por segundo se pueden probar los valores, y se pueden tomar más decisiones por segundo.
Ventajas del binario 4: Todo se puede representar
Dado que los datos de todo tipo se almacenan en la memoria de la computadora (principal y secundaria) utilizando los mismos métodos electrónicos, esto significa que se pueden hacer infinitas copias perfectas de cualquier tipo de datos o programa.
Esta idea es que cualquier sistema de símbolos se puede traducir en patrones de bits. Un ejemplo es cómo los caracteres ingleses se representan como patrones de ocho bits. El acuerdo sobre qué patrones representan qué personajes se llama ASCII. El hardware y el software de un sistema informático (por lo general) siguen este acuerdo cuando los datos son "texto". (Aprenderá más sobre esto más adelante). Otros tipos de datos (datos sin carácter) se representan utilizando otros métodos.
Los caracteres japoneses y chinos, también, se han traducido a patrones de bits, y las computadoras pueden manipular esos símbolos con la misma facilidad que ASCII. Unicode es un acuerdo creado por un comité internacional sobre cómo representar caracteres usando 16 bits. Aquí hay 16 bits 111110011111110 y aquí está el carácter que representa en Unicode:
Supongamos que el comité internacional decide representar a un nuevo personaje chino. ¿Cómo pueden hacer esto? Fácil: encuentran un patrón de bits que todavía no se usa para representar ningún símbolo y asignan el nuevo carácter a ese patrón.
La correspondencia entre los símbolos del lenguaje humano y los patrones de bits es arbitraria. Todo lo que tiene que hacer es asegurarse de que está utilizando suficientes bits para que cada símbolo del idioma tenga un patrón de bits único para representarlo.
¿Qué pasa con representar cosas que no sean los caracteres escritos de un idioma? Este es un tema profundo, y libros enteros han sido escritos en él. Aquí hay una discusión muy descuidada: Elija un tema. Usa oraciones en inglés para describirlo. Represente esas oraciones en ASCII (caracteres codificados como patrones de bits). Ahora el tema se representa en binario. Si algo se puede representar en inglés, se puede representar en binario.
Tenga en cuenta que esto no dice nada sobre "significado" o "comprensión". Los libros impresos no entienden su propio contenido. Una versión digital del libro (por ejemplo, en un CD ROM) tampoco comprende el libro. Simplemente contiene la información, esperando que una mente humana haga el entendimiento. Sin embargo, el libro ha sido representado como patrones de bits.
Nadie dijo que las representaciones binarias son fáciles de usar. Algunos métodos de representación son muy útiles para las computadoras (por ejemplo, usan patrones binarios para representar números), otros son casi inútiles. Gran parte del trabajo que hacen los informáticos es averiguar cómo representar las cosas utilizando binarios de maneras que son útiles. Por ejemplo, se ha trabajado mucho en los últimos diez años para determinar la mejor forma de representar los datos de imagen y audio.
Punto importante:
Todo lo que la memoria de la computadora contiene es patrones de bits. Lo que esos patrones de bits representan depende de cómo se usan.
Capítulo 3: Bits y sus patrones
Las computadoras representan datos e instrucciones con patrones de bits. ¡Debes familiarizarte con los patrones de bits! Este capítulo te ayudará, pues discute los fundamentos de los patrones de bits.
Temas del capítulo:
-Patrones de bits.
-El número de patrones para N bits.
-Como listar sistemáticamente esos patrones.
-Potencias de dos.
-Bytes, kilobytes, megabytes y gigabytes.
-Nombres de los patrones de cuatro bits.
-Nombres hexadecimales de los patrones de bits.
-Nombres octales de los patrones de bits.
En la mayoría de la documentación de la computadora, 8 bits contiguos se llaman byte. Un bit contiene un cero o uno, posiblemente representando la condición de encendido / apagado de un interruptor.
Patrones de bits
Un bit puede ser 0 o 1. Con un bit hay dos patrones posibles. ¿Cuántos patrones se pueden formar con dos bits? Aquí hay una lista completa:
11
10
01
00
Son, pues, cuatro patrones.
¿Cuantos pueden hacerse con tres?
000
001
010
011
100
101
110
111
8 patrones en total.
Listar patrones sistemáticamente
Hay un método estándar para enumerar todos los patrones que se pueden formar con un número dado de bits. Primero, enumere todos los patrones que se pueden formar con un bit:
0
1
Para aumentar el número de bits (de uno a dos) haga dos copias de la lista:
0
10
1
Dentro de cada copia, cada fila es única. Ahora, haga que cada fila en la lista combinada sea única. Haga esto poniendo un "0" delante de cada línea de la primera copia, y un "1" delante de cada línea de la segunda copia:
00
01
10
11
Ahora cada línea es única y usted tiene una lista completa de los patrones posibles de dos bits. El número de patrones únicos con 2 bits es el doble que con 1 bit. Para cada bit adicional sólo tendrá que repetir el proceso.
¿Cuantos patrones para N bits?
La lista de patrones para tres bits tiene 8 líneas (patrones). Para formar la lista de patrones para 4 bits, haga dos copias de la lista para 8 bits. Esto te da 16 líneas. Cada línea se hace única prefijando la primera mitad con "0" y la segunda mitad con "1".
Por supuesto, el truco se puede repetir tantas veces como quieras. Agregar un bit más duplica la cantidad de patrones. La tabla muestra el número de patrones para 1, 2, 3 y 4 bits.
Bits Patrones Potencias de dos
1 2 2(1)
2 4 2(2)
3 8 2(3)
4 16 2(4)
Nota: Número de patrones de bits= 2(N)
Muchos cálculos que involucran patrones de bits usan el siguiente hecho familiar de la aritmética. (Aunque el hecho es familiar, la confusión es aún más familiar. Asegúrese de conocer este hecho).
2 (N+M) = 2(N) * 2(M)
Los números de patrones que se pueden formar con 10 o más bits generalmente se expresan como múltiplos de 1024 = 2(10) o en "Megas" = 2(20). Por ejemplo, ¿cuántos patrones se pueden formar a partir de 24 bits?
2(24)=2(4)*2(20)= 16 Megas
Nombres de los patrones
Considera el siguiente patrón:
0010100010101010
No es fácil trabajar con. Es conveniente romper patrones de bits en grupos de 4 bits (llamados nibbles (lit."mordiscos" )):
0010 1000 1010 1100
Hay 16 (= 24) patrones posibles en un nibble. Cada patrón tiene un nombre, como se ve en la tabla.
Es posible que tengas la tentación de llamar a esos patrones de 4 bits "números binarios". Resiste esa tentación. Los patrones de bits en la memoria principal de la computadora se utilizan para muchos propósitos. Representar enteros es solo uno de ellos. El concepto fundamental es "patrones de bits". No confunda este concepto con uno de sus muchos usos: "representar números".
El siguiente sistema de patrones se puede representar según los nombres de los patrones:
0010 1000 1010 1100 = 2 8 A C
Los bits se agrupan en nibbles empezando por la derecha. Luego se nombra cada uno. Este método de dar nombres a patrones se llama hexadecimal.
Por lo general, '0x' se coloca al frente de un nombre de patrón para mostrar que es un nombre de patrón hexadecimal:
0x0010 = 0000 0000 0001 0000
0xFACE = 1111 1010 1100 1110
Agregar ceros a la izquierda de un patrón crea un nuevo patrón. El nuevo patrón tiene su propio nombre. 0x0 = 0000 es un patrón diferente de 0x00 = 0000 0000. Tristemente, muchas personas no son consistentes sobre esto, y dependiendo del contexto, ambos patrones se pueden llamar "0x0".
Tened en cuenta que los nombres de patrones hexadecimales son utilizados por humanos para hablar sobre patrones de bits. Dentro de la computadora solo hay bits y sus patrones. El hexadecimal se usa en libros y documentos (fuera de la computadora) para describir estos patrones de bits.
Sistema octal
A veces la documentación describe patrones de bits en grupos de tres. Los grupos de tres bits se nombran utilizando los primeros ocho nombres de patrón de hexadecimal. Este método se llama notación octal. Se puede nombrar un patrón de bits utilizando nombres hexadecimales, nombres octales u otras muchas anotaciones.
01101010 = 01 101 010 = 152 (octal)
01101010 = 0110 1010 = 0x6A (hexadecimal)
El octal es incómodo de usar con bytes de 8 bits. Los bytes no se dividen de manera uniforme en nombres de patrones octales. Pero deberías saberlo. Históricamente, alguna documentación de la computadora utilizaba nombres de patrones octales. Además, en varios lenguajes de programación (C y Java entre ellos) la notación octal se indica con un cero inicial:
0152 (octal) = 001 101 010
0x152 (hex) = 0001 0101 0010
152 (decimal) = 10011000
Cuando el número de bits no es un múltiplo de tres, es convencional agregar cero bits a la izquierda, y luego nombrar el patrón como de costumbre. Esto sucede con frecuencia porque la memoria de la computadora está organizada en bytes de 8 bits, que no se dividen de manera uniforme en grupos de tres.
Capítulo 4: Sistemas informáticos
Este capítulo explica cómo se organizan los sistemas de computadoras, con especial atención a la memoria principal. La mayoría de esto probablemente ya lo sepáis, pero mirad de todos modos.
Temas del capítulo:
-Componentes de un sistema informático
-Controladores de dispositivo
-Memoria principal
-Direcciones
-Memoria virtual
-Memoria caché
-Contenido de la memoria
Componentes de una computadora
El diagrama muestra una vista general de cómo se organizan las computadoras de escritorio y estaciones de trabajo. Los diferentes sistemas tienen diferentes detalles, pero en general todas las computadoras constan de componentes (procesador, memoria, controladores, video) conectados con un bus. Físicamente, un bus consta de muchos cables paralelos, generalmente impresos (en cobre) en la placa de circuito principal de la computadora. Las señales de datos, las señales de reloj y las señales de control se envían en el bus de un lado a otro entre los componentes. Un tipo particular de autobús sigue un estándar cuidadosamente escrito que describe las señales que se transmiten por los cables y lo que significan las señales. El estándar PCI (por ejemplo) describe el bus PCI utilizado en la mayoría de las PC actuales.
El procesador ejecuta continuamente el ciclo de la máquina, ejecutando las instrucciones de la máquina una por una. La mayoría de las instrucciones son para una operación aritmética, lógica o de control. Una operación de máquina a menudo implica el acceso al almacenamiento principal o involucra un controlador de E / S. Si es así, la operación de la máquina pone señales de datos y control en el bus y (puede) esperar a que vuelvan las señales de datos y control. Algunas operaciones de la máquina tienen lugar completamente dentro del procesador (el bus no está involucrado). Estas operaciones son muy rápidas.
Controladores de Entrada/Salida
La forma en que los dispositivos conectados a un bus cooperan es otra parte de un estándar del bus.
Los controladores de entrada / salida reciben solicitudes de entrada y salida del procesador central y luego envían señales de control específicas del dispositivo al dispositivo que controlan. También administran el flujo de datos hacia y desde el dispositivo. Esto libera al procesador central de la participación con los detalles de controlar cada dispositivo. Los controladores de E / S son necesarios solo para los dispositivos de E / S que forman parte del sistema.
A menudo, los controladores de E / S son parte de la electrónica en la placa de circuito principal (la placa madre) de la computadora. A veces, un dispositivo poco común requiere su propio controlador que debe conectarse a un conector (una ranura de expansión) en la placa base.
Los controladores de E / S a veces se llaman controladores de dispositivos. El software que interactúa directamente con un controlador de dispositivo se denomina controlador de dispositivo. Cuando instala un nuevo dispositivo en su computadora (por ejemplo, una nueva placa gráfica) también debe instalar un controlador de dispositivo para ello.
Memoria principal
En la práctica, los datos y las instrucciones a menudo se colocan en diferentes secciones de la memoria, pero esta es una cuestión de organización de software, no un requisito de hardware. Además, la mayoría de las computadoras tienen secciones especiales de memoria que mantienen permanentemente programas (firmware almacenado en la ROM) y otras secciones que se usan permanentemente para fines especiales.
La memoria principal (también llamada almacenamiento principal, o simplemente memoria) contiene los patrones de bits de las instrucciones de la máquina y los patrones de bits de los datos. Los chips de memoria y los componentes electrónicos que los controlan solo se preocupan por guardar patrones de bits y devolverlos cuando se soliciten. No se establece ninguna distinción entre los patrones de bits que se conciben como instrucciones y patrones de bits destinados a datos. La cantidad de memoria en un sistema a menudo se describe utilizando los términos de la tabla.
En estos días, la cantidad de memoria principal en una nueva computadora de escritorio oscila entre 4 gigabytes y 32 gigabytes. Los discos duros y otros dispositivos de almacenamiento secundarios contienen varios terabytes.
Direcciones
Cada byte de almacenamiento principal tiene una dirección. La mayoría de los procesadores modernos usan direcciones de 32 bits, por lo que hay 232 direcciones posibles. Piense en el almacenamiento principal como si fuera una matriz:
byte [0x00000000 ... 0xFFFFFFFF] mainStorage;
Una dirección de almacenamiento principal es un índice en la memoria. Una dirección de 32 bits es la dirección de un solo byte. Treinta y dos cables del bus contienen una dirección (hay muchos más cables de bus para temporización y control).
A veces las personas hablan de direcciones como 0x2000, que parece un patrón de solo 16 bits. Pero esto es solo una abreviatura de la dirección completa de 32 bits. La dirección real es 0x00002000.
Los primeros procesadores MIPS (diseñados en 1985) usaban direcciones de 32 bits. Desde 1991 hasta la actualidad, los procesadores MIPS de gama alta usan direcciones de 64 bits. El chip MIPS32 es un chip moderno diseñado para aplicaciones integradas. Utiliza direcciones de 32 bits, ya que las aplicaciones integradas a menudo no necesitan 64 bits. Los chips de procesadores recientes de AMD e Intel tienen direcciones de 64 bits, aunque las versiones de 32 bits aún están disponibles.
El lenguaje ensamblador de este curso es para el chip MIPS32, por lo que utilizaremos direcciones de 32 bits. El lenguaje ensamblador de los chips MIPS de 64 bits es similar.
Memoria virtual
El MIPS tiene un espacio de direcciones de 2(32) bytes. Un Gigabyte es 2(30), por lo que el MIPS tiene 4 gigabytes de espacio de direcciones. Idealmente, todas estas ubicaciones de memoria se implementarían usando chips de memoria (generalmente llamados RAM).
En las computadoras modernas, el espacio de direcciones completo está presente sin importar la cantidad de RAM que se haya instalado. Esto se hace manteniendo algunas partes del espacio de direcciones completo en el disco y algunas partes en la RAM. La RAM, el disco duro, algunos componentes electrónicos especiales y el sistema operativo funcionan en conjunto para proporcionar el espacio de direcciones completo de 32 bits. Para un usuario o un programador de aplicaciones, parece que todos los 2(32) bytes de la memoria principal están presentes.
Este método de proporcionar el espacio de direcciones completo mediante el uso de una combinación de memoria RAM y el disco duro se denomina memoria virtual. La palabra virtual significa "pareciendo existir, pero no realmente allí".
Memoria en caché
El acceso al disco es lento en comparación con el acceso a la memoria RAM. Potencialmente, usar una combinación de memoria real y memoria de disco para implementar el espacio de direcciones podría ralentizar la ejecución del programa. Sin embargo, con una electrónica inteligente y un buen sistema operativo, la memoria virtual es solo un poco más lenta que la memoria física.
Los sistemas informáticos también tienen memoria caché. La memoria caché es una RAM muy rápida que está dentro (o cerca de) el procesador. Duplica secciones de almacenamiento principal que son muy utilizadas por los programas actualmente en ejecución. El procesador no tiene que usar el bus del sistema para obtener o almacenar datos en la memoria caché. El acceso a la memoria caché es mucho más rápido que a la memoria principal normal.
Al igual que la memoria virtual, la memoria caché es invisible para la mayoría de los programas. Es un detalle electrónico por debajo del nivel de abstracción proporcionado por el lenguaje ensamblador. El hardware mantiene la memoria caché actualizada y sincronizada con el almacenamiento principal. Sus programas no saben que hay memoria caché y memoria virtual. Simplemente ven "memoria principal". Los programas de aplicación no contienen instrucciones que digan "almacenar esto en la memoria caché", o decir "obtener esto de la memoria virtual". Solo se refieren a los contenidos de la memoria principal en una dirección particular. El hardware se asegura de que el programa obtenga o almacene el byte correcto, sin importar dónde esté realmente.
Contenido de la memoria
El sistema de memoria simplemente almacena patrones de bits. Que algunos de estos patrones representen enteros, que algunos representen caracteres y que algunos representen instrucciones (y así sucesivamente) no concierne a la electrónica. Cómo se usan estos patrones depende de los programas que los usan. Un programa procesador de textos, por ejemplo, está escrito para procesar patrones que representan caracteres. Un programa de hoja de cálculo procesa patrones que representan números.
Por supuesto, la mayoría de los programas procesan varios tipos de datos y deben hacer un seguimiento de cómo se usa cada uno. A menudo, los programas mantienen los diversos usos de la memoria en secciones separadas, pero esa es una convención de programación, no un requisito de la electrónica.
Cualquier byte en el almacenamiento principal puede contener cualquier patrón de 8 bits. Ningún byte de almacenamiento principal puede contener nada excepto un patrón de 8 bits. No hay nada en el sistema de memoria de una computadora que diga lo que representa un patrón.