Articulo de referencia

Código máquina

Monitor de lenguaje máquina ejecutándose en un microprocesador W65C816S , que muestra el desensamblaje del código y volcados de los registros y la memoria del procesador. En inf...

Monitor de lenguaje máquina ejecutándose en un microprocesador W65C816S , que muestra el desensamblaje del código y volcados de los registros y la memoria del procesador.

En informática , el código máquina es un código de datos codificado y estructurado para controlar la unidad central de procesamiento (CPU) de una computadora a través de su interfaz programable . Un programa de computadora consiste principalmente en secuencias de instrucciones de código máquina. [ 1 ] El código máquina se clasifica como nativo con respecto a su CPU anfitriona, ya que es el lenguaje que la CPU interpreta directamente. [ 2 ] Algunos intérpretes de software traducen el lenguaje de programación que interpretan a un código de máquina virtual ( bytecode ) y lo procesan con una máquina de código P.

Una instrucción en código máquina hace que la CPU realice una tarea específica, como por ejemplo:

La arquitectura del conjunto de instrucciones (ISA) define la interfaz de una CPU y varía según las agrupaciones o familias de diseño de CPU, como x86 y ARM . Generalmente, el código máquina compatible con una familia no lo es con otras, aunque existen excepciones. La arquitectura VAX incluye soporte opcional para el conjunto de instrucciones PDP-11 . La arquitectura IA-64 incluye soporte opcional para el conjunto de instrucciones IA-32 . Además, el PowerPC 615 puede procesar de forma nativa instrucciones tanto de PowerPC como de x86.

lenguaje ensamblador

Traducción del lenguaje ensamblador a código máquina.

El lenguaje ensamblador proporciona una correspondencia relativamente directa entre el código fuente legible por humanos y el código máquina. El código fuente en lenguaje ensamblador representa códigos numéricos en código máquina, como mnemónicos y etiquetas. [ 3 ] Por ejemplo, en ensamblador para un procesador x86 , representa el código de operación de la arquitectura x86 0x90 en código máquina. Si bien es posible escribir un programa en código máquina, hacerlo es tedioso y propenso a errores. Por lo tanto, los programas generalmente se escriben en ensamblador o, más comúnmente, en un lenguaje de programación de alto nivel .NOP

Conjunto de instrucciones

Una instrucción de máquina codifica una operación como un patrón de bits basado en el formato especificado para el conjunto de instrucciones de la máquina. [ nb 1 ] [ 4 ]

Los conjuntos de instrucciones difieren de diversas maneras. Las instrucciones de un conjunto pueden tener todas la misma longitud o diferentes instrucciones pueden tener longitudes distintas; pueden ser más pequeñas, del mismo tamaño o más grandes que el tamaño de palabra de la arquitectura. El número de instrucciones puede ser relativamente pequeño o grande. Las instrucciones pueden o no tener que estar alineadas con límites de memoria específicos, como el límite de palabra de la arquitectura. [ 4 ]

Un conjunto de instrucciones debe ejecutar los circuitos del nivel lógico digital de una computadora . En el nivel digital, el programa debe controlar los registros, el bus, la memoria, la ALU y otros componentes de hardware de la computadora. [ 5 ] Para controlar las características arquitectónicas de una computadora , se crean instrucciones de máquina. Ejemplos de características que se controlan mediante instrucciones de máquina:

Los criterios para los formatos de instrucción incluyen:

Determinar el tamaño del campo de direcciones implica elegir entre espacio y velocidad. [ 9 ] En algunos ordenadores, el número de bits en el campo de direcciones puede ser demasiado pequeño para acceder a toda la memoria física. Además, es necesario considerar el espacio de direcciones virtuales . Otra limitación puede ser el tamaño de los registros utilizados para construir la dirección. Si bien un campo de direcciones más corto permite que las instrucciones se ejecuten más rápidamente, es necesario considerar otras propiedades físicas al diseñar el formato de las instrucciones.

