Conceptos esenciales de Assembly y gestión de registros x86

Clasificado en Informática

Escrito el en español con un tamaño de 456,51 KB

Registros de propósito general

Registros de propósito general: AX: acumulador; BX: base; CX: contador (variable contador en un bucle); DX: datos.

Assembler

Assembler: Lenguaje de programación en el que cada instrucción se traduce uno a uno a binario.

Registros

Registros: Espacios internos del procesador que guardan información de forma temporal. Cada registro general tiene 16 bits y se puede dividir en dos partes de 8 bits: la parte alta (H) y la parte baja (L) — por ejemplo, AH/AL, BH/BL, etc.

Índices y segmentos

  • Índice para recorrer arreglos: SI y DI.
  • Para la pila: BP (índice o base de marco) y SP (contiene la dirección de la cima de la pila).
  • DS: registro de segmento de datos. Se usa junto con registros como BX y SI para acceder a memoria.

Declaraciones y operadores

DUP: se usa para declarar arreglos repitiendo elementos. Ejemplo: 5 DUP(10) — repite el valor 10 cinco veces.

OFFSET: palabra que devuelve la dirección (offset) de memoria de una variable, normalmente expresada en hexadecimal.

Modos de direccionamiento

Modos de direccionamiento:

  • Inmediato: la operando es un valor literal. Ejemplo: add ax, 20.
  • Inherente o de registro: operación entre registros. Ejemplo: mov bx, cx.
  • Directo: acceso a una dirección concreta. Ejemplo: mov ax, DS:[107Ah].
  • Indirecto por registro: la dirección está en un registro. Ejemplo: mov ax, DS:[BX].
  • Indexado / direccionamiento con desplazamiento: combinación de registros y desplazamientos. Ejemplo: mov ax, DS:[BX + SI + 5].

Instrucciones de control y comparación

  • LOOP: bucle. Sintaxis: LOOP nombre_de_etiqueta.
  • JMP: salta directamente a la etiqueta indicada.
  • CMP: compara dos números (no modifica registros excepto flags).
  • JE: si los operandos comparados con CMP son iguales, salta a la etiqueta indicada.
  • JG: salta a la etiqueta si el primer operando del CMP es mayor que el segundo.

Pila (stack)

Pila: estructura de datos tipo LIFO (Last In, First Out).

  • SS: segmento de la pila (Stack Segment).
  • SP: puntero de la pila (Stack Pointer).
  • BP: base pointer, usado para recorrer y referenciar parámetros locales y de la función.

H8P3pTMdWwwyAAAAAElFTkSuQmCC

Subrutinas

Subrutina: fragmento de código dentro de un programa más grande con una tarea específica. Al definirla se le pone su nombre seguido de la palabra PROC, y al finalizar se marca con su nombre y la palabra ENDP.

Sus partes

Partes de una subrutina: nombre, parámetros, valor de retorno y descripción.

Llamadas y retorno

  • CALL: llama a la subrutina. Se guarda en la cima de la pila la dirección IP de retorno.
  • RET: vuelve a la línea original (retorna de la subrutina).

Pase de parámetros

Pase de parámetros con registros: se guardan los datos en uno o varios registros y la subrutina accede o modifica esos registros.

Problemas al usar la pila

Al hacer CALL se apila la dirección de retorno; por eso, dentro de la subrutina no es recomendable recuperar los parámetros simplemente con POP, ya que ello afectaría la dirección de retorno. Para trabajar con parámetros en la pila es necesario recorrerla usando BP, SP y el segmento SS.

Comienza con estas líneas al entrar en la subrutina:

push BP
mov BP, SP

Para acceder a los datos

Se utilizan expresiones como SS:[BP+4] para acceder al segundo parámetro (por ejemplo F53Ch). Si queremos saltar 2 elementos (en arquitectura de 16 bits, cada elemento ocupa 2 bytes) sumamos 4: SS:[BP+6] (por ejemplo 100Ah).

Sumando se baja la pila y restando se sube.

A0Ge3WrOXGY5AAAAAElFTkSuQmCC

Entradas relacionadas: