Lenguaje ensamblador


El lenguaje ensamblador o assembler (en inglés: assembler language y la abreviación asm) es un lenguaje de programación que se usa en los microprocesadores. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura de procesador y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. 

Cada arquitectura de procesador tiene su propio lenguaje ensamblador que usualmente es definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que idealmente son portables. 

 

 El opcode y su relación con el lenguaje ensamblador

El lenguaje ensamblador es una representación más legible para los humanos del lenguaje máquina. En vez de usar directamente números binarios (como los opcodes), se usan mnemónicos fáciles de entender. Por ejemplo:

  • En lugar de un opcode binario como 101010, en ensamblador podrías ver algo como ADD para representar una operación de suma.
  •  En esencia, los mnemónicos del ensamblador son una traducción de los opcodes a un formato más accesible.

Cuando un programador escribe un programa en lenguaje ensamblador, el ensamblador lo traduce a opcodes que el procesador puede interpretar.

 

Los opcodes binarios, los mnemónicos del código ensamblador y el codificado en UTF-8.

Aquí tienes un ejemplo avanzado que conecta los opcodes binarios, los mnemónicos del código ensamblador y el codificado en UTF-8. Lo estructuraremos paso a paso:

Contexto del ejemplo

Imagina que queremos trabajar con un carácter en UTF-8, como la letra A. En UTF-8, el carácter A está representado por el código hexadecimal 41 (que corresponde al binario 01000001). El procesador necesita trabajar con ese dato, realizando operaciones como cargarlo en un registro, sumarle valores, o compararlo.

Código ensamblador y opcodes

Aquí está una secuencia de instrucciones en ensamblador para manipular el carácter A:

  1. Cargar el carácter en un registro: Mnemónico: MOV AL, 41h Opcode binario: 1010 1001 Explicación: La instrucción mueve el valor 41h (el código de A en UTF-8) al registro AL (parte baja del registro acumulador).
  2. Sumar un valor al carácter (por ejemplo, convertirlo en otro carácter): Mnemónico: ADD AL, 01h Opcode binario: 0000 1100 Explicación: La instrucción suma 01h al contenido del registro AL, lo que en este caso cambiaría el código UTF-8 de A (41h) a B (42h).
  3. Comparar el carácter con otro valor: Mnemónico: CMP AL, 42h Opcode binario: 0011 1010 Explicación: La instrucción compara el contenido del registro AL con 42h, verificando si coincide con el carácter B.

Relación con UTF-8

En UTF-8:

  • Cada carácter está codificado como una secuencia de uno o más bytes.
  • Los opcodes mencionados son las instrucciones que manipulan los datos binarios, procesando los valores codificados según UTF-8.

Por ejemplo, el valor 41h para la letra A fue interpretado y procesado en el ejemplo como datos en lenguaje máquina, donde los opcodes (como MOV, ADD y CMP) realizan operaciones directamente en el código binario.

 

Lenguaje ensamblador (x86 y x64) y UTF-8

1. Lenguaje ensamblador para x86 y x64

El ensamblador en x86 y x64 es la forma más cercana al lenguaje máquina. Los mnemónicos son instrucciones traducidas en opcodes binarios procesados por el CPU.

Código x86

MOV EAX, 41h ; Cargar el valor 41h (UTF-8 para 'A') en el registro EAX
ADD EAX, 02h ; Sumar 2 al registro EAX
CMP EAX, 43h ; Comparar el contenido con 43h (UTF-8 para 'C')
        

Código x64

MOV RAX, 41h ; Cargar el valor 41h en el registro RAX
ADD RAX, 03h ; Sumar 3 al registro RAX
CMP RAX, 44h ; Comparar el contenido con 44h (UTF-8 para 'D')
        

2. Relación con UTF-8

El codificado UTF-8 es un estándar para representar caracteres en formato binario. Por ejemplo:

  • Letra A: 41h en hexadecimal o 01000001 en binario.
  • Carácter ¡: C2 A1 en hexadecimal.

Manipulación en ensamblador

; Cargar el primer byte de '¡' (C2h)
MOV AL, C2h

; Cargar el segundo byte de '¡' (A1h)
MOV BL, A1h

; Combinar los bytes para procesar el carácter completo
OR AL, BL
        

3. Opcodes aceptados internacionalmente

Los opcodes son específicos para cada arquitectura:

  • MOV: Transferencia de datos.
    • x86: 1011 xxxx (depende del registro).
    • x64: Similar, extendido para registros de 64 bits.
  • ADD: Suma de valores.
    • x86: 0000 1100.
    • x64: Similar pero adaptado a registros más grandes.

 

Resumen

Los opcodes (como 1010 1001 o 0000 1100) representan las acciones específicas que el procesador ejecuta, mientras que los mnemónicos (como MOV, ADD, CMP) son una representación legible para los humanos. Y el codificado UTF-8 proporciona los valores binarios que se procesan con estas instrucciones.

 

Motorola MC6800 Assembler listing - Lenguaje ensamblador

Leer más sobre lenguaje ensamblador, visitar la wiki: https://es.wikipedia.org/wiki/Lenguaje_ensamblador

 

----

Destacado

Bootloader Avanzado en Ensamblador

Bootloader Avanzado en Ensamblador Características del Bootloader Se carga en la dirección 0x7C00 (BIOS). ...