Las instrucciones se pueden clasificar en dos tipos: de propósito general y de propósito específico. Las instrucciones de propósito específico aprovechan características arquitectónicas únicas de una computadora. Las instrucciones de propósito general controlan características arquitectónicas comunes a todas las computadoras. [ 10 ]

Control de instrucciones de uso general:

  • Movimiento de datos de un lugar a otro
  • Operaciones monádicas que tienen un operando para producir un resultado.
  • Operaciones diádicas que tienen dos operandos para producir un resultado.
  • Comparaciones y saltos condicionales
  • Llamadas a procedimientos
  • Control de bucle
  • Entrada/salida

Instrucciones superpuestas

En arquitecturas de procesadores con conjuntos de instrucciones de longitud variable [ 11 ] (como la familia de procesadores x86 de Intel ), dentro de los límites del fenómeno de resincronización del flujo de control conocido como conteo de Kruskal , [ 12 ] [ 11 ] [ 13 ] [ 14 ] [ 15 ] a veces es posible, mediante programación a nivel de código de operación, organizar deliberadamente el código resultante de manera que dos rutas de código compartan un fragmento común de secuencias de código de operación. [ nb 2 ] Estos se denominan instrucciones superpuestas , códigos de operación superpuestos , código superpuesto , código superpuesto , escisión de instrucciones o salto en medio de una instrucción . [ 16 ] [ 17 ] [ 18 ]

En las décadas de 1970 y 1980, a veces se utilizaban instrucciones superpuestas para preservar el espacio de memoria. Un ejemplo fue la implementación de tablas de errores en Altair BASIC de Microsoft , donde las instrucciones intercaladas compartían mutuamente sus bytes de instrucción. [ 19 ] [ 11 ] [ 16 ] Esta técnica rara vez se utiliza hoy en día, pero aún podría ser necesario recurrir a ella en áreas donde se requiere una optimización extrema del tamaño a nivel de byte, como en la implementación de cargadores de arranque que deben caber en sectores de arranque . [ nb 3 ]

También se utiliza a veces como técnica de ofuscación de código como medida contra el desensamblaje y la manipulación. [ 11 ] [ 14 ]

El principio también se utiliza en secuencias de código compartido de binarios pesados ​​que deben ejecutarse en múltiples plataformas de procesadores incompatibles en cuanto al conjunto de instrucciones. [ nb 2 ]

Esta propiedad también se utiliza para encontrar instrucciones no deseadas llamadas gadgets en repositorios de código existentes y se utiliza en la programación orientada a retorno como alternativa a la inyección de código para exploits como ataques de retorno a libc . [ 20 ] [ 11 ]

Microcódigo

En algunos ordenadores, el código máquina de la arquitectura se implementa mediante una capa subyacente aún más fundamental llamada microcódigo , que proporciona una interfaz de lenguaje máquina común para una línea o familia de diferentes modelos de ordenadores con flujos de datos subyacentes muy diferentes . Esto se hace para facilitar la portabilidad de programas en lenguaje máquina entre diferentes modelos. [ 21 ] Un ejemplo de este uso es la familia de ordenadores IBM System/360 y sus sucesores. [ 22 ]

Ejemplos

IBM 650

Un aula de instituto de 1960 con una tabla de códigos de instrucciones de la IBM 650 encima de la pizarra, en la parte superior derecha.
Programa estudiantil de 1961 escrito en lenguaje máquina IBM 650, basado en un ejercicio de un libro de texto.

La IBM 650 , presentada en 1954, era una computadora decimal con direccionamiento por palabras, cuyas instrucciones y datos se almacenaban en un tambor magnético. Cada palabra constaba de diez dígitos más un signo. Las instrucciones dividían las palabras en un código de operación de dos dígitos, una dirección de cuatro dígitos de la palabra de datos a procesar y una dirección de cuatro dígitos de la siguiente instrucción a ejecutar. La segunda dirección permitía colocar las instrucciones en el tambor cerca de la posición que ocuparía tras la finalización de la instrucción anterior, una práctica denominada optimización. [ 23 ]

