Código de ensamble vs Código de máquina vs Código de objeto?

¿Cuál es la diferencia entre código de objeto, código de máquina y código de ensamblaje?

¿Puedes dar un ejemplo visual de su diferencia?

El código de máquina es un código binario (1 y 0) que puede ser ejecutado directamente por la CPU. Si abriera un archivo de código máquina en un editor de texto, vería basura, incluidos caracteres no imprimibles (no, no esos caracteres no imprimibles;)).

El código de objeto es una parte del código de máquina que aún no se ha vinculado a un progtwig completo. Es el código de máquina para una biblioteca o módulo en particular que conformará el producto terminado. También puede contener marcadores de posición o desplazamientos que no se encuentran en el código de máquina de un progtwig completo. El vinculador utilizará estos marcadores de posición y desplazamientos para conectar todo junto.

El código de ensamblaje es de texto sin formato y (algo) de código fuente de lectura humana que en su mayoría tiene un análogo directo de 1: 1 con instrucciones de la máquina. Esto se logra utilizando mnemónicos para las instrucciones reales, registros u otros recursos. Los ejemplos incluyen JMP y MULT para las instrucciones de salto y multiplicación de la CPU. A diferencia del código de máquina, la CPU no comprende el código de ensamblaje. Convierta código ensamblador a máquina con el uso de un ensamblador o un comstackdor , aunque generalmente pensamos en comstackdores asociados con lenguaje de progtwigción de alto nivel que se abstraen más de las instrucciones de la CPU.

Crear un progtwig completo implica escribir el código fuente para el progtwig en ensamblador o en un lenguaje de nivel superior como C ++. El código fuente se ensambla (para código ensamblador) o se comstack (para idiomas de nivel superior) con código objeto, y los módulos individuales se vinculan para convertirse en el código máquina para el progtwig final. En el caso de progtwigs muy simples, el paso de enlace puede no ser necesario. En otros casos, como con un IDE (entorno de desarrollo integrado), el enlazador y el comstackdor pueden invocarse juntos. En otros casos, se puede usar un script de comstackción complicado o un archivo de solución para decirle al entorno cómo crear la aplicación final.

También hay idiomas interpretados que se comportan de manera diferente. Los idiomas interpretados se basan en el código máquina de un progtwig especial de intérpretes. En el nivel básico, un intérprete analiza el código fuente e inmediatamente convierte los comandos a un nuevo código máquina y los ejecuta. Los intérpretes modernos, a veces también llamados entornos de tiempo de ejecución o máquinas virtuales , son mucho más complicados: evalúan secciones enteras de código fuente a la vez, almacenan en caché y optimizan cuando sea posible, y manejan tareas complejas de administración de memoria. Un lenguaje interpretado también puede precomstackrse a un lenguaje intermedio de bajo nivel o código de bytes, similar al código de ensamblaje.

Las otras respuestas dieron una buena descripción de la diferencia, pero también pidió una visual. Aquí hay un diagtwig que muestra que viajan desde el código C a un ejecutable.

El código de ensamblaje es una representación legible por humanos del código de máquina:

 mov eax, 77 jmp anywhere 

El código de máquina es código hexadecimal puro:

 5F 3A E3 F1 

Supongo que te refieres al código objeto como en un archivo objeto. Esta es una variante del código de máquina, con la diferencia de que los saltos se parametrizan de manera que un enlazador puede completarlos.

Un ensamblador se utiliza para convertir código ensamblador en código máquina (código objeto) Un enlazador vincula varios archivos de objetos (y bibliotecas) para generar un archivo ejecutable.

Una vez escribí un progtwig ensamblador en hexadecimal puro (no hay ensamblador disponible) afortunadamente, esto se remontó al antiguo (antiguo) 6502. Pero me alegro de que haya ensambladores para los códigos de operación del pentium.

8B 5D 32 es código de máquina

mov ebx, [ebp+32h] es ensamblado

lmylib.so contiene 8B 5D 32 es código objeto

Un punto aún no mencionado es que hay algunos tipos diferentes de código de ensamblaje. En la forma más básica, todos los números utilizados en las instrucciones deben especificarse como constantes. Por ejemplo:

 $ 1902: BD 37 14: LDA $ 1437, X
 $ 1905: 85 03: STA $ 03
 $ 1907: 85 09: STA $ 09
 $ 1909: CA: DEX
 $ 190A: 10: BPL $ 1902

El bit de código anterior, si se almacena en la dirección $ 1900 en un cartucho Atari 2600, mostrará una cantidad de líneas en diferentes colores que se obtienen de una tabla que comienza en la dirección $ 1437. En algunas herramientas, escribir una dirección, junto con la parte más a la derecha de la línea anterior, almacena en la memoria los valores que se muestran en la columna del medio, y comienza la siguiente línea con la siguiente dirección. Escribir código en esa forma era mucho más conveniente que escribir en hexadecimal, pero había que saber las direcciones precisas de todo.

La mayoría de los ensambladores le permiten a uno usar direcciones simbólicas. El código anterior se escribiría más como:

 rainbow_lp:
   lda ColorTbl, x
   sta WSYNC
   sta COLUBK
   dex
   bpl rainbow_lp

El ensamblador ajustaba automáticamente la instrucción LDA para que hiciera referencia a la dirección asignada a la etiqueta ColorTbl. El uso de este estilo de ensamblador hace que escribir y editar código sea mucho más fácil de lo que sería posible si se tuviera que pulsar la tecla de la mano y mantener manualmente todas las direcciones.

El código de ensamblado se trata aquí .

“Un lenguaje ensamblador es un lenguaje de bajo nivel para la progtwigción de computadoras. Implementa una representación simbólica de los códigos de máquina numéricos y otras constantes necesarias para progtwigr una architecture de CPU particular”.

El código de la máquina se discute aquí .

“El código de máquina o el lenguaje de máquina es un sistema de instrucciones y datos ejecutados directamente por la unidad de procesamiento central de una computadora”.

Básicamente, el código de ensamblador es el lenguaje y se traduce al código objeto (el código nativo que ejecuta la CPU) por un ensamblador (análogo a un comstackdor).

Creo que estas son las principales diferencias

  • legibilidad del código
  • controlar qué está haciendo tu código

La legibilidad puede hacer que el código sea mejorado o sustituido 6 meses después de su creación con un esfuerzo mínimo; por otro lado, si el rendimiento es crítico, puede utilizar un lenguaje de bajo nivel para apuntar al hardware específico que tendrá en producción, para obtener ejecución más rápida.

Hoy, las computadoras de IMO son lo suficientemente rápidas como para permitir que un progtwigdor obtenga una ejecución rápida con OOP.

El ensamblaje son términos descriptivos breves que los humanos pueden entender que se pueden traducir directamente al código máquina que realmente usa una CPU.

Mientras que es algo comprensible para los humanos, Assembler aún es de bajo nivel. Se necesita mucho código para hacer algo útil.

Entonces, en su lugar, utilizamos lenguajes de nivel superior, como C, BASIC, FORTAN (OK, sé que he salido conmigo). Cuando se comstackn, producen código objeto. Los primeros idiomas tenían el lenguaje de máquina como su código objeto.

En la actualidad, muchos idiomas, como JAVA y C #, comstackn en un bytecode que no es un código de máquina, sino uno que se puede interpretar fácilmente en tiempo de ejecución para producir código de máquina.