top of page

RESUMEN LENGUAJE ENSAMBLADOR EN X64

Por años, los programadores de las PC usaron el ensamblador para x86 para escribir código de rendimiento crítico. Sin embargo, las PCs de 32-bit están siendo reemplazadas con las de 64-bit, y el código ensamblador subyacente ha cambiado.

Arquitectura

Dado que los registros de 64-bit permiten el acceso de muchos tamaños y ubicaciones, definimos un byte como 8 bits, una palabra como 16 bits, una palabra doble como 32 bits, una palabra cuádruple como 64 bits, y una doble palabra cuádruple como 128 bits. Intel almacena bytes “Little endian”, lo que significa que menos bytes significantes son almacenados en direcciones de memoria inferiores.

La figura 1 muestra 16 registros de 64-bits de uso general, de los cuales los primeros 8 estan etiquetados (por razones históricas) RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP. Los siguientes 8 son nombrados R8-R15. Al reemplazar la R inicial con una E en los primeros 8 registros, es posible accesar a los 32 bits inferiores (EAX para RAX). De manera similar, para RAX, RBX, RCX y RDX, accesar a los 16 bits inferiores es posible removiendo la inicial R (AX para RAX), y el byte inferior de estos cambiando la X por L (AL para AX), y el byte superior de los 16 bits inferiores usando una H (AH para AX). Los nuevos registros R8 a R15 pueden ser accesados de una manera similar asi: R8 (qword), R8D (dword inferior), R8W (la Word más bajo), R8B (el byte más bajo estilo MASM, en estilo Intel sería R8L). Nótese que no hay R8H.

El registro de RFLAGS almacena banderas usadas para resultados de operaciones y para controlar el procesador. Estas banderas están formadas de las EFLAGS de los registros del x86 de 32-bit añadiéndoles los 32 bits superiores que comúnmente se encontraban reservadas y en aquellos tiempos inutilizadas. La tabla 1 muestra la lista de las banderas más útiles. La mayoría de las otras banderas son usadas para tareas a nivel de sistema operativo y siempre deben estar configuradas al valor previamente leído.

La unidad de punto flotante (UPF) contiene 8 registros FPR0-FPR7, registros de estatus y de control y unos pocos registros especializados. FPR0-7 pueden almacenar cada uno 1 valor de los tipos mostrados en la tabla 2. Las operaciones de punto flotante son conforme a la IEEE 754. Notese que la mayoría de los compiladores de C/C++ soportan 32 y 64 bits como tipo flotante o doble, pero no el de 80-bit disponible desde el ensamblador. Estos registros compraten espacio con los 8 registros MMX de 64-bits.

decimal codificado en binario (BCD) es compatible con unas pocas instrucciones de 8 bits, y un formato excéntrico soportado en los registros de coma flotante de 80 bits da una, de tipo BCD 17 dígitos. Los registros XMM de 128 bits de dieciséis (ocho más que x86) se cubren con más detalle.

Arquitectura SIMD

Las instrucciones Single Instruction Multiple Data (SIMD) ejecutan un solo comando en multiples partes de datos en paralelo y son de uso común para rutinas de ensamblador. Los comandos MMX y SSE (usando los registros MMX y XMM respectivamente) soportan las operaciones SIMD, las cuales realizan una instrucción en hasta 8 partes de datos en paralelo. Por ejemplo, 8 bytes pueden ser añadidos a otros 8 bytes en una sola instrucción utilizando MMX.

Los 8 registros de 64-bit MMX MMX0-MMX7 están encima de los FPR0-7, lo que significa que cualquier mezcla de código entre operaciones FP y MMX debe ser cuidadosa para evitar sobreescritura de los valores requeridos. Las instrucciones MMX operan en tipos enteros, permitiendo a operaciones de byte, Word y doubleword ser realizadas en valores en los registros MMX de forma paralela.

La tabla 3 lista algunos setes de comandos, los tipos de registros en los cuales se opera, la cantidad de objetos manipulados en paralelo y el tipo de objeto. Por ejemplo, usando los registros SSE3 y el XMM de 128-bit , puedes operar en 2 valores de punto flotante de forma paralela (debiendo ser estos de 64-bit), o incluso 16 valores enteros en paralelo (siendo estos del tamaño de 1 byte).

Herramientas

Ensambladores

Una búsqueda en internet revela que los ensambladores capaces de manejar x64 son el NASM, una reescritura del NASM llamada YASM, el rápido FASM, y el tradicional MASM. Incluso existe un IDE para ensamblador gratuito para x86 y x64 llamado WinASM. Cada ensamblador tiene soporte variado para las macros y la sintaxis de los otros ensambladores, pero el código ensamblador no es compatible de origen a través de ensambladores tal como lo hacen el C++ y el Java.

