Programación

El lenguaje ensamblador ("assembler" o assembly language en inglés, también la abreviatura asm) es un lenguaje de programación de bajo nivel. Consiste en un conjunto de mnemónicos que representan instrucciones soportadas por computadoras, microprocesadores, microcontroladores y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura de procesador. En este lenguaje, cada línea de código asm se traduce exactamente en una instrucción máquina ejecutada por el hardware subyacente (procesador o CPU).

El lenguaje ensamblador refleja directamente la arquitectura e instrucciones de una CPU, y pueden ser muy diferentes de una arquitectura de CPU a otra. Cada arquitectura de microprocesador tiene su propio set de instrucciones, y en consecuencia su propio lenguaje ensamblador ya que este se encuentra muy ligado a la estructura del hardware para el cual se programa.

A diferencia de un lenguaje de programación de alto nivel, cuando se escriben programas en lenguaje ensamblador se carece de librerías o cualquier otro tipo de ayuda. Sólo se dispone del conjunto de instrucciones provistas por el procesador (CPU) y las llamadas al sistema operativo (funciones implementadas por el sistema operativo, en este caso Linux). Por lo tanto, para programar en lenguaje ensamblador se debe tener a mano tanto el set de instrucciones destino como la tabla de syscalls del kernel.

Para el caso de las arquitecturas x86 y amd64 existen diferentes ensambladores y sintaxis dependiendo del fabricante. Hay dos principales ramas en cuanto a sintaxis se refiere: Intel y AT&T. Se diferencian principalmente en el orden de los operandos, especificación de tamaños de parámetros, valores inmediatos y direcciones efectivas. No va al caso de este artículo hacer una explicación detallada de ambas sintaxis, sino que dejo varios enlaces interesantes al final del mismo. La sintaxis Intel es la más popular y algunos ensambladores que la utilizan son NASM, YASM, FASM, MASM, TASM y GAS.

Este artículo demuestra el proceso de ensamblado y linkeado de un programa en lenguaje Yasm utilizando el ensamblador yasm y el linker ld desde línea de comandos en GNU/Linux para las arquitecturas x86 y amd64. No se trata de un tutorial de programación en lenguaje ensamblador en sí, aunque se dejan buenos tutoriales en la sección de referencias.

El utilitario size permite listar los tamaños de las secciones de un archivo binario ejecutable pasado como parámetro, junto con su tamaño total. De esta forma es posible comprender cuánta memoria será utilizada al ejecutar el binario y a su vez examinar cómo está compuesto un ejecutable: cuánta memoria se dedica a datos inicializados; cuánta se utiliza para instrucciones; y cuánta se utiliza para variables o espacio para datos no inicializados.

Este artículo explica cómo instalar el intérprete de Ruby desde los fuentes en GNU/Linux. Esto puede ser útil cuando se requiere de una versión específica del lenguaje, la cual no coincide con la disponible desde paquete.

En los sistemas Unix, el utilitario install permite copiar archivos binarios a sus ubicaciones definitivas, lo que se conoce popularmente como "instalar". Este artículo demuestra su uso básico y opciones.

La semana pasada, la persona que administra la plataforma Moodle vino a reclamar que (según la opinión/reclamo de un luser) los mensajes de Moodle no estaban llegando. Veamos si esto es cierto haciendo una pequeña incursión a la base de datos de Moodle (PostgreSQL).