De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda
Monitor de lenguaje de máquina en una computadora de placa única W65C816S , que muestra el desmontaje del código , así como el registro del procesador y los volcados de memoria.

En la programación de computadoras , el código de máquina , que consta de instrucciones en lenguaje de máquina , es un lenguaje de programación de bajo nivel que se utiliza para controlar directamente la unidad central de procesamiento (CPU) de una computadora . Cada instrucción hace que la CPU realice una tarea muy específica, como una carga, un almacenamiento, un salto o una operación de unidad aritmética lógica (ALU) en una o más unidades de datos en los registros o la memoria de la CPU .

El código de máquina es un lenguaje estrictamente numérico que está destinado a ejecutarse lo más rápido posible, y puede considerarse como la representación de nivel más bajo de un programa de computadora compilado o ensamblado o como un lenguaje de programación primitivo y dependiente del hardware . Si bien es posible escribir programas directamente en código de máquina, administrar bits individuales y calcular direcciones numéricas y constantes manualmente es tedioso y propenso a errores. Por esta razón, los programas rara vez se escriben directamente en código de máquina en contextos modernos, pero se pueden hacer para depuración de bajo nivel , parcheo de programas (especialmente cuando la fuente del ensamblador no está disponible) y desensamblaje del lenguaje ensamblador..

La mayoría de los programas prácticos de hoy están escritos en lenguajes de nivel superior o en lenguaje ensamblador. El código fuente es luego traducido a código de máquina ejecutable por utilidades como compiladores , ensambladores y enlazadores , con la importante excepción de los programas interpretados , [1] que no se traducen a código de máquina. Sin embargo, el intérprete en sí, que puede ser visto como un ejecutor o procesador que ejecuta las instrucciones del código fuente, normalmente consiste en un código de máquina directamente ejecutable (generado a partir de código fuente en lenguaje ensamblador o de alto nivel).

El código de máquina es, por definición, el nivel más bajo de detalle de programación visible para el programador, pero internamente muchos procesadores usan microcódigo u optimizan y transforman instrucciones de código de máquina en secuencias de microoperaciones . Por lo general, esto no se considera un código de máquina.

Conjunto de instrucciones [ editar ]

Cada procesador o familia de procesadores tiene su propio conjunto de instrucciones . Las instrucciones son patrones de bits , dígitos o caracteres que corresponden a los comandos de la máquina. Por lo tanto, el conjunto de instrucciones es específico para una clase de procesadores que utilizan (en su mayoría) la misma arquitectura. Los diseños de procesadores sucesores o derivados a menudo incluyen instrucciones de un predecesor y pueden agregar nuevas instrucciones adicionales. Ocasionalmente, un diseño sucesor interrumpirá o alterará el significado de algún código de instrucción (generalmente porque es necesario para nuevos propósitos), afectando la compatibilidad del código hasta cierto punto; incluso los procesadores compatibles pueden mostrar un comportamiento ligeramente diferente para algunas instrucciones, pero esto rara vez es un problema. Los sistemas también pueden diferir en otros detalles, como la disposición de la memoria, los sistemas operativos odispositivos periféricos . Debido a que un programa normalmente se basa en tales factores, los diferentes sistemas normalmente no ejecutarán el mismo código de máquina, incluso cuando se utilice el mismo tipo de procesador.

El conjunto de instrucciones de un procesador puede tener todas las instrucciones de la misma longitud o puede tener instrucciones de longitud variable. La forma en que se organizan los patrones varía con la arquitectura particular y el tipo de instrucción. La mayoría de las instrucciones tienen uno o más campos de código de operación que especifican el tipo de instrucción básica (como aritmética, lógica, salto , etc.), la operación (como agregar o comparar) y otros campos que pueden dar el tipo de operando (s ), el (los) modo (s) de direccionamiento, el (los) desplazamiento (s) de direccionamiento o el índice, o el valor del operando en sí mismo (los operandos constantes contenidos en una instrucción se denominan inmediatos ). [2]

