Saltar al contenido

Programación en ensamblador (Resumen I)

Resumen de la arquitectura x86-64 (AMD64 o Intel 64) , que es la que voy a utilizar en las prácticas que vaya subiendo de ensamblador.

La arquitectura x86-64 fué desarrollada por AMD para manejar direcciones de 64 bits e implementada bajo el nombre de AMD64, que posteriormente adoptó Intel bajo el nombre de Intel64,

Modos de operación

La arquitectura x86-64 mantiene la compatibilidad con los procesadores de la arquitectura IA-32 (x86-32).
Además incorporan un modo extendido en el que podemos trabajar en 64 bits.
De esta manera tenemos el modo heredado (16-32bits) y el modo extendido (64 bits)

También tenemos el modo de gestión de sistema (SMM), este modo sirve para la gestión de energía y micro-hardware entre otras cosas, es utilizado básicamente por la BIOS.

El modo de 64 bits

Para programar utilizaremos el modo de 64 bits, que tienes las siguientes características:

-Espacio de memoria:

Los programas ejecutados en este modo podrán acceder a un espacio de direcciones lineal de 2^64 bytes
(^ elevado), aunque el espacio del procesador será inferior.

– Registros:

Existen 16 registros generales de 64 bits, para realizar operaciones de bite, word, double word, y quad word (8,16,32 y 64 bits respectivamente).
Tenemos otros 6 registros de 16 bits como registros de segmentos.
Y por último un registro de 64 bits para RFLASGS y otro de 64 bits para RIP (El contador del programa)

Orden de los bytes

Los procesadores x86-64 utilizan el sistema little-endian (el byte de menos peso ocupa la dirección mś baja) para almacenar los datos. Comenzando por el byte numero 0 (de 8 en 8), es decir, byte 0 ocupará del 0 al 7, byte 1 del 8 al 15 y así sucesivamente dependiendo del tipo de registro que estés utilizando.

En el modo compatible utilizaran direcciones de 32 bytes, sin embargo, en el modo de 64 generarán direcciones de 64 bytes.

Registros de propósito general

Son 16 registros de datos de 64 bits (8 bytes): RAX, RBX, RCX, RDX, RSI, RDI,RBP, RSP y R8-R15.

Los registros son accesibles de las siguientes formas:

Registros completos, como quad word (64).
Registros double word, 32 bits de menos peso.
Registros word, 16 bits de menos peso.
Registros byte, 8 bits de menos peso.

Limitaciones:

Registro RSP: tiene una función especial, funciona como el puntero de pila, contiene siempre la dirección del primer elemento de la pila.

En una misma instrucción no se pueden usar un registro del conjunto AH, BH, CH, DH junto con uno del conjunto SIL, DIL, BPL, SPL, R8B – R15B.

Registros de propósito específico

Como hemos mencionado antes tenemos varios tipos de registros de proposito específico:

– Seis Registros de segmento:
CS(code segment), DS (data segment), SS (stack segment), ES, FS, GS (extra segment).

En el modo de 64 bits solo se suelen utilizar los registros FS y GS.

– RIP

Es el contador del programa y contiene la dirección de la instrucción siguiente.

-RFLAGS:

Contiene información sobre el estado del procesador, entre otros utilizaremos los siguientes:

Z: Se activa si el resultado a sido 0.
S: Se activa si el resultado tiene signo
C: Se activa si el resultado tiene carry
V: Se activa si el resultado se desborda

Nota: Prácticamente las instrucciones del lenguaje ensamblador concuerdan con las instrucciones binarias del código máquina.