Soy un programador ‘C’ con más de 15 años de experiencia en programación en Kernel / Embedded Systems. Sin embargo, encuentro la asamblea intimidante. ¿Eso es normal?

Assembler Language es lo más parecido a Machine Language, ya que los comandos se ensamblan uno por uno en los códigos de operación de Machine Language. C es en realidad una abstracción de nivel ligeramente superior, ya que muchas declaraciones C se convierten en múltiples códigos de operación. Sin embargo, C es extremadamente compacto y ha sido altamente optimizado a lo largo de los años.

Con ese poco de experiencia, no hay nada inusual en sentirse intimidado al aprender algo nuevo, ya sea un lenguaje de programación o cocinar cocina francesa. Con su experiencia en C, sin embargo, usted ya comprende cómo funcionan los programas de computadora; Esta es una gran ventaja cuando se trata de aprender un nuevo idioma.

Otra cosa a tener en cuenta es que Assembler Language no es portátil. Las instrucciones del ensamblador para una familia de procesadores no serán las mismas que las de otra familia de procesadores. Los procesadores de la familia X86 no tienen el mismo conjunto de instrucciones que la antigua familia de procesadores 68000.

Gracias por el A2A.

Hoy, la programación en lenguajes ensambladores es terrible para cualquiera. Los viejos tiempos se habían ido para siempre cuando los ingenieros usaban el ensamblaje para escribir un programa completo completo, por ejemplo, se decía que el compilador de supercomputadora de la unidad central de los CDC estaba escrito completamente en su ensamblaje. Hoy en día, aún se necesita el ensamblaje, pero se usa de manera muy limitada incluso para los ingenieros de compilación que aún deben comprender cada código de máquina.

El ingeniero de hoy casi nunca necesita escribir un gran programa en ensamblaje, casi nunca necesita usar ensamblaje en estructuras de datos complejas, tipos de datos como números flotantes y números de matriz / vector, casi nunca necesita usar el ensamblaje para hacer asignaciones de registros y programación de instrucciones, Casi nunca es necesario utilizar el ensamblaje para realizar optimizaciones a nivel de instrucción. Los compiladores de lenguaje de programación de alto nivel pueden hacer un trabajo mucho mejor.

Sin embargo, todavía usamos ocasionalmente ensamblaje, pero solo limitado a escribir piezas de código muy pequeñas, como configurar el hardware de la CPU en el arranque del sistema, configurar / modificar / monitorear ciertas piezas de hardware en el sistema (como MMU, cachés, coprocesadores ops, etc.) pero en su mayoría solo se encuentran en unas pocas líneas de código de ensamblaje en las funciones API de bajo nivel más bajas. En casos muy raros, en algunos procesadores y dispositivos personalizados, se utilizan pequeñas funciones en el ensamblaje para optimizar algunos casos especiales, por ejemplo, en el kernel de Linux, hay algunas pequeñas funciones en el ensamblaje para transferir un bloque de datos desde la tarjeta SCSI Acorn a la memoria (dudo que sea realmente necesario en el ensamblaje allí – [1]). Una vez que un ingeniero comprende los fundamentos de la arquitectura de la CPU y las interfaces de hardware, con una cantidad razonable de posibilidades de practicar, la programación en ensamblaje ocasionalmente en pequeños códigos no resulta tan intimidante. Comprender los conceptos básicos del código de ensamblaje también puede ayudar a solucionar problemas de errores ocultos profundos, especialmente cuando solo está disponible el código de desmontaje.

[1] Más del código de ensamblaje x86 del kernel de Linux se reescribe en C

Mi 2c.

EDITAR 1: actualizado al agregar un ejemplo de uso de ensamblaje

EDIT 2: agregué una referencia [1] para mi afirmación de que realmente no se necesita mucho código de ensamblaje.

EDIT 3: solo quiero vincular mi respuesta a otra pregunta interesante de Quora relacionada ¿Cuánto podríamos optimizar un programa escribiéndolo en ensamblador? Parece que todavía es discutible cuánto debemos pagar nuestro esfuerzo para usar el ensamblaje para optimizar algún código. Mi opinión es que la posibilidad es cada vez menor cuando las arquitecturas modernas de CPU se vuelven más eficientes y más complicadas. Por ejemplo, casi no hay posibilidad de que el código de ensamblaje codificado manual se ejecute más rápido que un código optimizado generado por el compilador en un procesador con VLIW, canalización profunda, problema de múltiples instrucciones y múltiples arquitecturas de acceso a memoria pendientes debido a la vinculación de instrucciones manuales o manual La programación de instrucciones para ocultar las burbujas de retardo de instrucciones es muy difícil a mano.

Para mí, la CPU de gama alta y la arquitectura de memoria virtual en modo protegido agrega un poco de intimidación, seguro. Está muy lejos de los viejos tiempos de MSDOS o microcontroladores de 8 bits. Afortunadamente, casi nunca es necesario, tampoco. El aspecto más valioso del ensamblador de aprendizaje es la comprensión que obtienes sobre lo que realmente sucede cuando compilas código. Cualquiera que haya realizado la programación del ensamblador no debería tener problemas para comprender conceptos como los punteros en C o el uso de una pila para pasar parámetros y variables locales.

No es tan difícil de aprender: comience con programas simples en el espacio del usuario, familiarícese con las instrucciones del ensamblador y las instrucciones comunes en su CPU.

Las habilidades de ensamblador más útiles para conocer como desarrollador de sistemas integrados es cómo interoperan las rutinas de ensamblador y C Los programas C requieren un poco de código ensamblador, llamado crt0, para funcionar. Eche un vistazo al Crt0.S para su entorno de desarrollo actual, revíselo línea por línea, hasta que lo entienda.