Saltar al contenido principal
LibreTexts Español

16.5: Programación por Microprocesadores

  • Page ID
    154452
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    El “vocabulario” de instrucciones que posee cualquier chip de microprocesador en particular es específico de ese modelo de chip. Un Intel 80386, por ejemplo, utiliza un conjunto completamente diferente de códigos binarios que un Motorola 68020, para designar funciones equivalentes. Desafortunadamente, no existen estándares para las instrucciones de microprocesador. Esto hace que la programación al nivel más bajo sea muy confusa y especializada.

    Cuando un programador humano desarrolla un conjunto de instrucciones para decirle directamente a un microprocesador cómo hacer algo (como controlar automáticamente la tasa de inyección de combustible a un motor), está programando en el propio “lenguaje” de la CPU. Este lenguaje, que consiste en los mismos códigos binarios que la Unidad de Control dentro del chip de la CPU decodifica para realizar tareas, a menudo se conoce como lenguaje de máquina. Si bien el software de lenguaje automático puede ser “redactado” en notación binaria, a menudo se escribe en forma hexadecimal, porque es más fácil para los seres humanos trabajar con él. Por ejemplo, voy a presentar solo algunos de los códigos de instrucciones comunes para el chip del microprocesador Intel 8080:

    TW.PNG

    Incluso con notación hexadecimal, estas instrucciones pueden confundirse y olvidarse fácilmente. Para ello, existe otra ayuda para programadores llamada lenguaje ensamblador. Con lenguaje ensamblador, se utilizan palabras mnemotécnicas de dos a cuatro letras en lugar del código hexadecimal o binario real para describir los pasos del programa. Por ejemplo, la instrucción 7B para el Intel 8080 sería “MOV A, E” en lenguaje ensamblador. Los mnemotécnicos, por supuesto, son inútiles para el microprocesador, que sólo puede entender los códigos binarios, pero es una forma conveniente para que los programadores gestionen la escritura de sus programas en papel o editor de texto (procesador de textos). Incluso hay programas escritos para computadoras llamados ensambladores que entienden estos nemotécnicos, traduciéndolos a los códigos binarios apropiados para un microprocesador objetivo específico, para que el programador pueda escribir un programa en el idioma nativo de la computadora sin tener que lidiar nunca con extraña notación hexadecimal o tediosa de código binario.

    Una vez que un programa es desarrollado por una persona, debe ser escrito en la memoria antes de que un microprocesador pueda ejecutarlo. Si el programa se va a almacenar en ROM (que algunos son), esto se puede hacer con una máquina especial llamada programador de ROM, o (si eres masoquista), enchufando el chip ROM en una placa de pruebas, encendiéndola con los voltajes apropiados y escribiendo datos haciendo las conexiones de cable correctas al direcciones y líneas de datos, una a la vez, para cada instrucción. Si el programa va a ser almacenado en una memoria volátil, como la memoria RAM de la computadora operativa, puede haber una manera de escribirlo a mano a través del teclado de esa computadora (algunas computadoras tienen un mini-programa almacenado en ROM que le dice al microprocesador cómo aceptar pulsaciones de teclas de un teclado y almacenarlas como comandos en RAM), aunque sea demasiado tonto para hacer otra cosa. Muchos kits de computadora “hobby” funcionan así. Si la computadora a programar es una computadora personal completamente funcional con un sistema operativo, unidades de disco y todo funciona, simplemente puede ordenar al ensamblador que almacene su programa terminado en un disco para su posterior recuperación. Para “ejecutar” su programa, simplemente escriba el nombre de archivo de su programa en el prompt, presione la tecla Enter, y el registro del contador de programas del microprocesador se configuraría para que apunte a la ubicación (“dirección”) en el disco donde se almacena la primera instrucción, y tu programa se ejecutará desde allí.

    Aunque la programación en lenguaje máquina o lenguaje ensamblador hace que los programas sean rápidos y altamente eficientes, se necesita mucho tiempo y habilidad para hacerlo para cualquier cosa que no sea las tareas más simples, porque cada instrucción en lenguaje de máquina es muy cruda. La respuesta a esto es desarrollar formas para que los programadores escriban en lenguajes de “alto nivel”, que puedan expresar de manera más eficiente el pensamiento humano. En lugar de escribir decenas de códigos crípticos de lenguaje ensamblador, un programador que escribiera en un lenguaje de alto nivel podría escribir algo así.

    OI.PNG

    y esperar que la computadora imprima “¡Hola, mundo!” sin más instrucciones sobre cómo hacerlo. Esta es una gran idea, pero ¿cómo entiende un microprocesador ese pensamiento “humano” cuando su vocabulario es tan limitado?

    La respuesta viene en dos formas diferentes: interpretación, o compilación. Al igual que dos personas que hablan idiomas diferentes, tiene que haber alguna manera de trascender la barrera del idioma para que puedan conversar. Se necesita un traductor para traducir las palabras de cada persona al idioma de la otra persona, de una manera a la vez. Para el microprocesador, esto significa otro programa, escrito por otro programador en lenguaje máquina, que reconoce los patrones de caracteres ASCII de comandos de alto nivel como Print (P-R-I-N-T) y puede traducirlos en los pasos necesarios de tamaño de bit que el microprocesador puede entender directamente. Si esta traducción se realiza durante la ejecución del programa, al igual que un traductor que interviene entre dos personas en una conversación en vivo, se llama “interpretación”. Por otro lado, si todo el programa se traduce al lenguaje automático de una sola vez, como un traductor grabando un monólogo en papel y luego traduciendo todas las palabras de una vez sentada a un documento escrito en el otro idioma, el proceso se llama “compilación”.

    La interpretación es simple, pero lo convierte en un programa de ejecución lenta porque el microprocesador tiene que traducir continuamente el programa entre pasos, y eso lleva tiempo. La compilación toma tiempo inicialmente para traducir todo el programa en código de máquina, pero el código de máquina resultante no necesita traducción después de eso y se ejecuta más rápido como consecuencia. Se interpretan lenguajes de programación como BASIC y FORTH. Se compilan lenguajes como C, C++, FORTRAN y PASCAL. Los lenguajes compilados generalmente se consideran los idiomas de elección de los programadores profesionales, debido a la eficiencia del producto final.

    Naturalmente, debido a que los vocabularios de lenguaje automático varían ampliamente de microprocesador a microprocesador, y dado que los lenguajes de alto nivel están diseñados para ser lo más universales posible, los programas de interpretación y compilación necesarios para la traducción de idiomas deben ser específicos del microprocesador. El desarrollo de estos intérpretes y compiladores es una hazaña de lo más impresionante: las personas que hacen estos programas definitivamente se ganan su sustento, especialmente cuando se considera el trabajo que deben hacer para mantener su producto de software actualizado con los modelos de microprocesador que cambian rápidamente que aparecen en el mercado.

    Para mitigar esta dificultad, los fabricantes de chips microprocesadores que marcan tendencia (sobre todo, Intel y Motorola) intentan diseñar sus nuevos productos para que sean retrocompatibles con sus productos más antiguos. Por ejemplo, todo el conjunto de instrucciones para el chip Intel 80386 está contenido dentro de los últimos chips Pentium IV, aunque los chips Pentium tienen instrucciones adicionales de las que carecen los chips 80386. Lo que esto significa es que los programas de lenguaje automático (compiladores, también) escritos para computadoras 80386 se ejecutarán en la última y más grande CPU Intel Pentium IV, pero los programas de lenguaje automático escritos específicamente para aprovechar el conjunto de instrucciones más grande del Pentium no se ejecutarán en una 80386, porque la CPU más antigua simplemente no tiene algunas de esas instrucciones en su vocabulario: la Unidad de Control dentro del 80386 no puede decodificarlas.

    Sobre la base de este tema, la mayoría de los compiladores tienen configuraciones que permiten al programador seleccionar para qué tipo de CPU quiere compilar código de lenguaje de máquina. Si seleccionan la configuración 80386, el compilador realizará la traducción usando solo instrucciones conocidas por el chip 80386; si seleccionan la configuración Pentium, el compilador es libre de hacer uso de todas las instrucciones conocidas por Pentiums. Esto es análogo a decirle a un traductor qué nivel mínimo de lectura será su audiencia: un documento traducido para un niño será comprensible para un adulto, pero un documento traducido para un adulto muy bien puede ser galimatías para un niño.


    This page titled 16.5: Programación por Microprocesadores is shared under a GNU Free Documentation License 1.3 license and was authored, remixed, and/or curated by Tony R. Kuphaldt (All About Circuits) via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.