Con la ayuda de una tabla física de códigos de operación, era perfectamente factible escribir programas en código máquina. IBM proporcionó un formulario con una cuadrícula que mostraba cada ubicación de memoria, de modo que el programador pudiera controlar qué ubicaciones seguían disponibles. Existía un formato de una instrucción por tarjeta que podía cargarse directamente en la máquina y ejecutarse. Posteriormente, IBM introdujo un ensamblador (SOAP) que permitía el direccionamiento simbólico y también realizaba una optimización básica.

IBM 709x

Los procesadores IBM 704, 709, 704x y 709x almacenan una instrucción en cada palabra de instrucción; IBM numera el bit desde la izquierda como S, 1, ..., 35. La mayoría de las instrucciones tienen uno de dos formatos:

Genérico
S,1-11
Bandera 12-13, ignorada en algunas instrucciones.
14-17 sin usar
Etiqueta 18-20
21-35 años
Control de registro de índice, distinto de TSX
Código de operación S,1-2
3-17 Decremento
Etiqueta 18-20
21-35 años

Excepto en los modelos IBM 7094 y 7094 II, existen tres registros de índice denominados A, B y C. La indexación con múltiples bits 1 en la etiqueta resta la operación OR lógica de los registros de índice seleccionados, mientras que la carga con múltiples bits 1 en la etiqueta carga todos los registros de índice seleccionados. Los modelos 7094 y 7094 II disponen de siete registros de índice, pero al encenderse se encuentran en modo de etiquetas múltiples , en el que solo utilizan tres de ellos de forma compatible con máquinas anteriores, y requieren una instrucción de salida del modo de etiquetas múltiples ( LMTM ) para acceder a los otros cuatro registros de índice.

La dirección efectiva es normalmente YC(T), donde C(T) es 0 para una etiqueta de 0, la operación OR lógica de los registros de índice seleccionados en modo de etiquetas múltiples o el registro de índice seleccionado si no se está en modo de etiquetas múltiples. Sin embargo, la dirección efectiva para las instrucciones de control de registros de índice es simplemente Y.

Una bandera con ambos bits en 1 selecciona el direccionamiento indirecto; la palabra de dirección indirecta tiene tanto una etiqueta como un campo Y.

Además de las instrucciones de transferencia (salto), estas máquinas tienen instrucciones de salto que omiten condicionalmente una o dos palabras, por ejemplo, la instrucción Compare Accumulator with Storage (CAS) realiza una comparación de tres vías y salta condicionalmente a NSI, NSI+1 o NSI+2, dependiendo del resultado.

MIPS

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

rs , rt y rd indican operandos de registro; shamt proporciona una cantidad de desplazamiento; y los campos de dirección o inmediato contienen un operando directamente. [ 24 ] : 299–301

Por ejemplo, sumar los registros 1 y 2 y colocar el resultado en el registro 6 se codifica como: [ 24 ] : 554

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

Cargar 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: [ 24 ] : 552

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

Saltando a la dirección 1024: [ 24 ] : 552

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

Código de bytes

El código máquina es similar al código de bytes , pero fundamentalmente diferente . Al igual que el código máquina, el código de bytes se genera normalmente (por ejemplo, mediante un compilador) a partir del código fuente. Sin embargo, a diferencia del código máquina, el código de bytes no es directamente ejecutable por una CPU. Una excepción se da cuando un procesador está diseñado para usar el código de bytes como su código máquina, como el Pascal MicroEngine o un procesador Java . Si el código de bytes es procesado por un intérprete de software, entonces ese intérprete es una máquina virtual para la cual el código de bytes es su código máquina.

Almacenamiento

Durante la ejecución, el código máquina generalmente se almacena en la RAM, aunque algunos dispositivos admiten la ejecución desde la ROM. En cualquier caso, el código también puede almacenarse en una memoria más especializada para mejorar el rendimiento. Puede haber diferentes cachés para instrucciones y datos, según la arquitectura. [ 25 ]

Desde el punto de vista de un proceso , el código máquina reside en el espacio de código , una parte designada de su espacio de direcciones . En un entorno multihilo , diferentes hilos de un mismo 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. [ 26 ]

Legibilidad