No todas las máquinas o instrucciones individuales tienen operandos explícitos. Una máquina acumuladora tiene un operando izquierdo combinado y da como resultado un acumulador implícito para la mayoría de las instrucciones aritméticas. Otras arquitecturas (como 8086 y la familia x86) tienen versiones de acumulador de instrucciones comunes, con el acumulador considerado como uno de los registros generales por instrucciones más largas. Una máquina de apilartiene la mayoría o todos sus operandos en una pila implícita. Las instrucciones de propósito especial también carecen a menudo de operandos explícitos (CPUID en la arquitectura x86 escribe valores en cuatro registros de destino implícitos, por ejemplo). Esta distinción entre operandos explícitos e implícitos es importante en los generadores de código, especialmente en la asignación de registros y las partes de seguimiento de rango en vivo. Un buen optimizador de código puede rastrear operandos implícitos y explícitos que pueden permitir una propagación constante más frecuente , plegamiento constante de registros (un registro asignado como resultado de una expresión constante liberada reemplazándola por esa constante) y otras mejoras de código.

Programas [ editar ]

Un programa de computadora es una lista de instrucciones que puede ejecutar una unidad central de procesamiento (CPU). La ejecución de un programa se realiza para que la CPU que lo está ejecutando resuelva un problema y así logre un resultado. Mientras que los procesadores simples pueden ejecutar instrucciones una tras otra, los procesadores superescalares son capaces de ejecutar muchas instrucciones simultáneamente.

El flujo del programa puede verse influenciado por instrucciones especiales de "salto" que transfieren la ejecución a una dirección (y por lo tanto a una instrucción) que no sea la siguiente dirección numéricamente secuencial. El hecho de que se produzcan estos saltos condicionales depende de una condición como, por ejemplo, que un valor sea mayor, menor o igual que otro valor.

Lenguajes ensambladores [ editar ]

Una versión mucho más amigable para los humanos del lenguaje de máquina, llamada lenguaje ensamblador , usa códigos mnemónicos para referirse a instrucciones de código de máquina, en lugar de usar los valores numéricos de las instrucciones directamente, y usa nombres simbólicos para referirse a ubicaciones de almacenamiento y, a veces, registros . Por ejemplo, en el procesador Zilog Z80 , el código de máquina 00000101, que hace que la CPU reduzca el B registro del procesador , se representaría en lenguaje ensamblador como DEC B.

Ejemplo [ editar ]

La arquitectura MIPS proporciona un ejemplo específico para un código de máquina cuyas instrucciones tienen siempre 32 bits de longitud. El tipo general de instrucción viene dado por el campo op (operación), los 6 bits más altos. Las instrucciones tipo J (salto) y tipo I (inmediato) están completamente especificadas por op . De tipo R (registro) instrucciones incluyen un campo adicional func para determinar la operación exacta. Los campos utilizados en estos tipos son:

 6 5 5 5 5 6 bits[op | rs | rt | rd | shamt | funct] tipo R[op | rs | rt | dirección / inmediata] I-type[op | dirección de destino] tipo J

rs , rt y rd indican operandos de registro; shamt da una cantidad de turno; y la dirección o los campos inmediatos contienen un operando directamente.

Por ejemplo, sumar los registros 1 y 2 y colocar el resultado en el registro 6 se codifica:

[op | rs | rt | rd | shamt | funct] 0 1 2 6 0 32 decimal 000000 00001 00010 00110 00000 100000 binario

Cargue un valor en el registro 8, tomado de la celda de memoria 68 celdas después de la ubicación listada en el registro 3:

[op | rs | rt | dirección / inmediata] 35 3 8 68 decimal 100011 00011 01000 00000 00001 000100 binario

Saltando a la dirección 1024:

[op | dirección de destino] 2 1024 decimal 000010 00000 00000 00000 10000 000000 binario

Relación con el microcódigo [ editar ]

En algunas arquitecturas de computadora , el código de máquina se implementa mediante una capa subyacente aún más fundamental llamada microcódigo , que proporciona una interfaz de lenguaje de máquina común a través de una línea o familia de diferentes modelos de computadora con flujos de datos subyacentes muy diferentes . Esto se hace para facilitar la portabilidad de programas en lenguaje de máquina entre diferentes modelos. Un ejemplo de este uso es la familia de computadoras IBM System / 360 y sus sucesores. Con anchos de ruta de flujo de datos de 8 bits a 64 bits y más, presentan una arquitectura común a nivel de lenguaje de máquina en toda la línea.

El uso de microcódigo para implementar un emulador permite a la computadora presentar la arquitectura de una computadora completamente diferente. La línea System / 360 utilizó esto para permitir la portabilidad de programas de máquinas IBM anteriores a la nueva familia de computadoras, por ejemplo, un emulador IBM 1401/1440/1460 en IBM S / 360 modelo 40.

Relación con el código de bytes [ editar ]

