Articles of x86 64

Tabla de vinculación de proceso y tabla de compensación global

Estoy leyendo este artículo en PLT (tabla de vinculación de procesos) y GOT (tabla de compensación global) . Si bien el objective de PLT es claro para mí, todavía estoy confundido acerca de GOT. Lo que he entendido del artículo es que GOT solo es necesario para las variables declaradas como extern en una biblioteca […]

¿Por qué la división entera por -1 (negativo) resulta en FPE?

Tengo una asignación de expandir algunos comportamientos aparentemente extraños del código C (ejecutándose en x86). Puedo completar fácilmente todo lo demás, pero este realmente me ha confundido. Fragmento de código 1 salidas -2147483648 int a = 0x80000000; int b = a / -1; printf(“%d\n”, b); El fragmento de código 2 no genera nada y proporciona […]

Rendimiento inesperadamente pobre y extrañamente bimodal para el bucle de la tienda en Intel Skylake

Estoy viendo un rendimiento inesperadamente bajo para un simple bucle de tienda que tiene dos tiendas: una con un avance de 16 bytes y otra que siempre está en la misma ubicación 1 , como esta: volatile uint32_t value; void weirdo_cpp(size_t iters, uint32_t* output) { uint32_t x = value; uint32_t *rdx = output; volatile uint32_t […]

Optimizaciones de rendimiento del ensamblaje x86-64 – Alineación y predicción de bifurcación

Actualmente estoy codificando versiones altamente optimizadas de algunas funciones de cadenas de biblioteca estándar C99, como strlen() , memset() , etc., utilizando el ensamblaje x86-64 con instrucciones SSE-2. Hasta ahora he logrado obtener excelentes resultados en términos de rendimiento, pero a veces obtengo un comportamiento extraño cuando trato de optimizar más. Por ejemplo, agregar o […]

¿Por qué los sistemas x86-64 solo tienen un espacio de direcciones virtuales de 48 bits?

En un libro, leo lo siguiente: Los procesadores de 32 bits tienen 2 ^ 32 direcciones posibles, mientras que los procesadores actuales de 64 bits tienen un espacio de direcciones de 48 bits Mi expectativa era que si se trata de un procesador de 64 bits, el espacio de direcciones también debería ser de 2 […]

Qué significa “rep; nop; “¿significa en ensamblaje x86? ¿Es lo mismo que la instrucción de “pausa”?

¿Qué hace rep; nop rep; nop significa? ¿Es lo mismo que la instrucción de pause ? ¿Es lo mismo que rep nop (sin el punto y coma)? ¿Cuál es la diferencia con la instrucción simple nop ? ¿Se comporta de manera diferente en los procesadores AMD e Intel? (bonificación) ¿Dónde está la documentación oficial para […]

¿Tiene algún sentido utilizar la instrucción LFENCE en procesadores x86 / x86_64?

A menudo en Internet encuentro que LFENCE no tiene sentido en los procesadores x86, es decir, no hace nada, por lo tanto, en vez de MFENCE , podemos usar absolutamente absolutamente SFENCE , porque MFENCE = SFENCE + LFENCE = SFENCE + NOP = SFENCE . Pero si LFENCE no tiene sentido, entonces ¿por qué […]

Imprimir un entero como una cadena con syntax AT & T, con llamadas al sistema Linux en lugar de printf

He escrito un progtwig de ensamblaje para mostrar el factorial de un número siguiendo la syntax AT & t. Pero no funciona. Aquí está mi código .text .globl _start _start: movq $5,%rcx movq $5,%rax Repeat: #function to calculate factorial decq %rcx cmp $0,%rcx je print imul %rcx,%rax cmp $1,%rcx jne Repeat # Now result of […]

¿Por qué System V / AMD64 ABI exige una alineación de astackmiento de 16 bytes?

He leído en diferentes lugares que se hace por “razones de rendimiento”, pero todavía me pregunto cuáles son los casos particulares en los que el rendimiento mejora con esta alineación de 16 bytes. O, en cualquier caso, ¿cuáles fueron las razones por las cuales se eligió esto? editar : estoy pensando que escribí la pregunta […]

¿Por qué las llamadas al sistema x86-64 Linux modifican RCX y qué significa el valor?

Estoy tratando de asignar algo de memoria en Linux con sys_brk syscall. Esto es lo que intenté: BYTES_TO_ALLOCATE equ 0x08 section .text global _start _start: mov rax, 12 mov rdi, BYTES_TO_ALLOCATE syscall mov rax, 60 syscall Lo que pasa es que, según la convención de llamadas de Linux, esperaba que el valor de retorno estuviera […]