Generalmente se considera que el código máquina no es legible para los humanos, [ 27 ] y Douglas Hofstadter lo compara con examinar los átomos de una molécula de ADN . [ 28 ] Sin embargo, existen diversas herramientas y métodos que ayudan a comprender el código máquina.

El desensamblaje decodifica el código máquina a lenguaje ensamblador, lo cual es posible ya que las instrucciones de ensamblador a menudo se pueden mapear uno a uno a las instrucciones máquina. [ 29 ]

Un descompilador convierte el código máquina a un lenguaje de alto nivel , pero el resultado puede ser relativamente difícil de entender.

Un programa puede asociarse con símbolos de depuración (ya sea integrados en el ejecutable nativo o en un archivo aparte) que permiten mapearlo a código fuente externo. Un depurador lee los símbolos para ayudar al programador a depurar el programa de forma interactiva. Algunos ejemplos son:

Véase también

Notas

  1. En las primeras máquinas decimales , patrones de caracteres, dígitos y signo de dígito
  2. 1 2 Si bien las instrucciones superpuestas en arquitecturas de procesadores con conjuntos de instrucciones de longitud variable a veces se pueden organizar para fusionar diferentes rutas de código en una sola a través de la resincronización del flujo de control , el código superpuesto para diferentes arquitecturas de procesadores a veces también se puede diseñar para hacer que las rutas de ejecución se ramifiquen en diferentes direcciones dependiendo del procesador subyacente, como a veces se usa en los binarios fat .
  3. Por ejemplo, los registros de arranque maestro (MBR) y los sectores de arranque de DR-DOS (que también contienen la tabla de particiones y el bloque de parámetros del BIOS , dejando menos de 446y 423 bytes respectivamentepara el código) tradicionalmente podían localizar el archivo de arranque en el sistema de archivos FAT12 o FAT16 por sí mismos y cargarlo en la memoria como un todo, a diferencia de sus contrapartes en MS-DOS y PC DOS , que en cambio dependen de que los archivos del sistema ocupen las dos primeras ubicaciones de entrada de directorio en el sistema de archivos y los tres primeros sectores de IBMBIO.COM se almacenen al comienzo del área de datos en sectores contiguos que contienen un cargador secundario para cargar el resto del archivo en la memoria (lo que requiere que SYS se encargue de todas estas condiciones). Cuandose añadió la compatibilidad con FAT32 y el direccionamiento de bloques lógicos (LBA), Microsoft incluso optó por requerir instrucciones i386 y dividir el código de arranque en dos sectores por razones de tamaño de código, lo cual no era una opción viable para DR-DOS, ya que habría roto la retrocompatibilidad y la compatibilidad cruzada con otros sistemas operativos en escenarios de arranque múltiple y carga en cadena , al igual que con las PC compatibles con IBM PC más antiguas . En cambio, lossectores de arranque de DR-DOS 7.07 recurrieron a código automodificable , programación a nivel de código de operación en lenguaje máquina, utilización controlada de efectos secundarios (documentados) , superposición de datos/código de varios niveles y técnicas de plegado algorítmico para que todo cupiera en un sector físico de solo 512 bytes sin renunciar a ninguna de sus funciones extendidas.