El código de máquina es generalmente diferente del código de bytes (también conocido como código p), que es ejecutado por un intérprete o él mismo se compila en código de máquina para una ejecución más rápida (directa). Una excepción es cuando un procesador está diseñado para usar un código de bytes en particular directamente como su código de máquina, como es el caso de los procesadores Java .

El código de máquina y el código ensamblador a veces se denominan código nativo cuando se refieren a partes de bibliotecas o características del lenguaje que dependen de la plataforma. [3]

Almacenando en la memoria [ editar ]

La arquitectura de Harvard es una arquitectura de computadora con almacenamiento físicamente separado y rutas de señal para el código (instrucciones) y los datos . Hoy en día, la mayoría de los procesadores implementan rutas de señal separadas por razones de rendimiento, pero implementan una arquitectura Harvard modificada , [ cita requerida ] para que puedan soportar tareas como cargar un programa ejecutable desde el almacenamiento en disco como datos y luego ejecutarlo. La arquitectura de Harvard contrasta con la arquitectura de Von Neumann , donde los datos y el código se almacenan en la misma memoria que el procesador lee, lo que permite que la computadora ejecute comandos.

Desde el punto de vista de un proceso , el espacio de código es la parte de su espacio de direcciones donde se almacena el código en ejecución. En los sistemas multitarea , esto comprende el segmento de código del programa y, por lo general, las bibliotecas compartidas . En un entorno de subprocesos múltiples , los diferentes subprocesos de un proceso comparten el espacio de código junto con el espacio de datos, lo que reduce considerablemente la sobrecarga del cambio de contexto en comparación con el cambio de proceso.

Legibilidad por humanos [ editar ]

Pamela Samuelson escribió que el código de máquina es tan ilegible que la Oficina de Copyright de los Estados Unidos no puede identificar si un programa codificado en particular es un trabajo original de autoría; [4] Sin embargo, la Oficina de Derechos de Autor de Estados Unidos no permite el registro de derechos de autor de programas de ordenador [5] y el código máquina de un programa a veces puede ser decompiled con el fin de hacer su funcionamiento más fácilmente comprensible para los seres humanos. [6]

El profesor de ciencias cognitivas Douglas Hofstadter ha comparado el código de máquina con el código genético , diciendo que "mirar un programa escrito en lenguaje de máquina es vagamente comparable a mirar una molécula de ADN átomo por átomo". [7]

Ver también [ editar ]

  • Lenguaje ensamblador
  • Endianidad
  • Lista de lenguajes de máquina
  • Monitor de código de máquina
  • Código de gastos generales
  • Máquina de código P
  • Pep / 7
  • Computación de conjunto de instrucciones reducido (RISC)
  • Palabra de instrucción muy larga
  • Código de máquina de enseñanza: Micro-Professor MPF-I

Notas y referencias [ editar ]

  1. ^ Como muchas versiones de BASIC , especialmente las primeras, así como Smalltalk , MATLAB , Perl , Python , Ruby y otros lenguajes de programación o de propósito especial.
  2. ^ Kjell, Bradley. "Operando Inmediato" .
  3. ^ "Administrado, no administrado, nativo: ¿Qué tipo de código es este?" . developer.com . Consultado el 2 de septiembre de 2008 .
  4. ^ Samuelson, Pamela (septiembre de 1984). "CONTU revisado: el caso contra la protección de los derechos de autor para programas informáticos en forma legible por máquina" . Revista de derecho de Duke . 1984 (4): 663–769. doi : 10.2307 / 1372418 . JSTOR 1372418 . PMID 10268940 .  
  5. ^ "Registro de derechos de autor para programas informáticos" (PDF) . Oficina de derechos de autor de EE. UU. Agosto de 2008 . Consultado el 23 de febrero de 2014 .
  6. ^ "¿Qué es descompilar? - Definición de WhatIs.com" . WhatIs.com . Consultado el 26 de diciembre de 2016 .
  7. ^ D. Hofstadter (1980). "Gödel, Escher, Bach: una eterna trenza dorada": 290. Cite journal requiere |journal=( ayuda )

Lectura adicional [ editar ]

  • Hennessy, John L .; Patterson, David A. (1994). Organización y Diseño de Computadores. La interfaz de hardware / software . Editores Morgan Kaufmann. ISBN 1-55860-281-X.
  • Tanenbaum, Andrew S. (1999). Organización informática estructurada . Prentice Hall. ISBN 0-13-020435-8.
  • Brookshear, J. Glenn (2007). Ciencias de la computación: una descripción general . Addison Wesley. ISBN 978-0-321-38701-1.