Codigo de maquina

Código de máquina ( código orientado a la plataforma ), lenguaje de máquina  : un sistema de comandos (un conjunto de códigos de operación) de una computadora en particular , que es interpretado directamente por el procesador o firmware de esta computadora. [una]

Un programa de computadora escrito en lenguaje de máquina consta de instrucciones de máquina , cada una de las cuales está representada en código de máquina en forma de un llamado. opcode  - el código binario de una sola operación del sistema de comando de la máquina. Por conveniencia de programación , en lugar de códigos de operación numéricos, que solo son entendidos por el procesador, generalmente se usan sus mnemotécnicos alfabéticos condicionales . Un conjunto de tales mnemotécnicos, junto con algunas características adicionales (por ejemplo, algunas macros, directivas ), se denomina lenguaje ensamblador .

Cada modelo de procesador tiene su propio conjunto de instrucciones, aunque en muchos modelos estos conjuntos de instrucciones se superponen en gran medida. Se dice que el procesador A es compatible con el procesador B si el procesador A "entiende" completamente el código de máquina del procesador B. Si los procesadores A y B tienen algún subconjunto de instrucciones para las cuales son compatibles entre sí, se dice que tienen la misma "arquitectura" (tienen la misma arquitectura de conjunto de instrucciones ).

Instrucción de máquina

Cada instrucción de máquina realiza una acción específica, como una operación sobre datos (por ejemplo, agregar o copiar una palabra de máquina en un registro o en memoria ) o saltar a otra pieza de código (cambiar el orden de ejecución; en este caso, el el salto puede ser incondicional o condicional , dependiendo de los resultados de las instrucciones anteriores). Cualquier programa ejecutable consta de una secuencia de tales operaciones de máquinas atómicas.

Las operaciones escritas como una sola instrucción de máquina se pueden dividir en "simples" ( operaciones elementales ) y "complejas". Además, la mayoría de los procesadores modernos consisten en "actuadores" separados: unidades informáticas que pueden realizar solo un conjunto limitado de operaciones simples. Cuando se ejecuta la siguiente instrucción, un bloque especial del procesador, el decodificador, la traduce (decodifica) en una secuencia de operaciones elementales entendidas por dispositivos ejecutivos específicos.

La arquitectura del conjunto de instrucciones del procesador determina qué operaciones puede realizar y qué instrucciones de máquina corresponden a qué códigos de operación numéricos ( códigos de operación). Los códigos de operación tienen una longitud constante (para arquitecturas RISC , MISC ) y rango (para arquitecturas CISC ; por ejemplo: para la arquitectura x86 , el comando tiene una longitud de 8 a 120 bits).

Los procesadores superescalares modernos son capaces de ejecutar múltiples instrucciones de máquina en un solo ciclo de reloj .

Código máquina como lenguaje de programación

El código de máquina se puede ver como un lenguaje de programación primitivo o como la representación de nivel más bajo de programas de computadora compilados o ensamblados . Aunque es posible escribir programas directamente en código de máquina, ahora rara vez se hace debido a la complejidad del código y la laboriosidad de administrar manualmente los recursos del procesador, excepto en situaciones donde se requiere una optimización extrema . Por lo tanto, la gran mayoría de los programas están escritos en lenguajes de alto nivel y traducidos a código máquina por los compiladores . El código de máquina a veces se denomina código nativo (también llamado código nativo ) cuando se habla de partes específicas de la plataforma de un lenguaje o  bibliotecas . [2] 

Los programas en lenguajes interpretados (como Basic o Python ) no se traducen a código de máquina; en cambio, son ejecutados directamente por el intérprete de lenguaje o traducidos a pseudocódigo ( código de bytes ). Sin embargo, los intérpretes de estos lenguajes (que en sí mismos pueden considerarse como procesadores) generalmente se representan en código de máquina.

Microcódigo

En algunas arquitecturas informáticas , el soporte para el código de máquina lo proporciona una capa de programas de nivel aún más bajo llamada firmware . Esto hace posible proporcionar una sola interfaz de lenguaje de máquina para toda la línea o familia de computadoras, que pueden tener diferencias estructurales significativas entre sí, y facilita la transferencia de programas en código de máquina entre diferentes modelos de computadora. Un ejemplo de este enfoque es la familia de computadoras IBM System/360 y sus sucesores: a pesar de los diferentes buses de 8 a 64 bits y superiores, comparten una arquitectura común a nivel de lenguaje de máquina.

