CPU
Los assembler más populares son:
NASM (Netwide Assembler).
MASM (Microsoft Macro Assembler).
GAS (GNU Assembler).
FASM (Flat Assembler).
Este post será muy interesante para entender cómo se compila programas.
Diferencias entre AT&T e Intel
A medida que se bajando de nivel, se va notando algunas cosas que no se necesitaba preocupar al momento de trabajar con lenguajes de alto nivel. Al trabajar con sistemas basados en Unix, tradicionalmente se tiene una sintaxis AT&T, en muchas herramientas se tiene la opción de obtener la sintaxis Intel. Ahora voy a nombrar algunas de las diferencias más significativas para identificar la sintaxis del ensamblador.
En algunas instrucciones donde se especifica el origen y el destino se invierten, mientras que para AT&T va primero el origen y luego el destino, en Intel es lo contrario primero el destino y luego en origen
AT&T
<instrucción> <origen><destino>
Intel
<instrucción> <destino><origen>
Arquitectura 32
Endians:
Conocer la Endian es importante a la hora de interpretar los registros.
Binario Hex Decimal
Big Endian 0101 0010 0x52 82
Little Endian 0101 0010 0x25 37
En procesadores modernos existe, registros de propósito general, registro de segmento, registros de banderas y un registro de puntero.
Registros GPR
Los registros GPR(General Purpose Register) almacenan direcciones de memoria o
datos, que serán utilizados durante la ejecución del programa.
Abr | Nombre | Descripción |
---|---|---|
EAX |
Extended Accumulator Register |
Es responsable de manejar el resultado de operaciones de llamada al sistema |
EBX |
Extended Base Register |
Es usada para almacenar la dirección de los datos en el segmento de registro DS |
ECX |
Extended Counter Register |
Sirve como contador para strings y operaciones cíclicas |
EDX |
Extended Data Register |
Es usado para almacenar direcciones para operaciones de entrada y salida |
EBP |
Extended Base Pointer |
Apunta a la dirección de la base del Stack |
EDI |
Extended Destination Index |
Es usado como el puntero de destino para las operaciones de strings |
ESI |
Extended Source Index |
Es usado como puntero de origen para las operaciones de strings |
ESP |
Extended Stack Pointer |
Apunta a la dirección de la parte superior del Stack |
EIP |
Extended Instruction Pointer |
Tiene 32 bits de ancho, apunta a la dirección de la siguiente instrucción |
Estos registros tiene un tamaño específico que se pueden dividir en registros con tamaño mucho más pequeño, por ejemplo EAX tiene un tamaño de 32 bits, y a su vez puedo tener 2 registros AX de tamaño de 16 bits, un registro AX de 16 bits puede tener un 2 registros de 8 bits, llamados AH(high bit) y AL(low bit). En arquitecturas mas modernas como x64, se duplicó el espacio de memoria, por ejemplo un registro RAX es equivalente a 2 registros EAX.
Los registros EFLAGS tienen un tamaño de 32 bits y contiene varios diferentes flags que son usadas para varias operaciones, algunos de estos bits están reservados como lo son 1,3,5,15, 22 al 31. En arquitectura x64 son denominados RFLAGS.
Algunos EFLAGS:
Carry Flag (CF): Se encuentra en el bit 0 y este flag indica una condición de desbordamiento para operaciones aritmética de enteros sin signo.
Parity Flag (PF): Se encuentra en el bit 2 y se coloca si el bit más significativo contiene incluso un número de un solo bit.
Auxiliary Carry Flag (AF): Se encuentra en el bit 4 y es usado en operaciones matemáticas si la operación resultante es llevar y pedir prestado.
Zero Flag (ZF): Se encuentra en el bit 6, tiene el valor de 1 y si es colocado 0 despejados.
Sign Flag (SF): Se encuentra en el bit 7 y es usado para demarcar el signo de un entero.
Direccion Flag (DF): Se encuentra en el bit 10 y se usa para determinar la dirección de operaciones de string, si se pasa un 1, las instrucciones de string operan desde la dirección más alta a la más baja y si se pasa 0 viceversa.
Overflow Flag(OF): Se encuentra en el bit 11 y se establece si el resultado entero es un número positivo demasiado grande o pequeño para caber en el operando de destino o una condición de desbordamiento en una operación matemática.