Compiladores de C/C++

Estos compiladores seguido permiten empotrar ensamblador en el código usando ensamblado en línea, pero Microsoft Visual Studio C/C++ removió esto para el código x64, probablemente para simplificar la tarea del optimizador de código. Esto deja 2 opciones: usar archivos de ensamblador por separado y un ensamblador externo, o usar características intrínsecas del archivo de encabezado “intrn.h”. Otros compiladores ofrecen opciones similares.

Algunas razones para usar características intrínsecas:

· Ensamblador por línea no está soportado en x64

· Facilidad de uso: puedes usar nombres de variables en lugar de hacer malabares con la asignación de registros de manera manual.

· Mayor multiplataforma que el ensamblador: El fabricante del compilador puede portar las características intrínsecas hacia varias arquitecturas.

· El optimizador funciona mejor con estas características.

Instrucciones Básicas

Modos de direccionamiento

Antes de cubrir algunas instrucciones básicas, es necesario comprender los modos de direccionamiento, que son maneras en las que una instrucción puede accesar a los registros o a la memoria. Los siguientes son modos de direccionamiento comunes con ejemplos:

· Inmediato: el valor es almacenado en la instrucción: ADD EAX, 14 ; añadir 14 en el registro EAX de 32-bit

· Registro a registro: ADD R8L, AL ; añade el registro de 8 bit AL dentro de R8L

· Indirecto: esto permite usar un desplazamiento de 8, 16 o 32 bits, cualquier registro de propósito general para base e índice, y una escala de 1, 2, 4 u 8 para multiplicar el índice. Técnicamente, estos tambien pueden ser prefijados con el segmento FS: o GS: pero esto es raramente requerido. MOV R8W, 1234[8*RAX+RCX]; mover palabra (word) a la direccion 8*RAX+RCX+1234 dentro de R8W.

Hay muchas maneras legales de escribir esto. Las siguientes son equivalentes:

MOV ECX, dword ptr table[RBX][RDI]

MOV ECX, dword ptr table[RDI][RBX]

MOV ECX, dword ptr table[RBX+RDI]

MOV ECX, dword ptr [table+RBX+RDI]

El dword ptr le dice al ensamblador como debe codificar la instrucción MOV.

  • RIP- direccionamiento relativo: esto es nuevo para x64 y permite accesar a tablas de datos y similares en el código relativo al puntero de la instrucción actual, haciendo que la posición del código independiente sea más fácil de implementar.

MOV AL, [RIP]; RIP apunta a la siguiente instrucción tambien conocida como NOP

Desafortunadamente, MASM no permite esta forma de código operacional, pero otros ensambladores como el FASM y el YASM si. En lugar de esto MASM, incrusta el direccionamiento relativo RIP de manera implícita.

MOV EAX, TABLE ; utiliza RIP- direccionamiento relativo para obtener la dirección de la tabla.

  • Casos especializados: algunos códigos operacionales usan registros de maneras únicas basados en el código operacional. Por ejemplo, la división de entero señalado IDIV en un valor de operando de 64 bits divide el valor de 128 bits en RDX:RAX por el valor, almacenando el resultado en RAX y el residuo en RDX.

Set de instrucciones

La tabla 4 lista algunas instrucciones comunes. * denota que esta entrada es para multiples códigos operacionales donde el * denota un sufijo.

Una operación común es la operación de bucle que decrementa RCX, ECX, o CX dependiendo del uso, y luego salta si el resultado no es 0. Por ejemplo,

XOR EAX, EAX ; zero out eax

MOV ECX, 10 ; loop 10 times

Label: ; this is a label in assembly

INX EAX ; increment eax

LOOP Label ; decrement ECX, loop if not 0


Estrategia de Negocios

 

CURSO GRATUITO 
(Valuado en 250 )
 

Aprende todo lo que necesitas saber sobre cómo hacer una estrategia de negocios exitosa.

Business Plan

Writing A-Z

 
FREE COURSE
(Valued at $250)
 

Learn all you need in order to create a

stellar business plan for your endeavor!

Mi Libro
 

Párrafo. Haz clic aquí para agregar tu texto y editar. Permite que tus usuarios te conozcan.

Búsqueda por Tags
No hay tags aún.
  • Facebook Black Round
  • Google+ Black Round
  • Tumblr Black Round

© 2023 por TuCamino. Creado con Wix.com

  • Facebook Black Round
  • Google+ Black Round
  • Tumblr Black Round
bottom of page