Lenguaje de Ensamblador x86-64 (64 bits)¶
; Register naming conventions
; 64-bit: RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8-R15
; 32-bit: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, R8D-R15D
; 16-bit: AX, BX, CX, DX, SI, DI, BP, SP, R8W-R15W
; 8-bit: AL, BL, CL, DL, SIL, DIL, BPL, SPL, R8B-R15B
El lenguaje de ensamblador x86-64 representa la cúspide evolutiva de la familia de arquitecturas x86, extendiendo el conjunto de instrucciones x86 de 32 bits a la era de la computación de 64 bits mientras mantiene una compatibilidad total con versiones anteriores e introduce nuevas capacidades poderosas que definen la computación moderna. También conocido como AMD64 (desarrollado por AMD) o Intel 64 (implementación de Intel), esta arquitectura se ha convertido en la plataforma dominante para computación de escritorio, infraestructura de servidores y aplicaciones de computación de alto rendimiento en todo el mundo. [rest of the text continues similarly...]asm
; 64-bit memory addressing
mov rax, [rbx] ; 64-bit memory load
mov [rcx+rdx*8], rax ; 64-bit store with scaling
lea rsi, [rdi+r8*4+100] ; Load effective address calculation
; RIP-relative addressing (64-bit mode only)
mov rax, [rip+variable] ; PC-relative data access
call [rip+function_ptr] ; PC-relative function call
La convención de nomenclatura de registros sigue un patrón sistemático que mantiene la compatibilidad con código de 32 bits mientras proporciona una identificación clara de los tamaños de operación. Una característica arquitectónica importante es que las operaciones de 32 bits en registros de 64 bits borran automáticamente los 32 bits superiores, proporcionando una semántica limpia para operaciones de tamaño mixto y eliminando posibles vulnerabilidades de seguridad de contenidos de registro no inicializados.asm
; REX prefix examples (shown conceptually)
mov rax, rbx ; REX.W + MOV (64-bit operation)
mov r8, r9 ; REX.W + REX.R + REX.B + MOV (extended registers)
mov eax, r8d ; REX.B + MOV (32-bit with extended register)
; Instruction encoding considerations
add rax, 1 ; Can use shorter encoding than immediate
add rax, 128 ; Requires longer immediate encoding
add rax, r8 ; Uses REX prefix for extended register
x86-64 introduce el prefijo REX que permite el acceso a registros extendidos y tamaños de operandos de 64 bits mientras mantiene la compatibilidad con la codificación de instrucciones existente. El prefijo REX aparece antes del código de operación de la instrucción y contiene campos que especifican el modo de operación de 64 bits, acceso a registros extendidos y capacidades de direccionamiento adicionales. Comprender el uso del prefijo REX es crucial para programadores de ensamblador que trabajan con el conjunto de registros extendido y operaciones de 64 bits.asm
; 64-bit specific instructions
movsxd rax, eax ; Sign-extend 32-bit to 64-bit
cdqe ; Convert doubleword to quadword (RAX)
cqo ; Convert quadword to octword (RDX:RAX)
; Enhanced immediate support mov rax, 0FFFFFFFFFFFFFFFFh ; 64-bit immediate (limited cases) mov r8, 7FFFFFFFh ; 32-bit immediate sign-extended
; Improved string operations
movsq ; Move quadword string
stosq ; Store quadword string
scasq ; Scan quadword string
El prefijo REX permite varias capacidades importantes, incluyendo acceso a registros R8-R15, especificación de tamaño de operandos de 64 bits y modos de direccionamiento extendidos. El prefijo es generado automáticamente por ensambladores cuando es necesario, pero comprender su función ayuda a optimizar la selección de instrucciones y comprender las implicaciones de tamaño de código.asm
; System V ABI parameter passing
; Integer/pointer parameters: RDI, RSI, RDX, RCX, R8, R9
; Floating-point parameters: XMM0-XMM7
; Return values: RAX (integer), XMM0 (floating-point)
function_call_example: ; Prepare parameters mov rdi, param1 ; First parameter mov rsi, param2 ; Second parameter mov rdx, param3 ; Third parameter mov rcx, param4 ; Fourth parameter mov r8, param5 ; Fifth parameter mov r9, param6 ; Sixth parameter ; Additional parameters go on stack
call target_function
; Return value in RAX
; Function prologue/epilogue target_function: push rbp ; Save frame pointer mov rbp, rsp ; Establish frame pointer sub rsp, 32 ; Allocate local storage (16-byte aligned)
; Function body
mov rax, rdi ; Access first parameter
add rax, rsi ; Add second parameter
; Function epilogue
mov rsp, rbp ; Restore stack pointer
pop rbp ; Restore frame pointer
ret ; Return to caller
La ABI System V requiere un alineamiento de pila de 16 bytes en los límites de llamadas de función, asegurando un rendimiento óptimo para operaciones SIMD y manteniendo la compatibilidad con código generado por compiladores. La ABI también define registros guardados por el llamado (RBX, RBP, R12-R15) que deben preservarse entre llamadas de función, y registros guardados por el llamador que pueden ser modificados por funciones llamadas.asm
; Microsoft x64 ABI parameter passing
; Integer/pointer parameters: RCX, RDX, R8, R9
; Floating-point parameters: XMM0-XMM3
; Return values: RAX (integer), XMM0 (floating-point)
windows_function_call: ; Prepare parameters mov rcx, param1 ; First parameter mov rdx, param2 ; Second parameter mov r8, param3 ; Third parameter mov r9, param4 ; Fourth parameter ; Additional parameters go on stack
sub rsp, 32 ; Allocate shadow space
call target_function
add rsp, 32 ; Clean up shadow space
; Return value in RAX
; Windows function structure windows_function: ; Shadow space automatically allocated by caller mov [rsp+8], rcx ; Can spill parameters to shadow space mov [rsp+16], rdx mov [rsp+24], r8 mov [rsp+32], r9
; Function body
mov rax, rcx ; Access first parameter
add rax, rdx ; Add second parameter
ret ; Return to caller
La convención de llamadas de Microsoft x64 requiere la asignación de espacio de sombra para los primeros cuatro parámetros, incluso cuando se pasan en registros. Este espacio de sombra proporciona almacenamiento para parámetros de registro si la función llamada necesita descargarlos a memoria, simplificando la implementación de funciones y la depuración.asm
; Page table manipulation (system-level programming)
mov cr3, rax ; Load page directory base
mov rax, cr3 ; Read current page directory
; TLB management invlpg [memory_address] ; Invalidate specific page in TLB mov rax, cr4 ; Read control register 4 or rax, 80h ; Set PGE bit (Page Global Enable) mov cr4, rax ; Enable global pages
; Memory type and caching control
mov rcx, 277h ; IA32_PAT MSR
rdmsr ; Read Page Attribute Table
; Modify EAX/EDX for memory type configuration
wrmsr ; Write modified PAT
Comprender la gestión de memoria virtual es crucial para programación a nivel de sistema, controladores de dispositivos y aplicaciones que requieren control preciso del comportamiento de memoria. La unidad de gestión de memoria de x86-64 proporciona características para protección de memoria, control de caché y optimización de rendimiento que pueden impactar significativamente el comportamiento de la aplicación.asm
; Large page allocation (conceptual - typically done through OS APIs)
; 2MB page allocation
mov rax, 200000h ; 2MB page size
mov rbx, page_address ; Must be 2MB aligned
; Huge page allocation mov rax, 40000000h ; 1GB page size mov rbx, huge_page_addr ; Must be 1GB aligned
; Page size detection
cpuid ; Check processor capabilities
test edx, 8 ; Test PSE bit (Page Size Extension)
jnz large_pages_supported
El uso de páginas grandes requiere una consideración cuidadosa de la alineación de memoria, estrategias de asignación y soporte del sistema operativo. Las aplicaciones que pueden usar efectivamente páginas grandes a menudo ven mejoras de rendimiento significativas en cargas de trabajo intensivas en memoria.asm
; SSE operations (128-bit vectors)
movaps xmm0, [source] ; Load 4 packed single-precision floats
addps xmm0, xmm1 ; Add 4 floats in parallel
movaps [dest], xmm0 ; Store result
; AVX operations (256-bit vectors) vmovaps ymm0, [source] ; Load 8 packed single-precision floats vaddps ymm0, ymm0, ymm1 ; Add 8 floats in parallel vmovaps [dest], ymm0 ; Store result
; Integer SIMD operations
movdqa xmm0, [int_array] ; Load 4 packed 32-bit integers
paddd xmm0, xmm1 ; Add 4 integers in parallel
movdqa [result], xmm0 ; Store result
La programación SIMD requiere comprensión de los requisitos de alineación de datos, selección de instrucciones y estrategias de vectorización. El uso efectivo de instrucciones SIMD puede proporcionar mejoras de rendimiento de 4x, 8x o incluso 16x para algoritmos adecuados.asm
; AVX-512 operations (512-bit vectors)
vmovaps zmm0, [source] ; Load 16 packed single-precision floats
vaddps zmm0, zmm0, zmm1 ; Add 16 floats in parallel
vmovaps [dest], zmm0 ; Store result
; Masked operations kmovw k1, eax ; Load mask register vaddps zmm0\\{k1\\}, zmm1, zmm2 ; Conditional addition based on mask
; Gather operations
vgatherdps zmm0\\{k1\\}, [rsi+zmm1*4] ; Gather floats using index vector
La programación de AVX-512 requiere una atención cuidadosa al soporte del procesador, consideraciones térmicas y efectos de escalado de frecuencia que pueden impactar el rendimiento general del sistema.asm
; Control register access
mov rax, cr0 ; Read control register 0
or rax, 1 ; Set PE bit (Protection Enable)
mov cr0, rax ; Enable protected mode
mov rax, cr4 ; Read control register 4 or rax, 200h ; Set OSFXSR bit (OS FXSAVE/FXRSTOR support) mov cr4, rax ; Enable SSE support
; Model-specific register access
mov rcx, 1Bh ; IA32_APIC_BASE MSR
rdmsr ; Read MSR (result in EDX:EAX)
or eax, 800h ; Set APIC Global Enable
wrmsr ; Write MSR
La programación de sistema requiere comprender los niveles de privilegio, mecanismos de protección de memoria e interfaces de hardware que forman la base de la funcionalidad del sistema operativo.asm
; Control Flow Integrity (Intel CET)
endbr64 ; End branch instruction (indirect branch target)
wrss rax, [rbx] ; Write to shadow stack
rdsspq rax ; Read shadow stack pointer
; Memory Protection Keys (Intel MPK) mov eax, 0 ; Protection key 0 mov ecx, 0 ; Access rights wrpkru ; Write protection key rights
; Pointer Authentication (future/ARM-inspired)
; Conceptual - not yet in x86-64
; pacia rax, rbx ; Sign pointer in RAX with key in RBX
; autia rax, rbx ; Authenticate pointer
La utilización de características de seguridad requiere coordinación entre capacidades de hardware, soporte del sistema operativo y diseño de aplicaciones para proporcionar una protección efectiva contra técnicas de ataque modernas.asm
; Optimized instruction selection
lea rax, [rbx+rcx] ; Faster than mov+add for address calculation
shl rax, 3 ; Faster than imul rax, 8 for power-of-2 multiply
test rax, rax ; Faster than cmp rax, 0 for zero test
; Loop optimization align 16 ; Align loop entry point loop_start: ; Unroll loop body for better throughput mov rax, [rsi] ; Load first element add rax, [rsi+8] ; Add second element mov [rdi], rax ; Store result mov rax, [rsi+16] ; Load third element add rax, [rsi+24] ; Add fourth element mov [rdi+8], rax ; Store result
add rsi, 32 ; Advance source pointer
add rdi, 16 ; Advance destination pointer
sub rcx, 4 ; Decrement counter by 4
jnz loop_start ; Continue if not zero
El desenrollamiento de bucles, reordenamiento de instrucciones y asignación cuidadosa de registros pueden mejorar significativamente el rendimiento para secciones de código computacionalmente intensivas.asm
; Cache-friendly memory access
; Sequential access pattern (cache-friendly)
mov rsi, array_start
mov rcx, element_count
sequential_loop:
mov rax, [rsi] ; Load element
; Process element
add rsi, 8 ; Move to next element
dec rcx
jnz sequential_loop
; Prefetch instructions for cache optimization prefetcht0 [rsi+64] ; Prefetch to L1 cache prefetcht1 [rsi+128] ; Prefetch to L2 cache prefetcht2 [rsi+256] ; Prefetch to L3 cache prefetchnta [rsi+512] ; Prefetch non-temporal (bypass cache) ```La utilización efectiva de caché requiere comprender los tamaños de línea de caché, estrategias de prefetch y patrones de acceso a memoria que minimicen los fallos de caché y maximicen la utilización del ancho de banda de memoria.
[The final paragraph would be translated similarly, maintaining the same structure and technical terminology.]