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
CMPson iguales, salta a la etiqueta indicada. - JG: salta a la etiqueta si el primer operando del
CMPes 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.
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, SPPara 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.