El uso de una capa de microcódigo para implementar un emulador permite que una computadora represente la arquitectura de una computadora completamente diferente. En la línea System/360, esto se usó para transferir programas de máquinas anteriores de IBM a la nueva familia, por ejemplo, el emulador IBM 1401/1440/1460 en IBM S/360 modelo 40.

Código absoluto e independiente de la posición

Código absoluto ( código absoluto en inglés  ) - código de programa adecuado para la ejecución directa por parte del procesador [1] , es decir, código que no requiere procesamiento adicional (por ejemplo, resolución de enlaces entre diferentes partes del código o vinculación a direcciones en la memoria, generalmente realizado por el cargador de programas ). Ejemplos de código absoluto son archivos ejecutables en formato .COM y un cargador de sistema operativo ubicado en el MBR . A menudo, el código absoluto se entiende en un sentido más estricto como código dependiente de la posición (es decir, código vinculado a direcciones de memoria específicas).

El código independiente de la posición es un programa  que se puede colocar en cualquier área de la memoria, ya que todas las referencias a las celdas de memoria que contiene son relativas (por ejemplo, relativas al contador del programa ). Dicho programa se puede mover a otra área de la memoria en cualquier momento, a diferencia de un programa reubicable , que, aunque se puede cargar en cualquier área de la memoria, debe permanecer en el mismo lugar después de la carga. [una]

La capacidad de crear código independiente de la posición depende de la arquitectura y el conjunto de instrucciones de la plataforma de destino. Por ejemplo, si todas las instrucciones de salto en un conjunto de instrucciones deben especificar direcciones absolutas, entonces el código que requiere saltos es casi imposible de hacer independiente de la posición. En la arquitectura x86 , el direccionamiento directo en las instrucciones de datos está representado solo por direcciones absolutas, pero dado que las direcciones de datos se consideran relativas al registro de segmento , que se puede cambiar en cualquier momento, esto le permite crear código independiente de la posición con su propia memoria. ubicaciones para datos. Además, algunas restricciones del conjunto de instrucciones se pueden eliminar con código automodificable o secuencias de instrucciones no triviales.

Programa "¡Hola, mundo!"

¡Hola mundo! » para un procesador x86 ( MS DOS , la salida mediante la interrupción del BIOS int 10h) es la siguiente (en notación hexadecimal ):

BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21

Este programa funciona cuando se coloca en el desplazamiento 100 16 . Las instrucciones individuales están resaltadas en color:

El mismo código en los comandos del ensamblador :

XXXX:0100 mov bx, 0111h  ; poner en bx el desplazamiento de la cadena HW XXXX:0103 mov cx, 000Dh  ; poner en cx la longitud de la cadena HW XXXX:0106 mov ah, 0Eh  ; poner en ah la función de interrupción número 10h XXXX:0108 mov al, [bx]  ; poner en al el valor de la ubicación de memoria cuya dirección está en bx XXXX:010A inc bx  ; pasar al siguiente byte de la cadena (incrementar el desplazamiento en 1) XXXX:010B ent 10h  ; interrumpir llamada 10h XXXX:010D bucle 0108  ; disminuya cx en 1 y si resultado≠0, salte a la dirección 0108 XXXX:010F ent 20h  ; interrupción 20h: terminar programa XXXX:0111 HW db '¡Hola, mundo!'  ; la cadena a imprimir

Véase también

Notas

  1. 1 2 3 Diccionario Explicativo de Sistemas de Computación = Diccionario de Computación / Ed. V. Illingworth y otros: Per. De inglés. A. K. Belotsky y otros; ed. E. K. Maslovsky. - M. : Mashinostroenie, 1990. - 560 p. - 70.000 copias (adicionales).  - ISBN 5-217-00617-X (URSS), ISBN 0-19-853913-4 (Reino Unido).
  2. Kate Gregory. Administrado, no administrado, nativo: ¿qué tipo de código es este? (28 de abril de 2003). Consultado el 27 de marzo de 2012. Archivado desde el original el 30 de mayo de 2012.