Referencias

  1. Stallings, William (2015). Organización y arquitectura de computadoras, 10.ª edición . Pearson Prentice Hall. pág.  776. ISBN 978-93-325-7040-5.
  2. Gregory, Kate (28 de abril de 2003). "Administrado, no administrado, nativo: ¿Qué tipo de código es este?" . Developer.com . Archivado del original el 23 de septiembre de 2009. Recuperado el 2 de septiembre de 2008 .
  3. Dourish, Paul (2004). Where the Action is: The Foundations of Embodied Interaction . MIT Press . p. 7. ISBN  0-262-54178-5. Consultado el 5 de marzo de 2023 .
  4. 1 2 3 Tanenbaum 1990 , pág. 251 
  5. Tanenbaum 1990 , pág. 162 
  6. Tanenbaum 1990 , pág. 231 
  7. Tanenbaum 1990 , pág. 237 
  8. Tanenbaum 1990 , pág. 236 
  9. 1 2 Tanenbaum 1990 , pág. 253 
  10. Tanenbaum 1990 , pág. 283 
  11. 1 2 3 4 5 Jacob, Matthias; Jakubowski, Mariusz H.; Venkatesan, Ramarathnam [en Wikidata] (20–21 de septiembre de 2007). Hacia la ejecución binaria integral: Implementación de hash opaco mediante codificaciones de instrucciones superpuestas (PDF) . Actas del 9.º taller sobre multimedia y seguridad (MM&Sec '07). Dallas, Texas, EE. UU.: Association for Computing Machinery . págs. 129–140 . CiteSeerX 10.1.1.69.5258 . doi : 10.1145/1288869.1288887 . ISBN   978-1-59593-857-2. S2CID 14174680 . Archivado (PDF) del original el 04-09-2018 . Recuperado el 25-12-2021 . (12 páginas)
  12. Lagarias, Jeffrey "Jeff" Clark ; Rains, Eric Michael ; Vanderbei, Robert J. (2009) [2001-10-13]. "El conteo de Kruskal". En Brams, Stephen; Gehrlein, William V.; Roberts, Fred S. (eds.). Las matemáticas de la preferencia, la elección y el orden . Estudios sobre elección y bienestar. Berlín/Heidelberg, Alemania: Springer-Verlag . págs. 371–391 . arXiv : math/0110143 . doi : 10.1007/978-3-540-79128-7_23 . ISBN  978-3-540-79127-0.(22 páginas)
  13. Andriesse, Dennis; Bos, Herbert [en Wikidata] (10 de julio de 2014). Escrito en la Universidad Libre de Ámsterdam, Ámsterdam, Países Bajos. Dietrich, Sven (ed.). Esteganografía a nivel de instrucción para malware basado en disparadores encubiertos (PDF) . 11.ª Conferencia Internacional sobre Detección de Intrusiones y Malware y Evaluación de Vulnerabilidades (DIMVA). Lecture Notes in Computer Science . Egham, Reino Unido; Suiza: Springer International Publishing . págs. 41–50 [45]. doi : 10.1007/978-3-319-08509-8_3 . eISSN 1611-3349 . ISBN   978-3-31908508-1ISSN 0302-9743 . S2CID 4634611. LNCS 8550. Archivado (PDF) del original el 26 de agosto de 2023. Consultado el 26 de agosto de 2023 .  (10 páginas)
  14. 1 2 Jakubowski, Mariusz H. (febrero de 2016). "Modelo basado en grafos para la protección contra manipulación de software" . Microsoft . Archivado del original el 31 de octubre de 2019. Recuperado el 19 de agosto de 2023 .
  15. Jämthagen, Christopher (noviembre de 2016). Sobre métodos ofensivos y defensivos en seguridad de software (PDF) (Tesis). Lund, Suecia: Departamento de Ingeniería Eléctrica y Tecnologías de la Información, Universidad de Lund . pág. 96. ISBN  978-91-7623-942-1. ISSN 1654-790X . Archivado (PDF) del original el 26-08-2023 . Recuperado el 26-08-2023 . (1+xvii+1+152 páginas)
  16. 1 2 "Instrucciones no deseadas en x86" . Hacker News . 2021. Archivado del original el 25/12/2021 . Recuperado el 24/12/2021 .
  17. ^ Más amable, Johannes (24 de septiembre de 2010). Análisis estático de ejecutables x86 [ Statische Analyse von Programmen in x86 Maschinensprache ] (PDF) (Disertación). Múnich, Alemania: Technische Universität Darmstadt . D17. Archivado desde el original el 12 de noviembre de 2020 . Consultado el 25 de diciembre de 2021 .(199 páginas)
  18. "¿Qué es la ofuscación de "instrucciones superpuestas"?" . Reverse Engineering Stack Exchange . 7 de abril de 2013. Archivado del original el 25 de diciembre de 2021. Consultado el 25 de diciembre de 2021 .
  19. Gates, William "Bill" Henry , Comunicación personal(Nota: Según Jacob et al .)
  20. Shacham, Hovav (2007). La geometría de la carne inocente sobre el hueso: retorno a libc sin llamadas a funciones (en x86) (PDF) . Actas de la ACM, CCS 2007. ACM Press . Archivado (PDF) del original el 15 de diciembre de 2021. Consultado el 24 de diciembre de 2021 .
  21. Kent, Allen; Williams, James G. (5 de abril de 1993). Enciclopedia de Ciencias de la Computación y Tecnología: Volumen 28 - Suplemento 13: Aplicaciones de la Inteligencia Artificial a Estructuras de Árbol . CRC Press. págs. 33–34 . ISBN  978-0-8247-2281-4.
  22. Tucker, SG (31 de diciembre de 1967). "Control de microprogramas para SYSTEM/360" . IBM Systems Journal . 6 (4): 222– 241. doi : 10.1147/sj.64.0222 . ISSN 0018-8670 vía IEEE Xplore. 
  23. Andree, Richard V. (1958). Programación de la computadora de tambor magnético y máquina de procesamiento de datos IBM 650 (PDF) .
  24. 1 2 3 4 5 Harris, David; Harris, Sarah L. (2007). Diseño digital y arquitectura informática . Morgan Kaufmann Publishers . ISBN 978-0-12-370497-9. Consultado el 5 de marzo de 2023 .
  25. Su, Chao; Zeng, Qingkai (2021). "Estudio de los ataques de canal lateral basados ​​en la caché de la CPU: análisis sistemático, modelos de seguridad y contramedidas" . Security and Communication Networks . 2021 (1) 5559552. doi : 10.1155/2021/5559552 . ISSN 1939-0122 . 
  26. "Apuntes de CS 537, Sección #3A: Procesos e hilos" . pages.cs.wisc.edu . Escuela de Ciencias de la Computación, Datos e Información, Universidad de Wisconsin-Madison . Consultado el 18 de julio de 2025 .
  27. Samuelson 1984 , pág. 683.
  28. Hofstadter 1979 , pág. 290 . 
  29. Tanenbaum 1990 , pág. 398 . 
  30. "Arquitectura de datos asociada" . Característica de ensamblador y kit de herramientas de alto nivel .
  31. "Salida de archivo de datos asociado" (PDF) . High Level Assembler for z/OS & z/VM & z/VSE - 1.6 -HLASM Programmer's Guide (PDF) (Octava ed.). IBM . Octubre de 2022. págs. 278–332 . SC26-4941-07 . Consultado el 14 de febrero de 2025 .  
  32. "Contenido del archivo COBOL SYSADATA" . COBOL empresarial para z/OS .
  33. "Información del mensaje SYSADATA" . Información de Enterprise PL/I para z/OS 6.1 . 17 de marzo de 2025.
  34. "Apéndice C. Formato de archivo de objeto generalizado (GOFF)" (PDF) . z/OS - 3.1 - Gestión de programas MVS: Instalaciones avanzadas (PDF) . IBM . 18 de diciembre de 2024. págs. 201–240 . SA23-1392-60 . Consultado el 14 de febrero de 2025 . 
  35. "Símbolos para la depuración de Windows" . Microsoft Learn . 2022-12-20.
  36. "Consulta del archivo .Pdb" . Microsoft Learn . 12 de enero de 2024.

Fuentes

  • Hofstadter, Douglas R. (1979). Gödel, Escher, Bach: Una eterna trenza dorada . Basic Books . ISBN 0-465-02685-0. Consultado el 10 de febrero de 2025 .
  • Samuelson, Pamela (1984). "CONTU Revisited: The Case Against Copyright Protection for Computer Programs in Machine-Readable Form" . Duke Law Journal . 33 (4): 663–769 . doi : 10.2307/1372418 . hdl : hein.journals/duklr1984 . JSTOR 1372418. Recuperado el 10 de febrero de 2025 . 
  • Tanenbaum, Andrew S. (1990). Organización estructurada de computadoras, tercera edición . Prentice Hall. pág . 398. ISBN  978-0-13-854662-5.

Lecturas adicionales