top of page

Introduccion al Ensamblador x64 (Introduction to x64 Assembly)

  • ch-isc
  • 2 mar 2016
  • 4 Min. de lectura

Introduccion

Por años, los programadores de computadoras usaron el ensamblador x86 para escribir codigo critico para el rendimiento. Pero las computadoras de 32 bits estan siendo remplazadas por las de 64 bits, y el codigo de ensamblacion ha cambiado. Esto es una introduccion al ensamblador x64. Ningun conocimiento previo del codigo x86 se necesita, aunque hace esta transicion mas sencilla.

x64 es un nombre generico para las extensiones de 64 bits para los sets de instruccion de estructura x86 de 32 bits de Intel y AMD. AMD introdujo la primer version de x64, inicialmente llamado x86-64 y despues renombrada AMD64. Intel nombro a su implementacion IA-32e y despues EMT64. Hay unas ligeras incompatiblidades entre las dos versiones, pero la mayoria del codigo funciona bien en ambas versiones; los detalles pueden ser encontrados en el Intel 64, los manuales de desarrolladores de arquitecturas de software de IA-32 y los documentos tecnologicos de la arquitectura AMD64. Se llama a esto interseccion x64. Esto no debe confundirse con la estructura del Intel Itanium de 64 bits, que es llamado IA-64.

Los ensambladores son usados comunmente para partes de rendimiento criticas de un programa, aunque es dificil de superar un buen compilador de C++ para muchos programadores. El conocimiento de ensamblaje es de mucha utilidad para la depuraciuon de codigo, a veces un compliador crea codigo de ensamblaje incorrecto y poner el codigo en un depurador ayuda a encontrar la causa. Los optimizadores de codigo tambien cometen errores a veces. Otro uso para ensamblaje son las interfaces o reparaciones de codigo del cual no se tiene codigo de origen. Densamblar permite cambiar o reparar ejecutables existentes. Ensamblar es necesario si se desea saber como el lenguaje elegido funciona, porque algunas cosas son lentas y otras rapidas. Finalmente, el conocer sobre codigo de ensamblador es indispensable para diagnosticar malware.

Arquitectura

Arquitectura General

Desde que los registros de 64 bits permite acceso a muchos tamaño y locaciones, se define un byte como 8 bits, una palabra como 16 bits, una palabra doble como 32 bits, una palabra cuadruple como 64 bits y una doble palabra cuadruple coomo 128 bits. Intel guarda bytes "little endian", que significa que bits de menor significancia son guardados en menores direcciones de memoria.

Hay raras limitaciones para accesar los registros de bytes debido a errores de codigo en el prefijo de codigo REX usado para los nuevos registros: Una instruccion no puede referirse a un legado de byte alto y y uno de los nuevos registros de bytes al mismo tiempo pero puede usarse legado de bytes bajos. Este es usado a la hora de cambiar AH, BH, CH, DH a BPL, SPL, DIL, SIL por instrucciones usando un prefijo REX.

El instructor de 64 bits RIP apunta a la siguiente instruccion que sera ejecutada y soporta un modelo de memoria de 64 bits. El diseño de direccion de memoria en los sistemas operativos actuales se vera mas adelante.

El puntero de pila RSP apunta al ultimo objeto enviado al almacen el cual se mueve hacia menores direcciones. El almacen se usa para guardar direcciones de regreso para subrutinas para pasar parametros en lenguajes de alto nivel como C/C++ y para guardar espacio de sombra cubierto para conveciones.

El registro RFLAGS guarda "banderas" usadas para resultados de operaciones y para controlar el procesador. Esto es formado por el registro de 32 bits x86 EFLAGS añadiendo un nivel mas alto de 32 bits los cuales son reservados y actualmente no usados. Muchas banderas son usadas para tareas de nivel de sistema operativo y siempre debe ser arreglado al valor previo.

Los registros finales incluye registros de segmentos (comunmente sin usarse en x64), registros de control, registros de manejo de memoria, registro de depuracion, registros de virtualizacion, registro de desempeño, analiza todos los parametros internos. El mas notable codigo de desempeño es RDTSC el cual es usado para contar ciclos de procesador para perfilar pequeñas piezas de codigo.

Arquitectua SIMD

Los datos multiples de instruccion simple ejecutan un solo comando en multiples piezas de datos en paralelo y son de comun uso en rutinas de ensamblaje. Los comandos MMX y SSE soportan operaciones SIMD, las cuales operan una instruccion de hasta ocho piezas de datos en paralelo.

Herramientas

Ensambladores

A traves del Internet se revelan ensambladores capaces para x64 como el Netwide Assembler NASM, una redicion del NASM llamado YASM, el Flat Assemblwe FASM y el tradicional Microsoft MASM. Hay incluso un IDE gratis para ensamblaje x86 y x64 llamado WinASM. Cada ensamblador tiene soporte variante para macros y sintaxis de otros ensambladores pero el codigo de ensamblaje no es compatible con los recursos de ensambladores como C++ o Java.

Compiladores para C/C++

Los compiladores para C/C++ usualmente permite codigo de ensamblaje dentro de dicho codigo usando ensamblaje en linea pero Microsoft Visual Studio quito esto para el codigo x64, probablemente para simplificar la tarea del optimizador de codigo. Esto deja dos opciones: Usar distintos archivos de ensamblaje y un ensamblador externo o usar intrinsecos desde el archivo de cabecera intrn.h. Otros compliadores usan opciones similares.


Entradas recientes

Ver todo
Conceptos de Lenguaje Ensamblador

WinAsm WinAsm Studio es un entorno de desarrollo integrado (IDE) gratuito para desarrollar programas en Windows 32-bit y DOS 16-bit...

 
 
 

Comments


Entradas destacadas
Vuelve pronto
Una vez que se publiquen entradas, las verás aquí.
Entradas recientes
Archivo
Buscar por tags
Síguenos
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square
bottom of page