Articles of x86 64

x86_64 registra rax / eax / ax / al sobrescribir los contenidos completos del registro

Como se anuncia ampliamente, los procesadores x86_64 modernos tienen registros de 64 bits que se pueden usar de manera compatible con versiones anteriores como registros de 32 bits, registros de 16 bits e incluso registros de 8 bits, por ejemplo: 0x1122334455667788 ================ rax (64 bits) ======== eax (32 bits) ==== ax (16 bits) == ah […]

¿Por qué% eax se pone a cero antes de una llamada a printf?

Estoy tratando de recoger un poco de x86. Estoy comstackndo en un mac de 64 bits con gcc -S-O0. Código en C: printf(“%d”, 1); Salida: movl $1, %esi leaq LC0(%rip), %rdi movl $0, %eax ; WHY? call _printf No entiendo por qué% eax se borra a 0 antes de llamar a ‘printf’. Como printf devuelve […]

Adquirir / liberar semántica con tiendas no temporales en x64

Tengo algo como: if (f = acquire_load() == ) { … use Foo } y: auto f = new Foo(); release_store(f) Es fácil imaginar una implementación de acquire_load y release_store que use atomic con load (memory_order_acquire) y store (memory_order_release). Pero ahora, ¿qué ocurre si release_store se implementa con _mm_stream_si64, una escritura no temporal, que no […]

¿Puede x86 reordenar una tienda estrecha con una carga más amplia que la contiene por completo?

El Manual del desarrollador de software Intel® 64 e IA-32 Architectures dice: 8.2.3.4 Las cargas pueden reordenarse con tiendas anteriores en diferentes ubicaciones El modelo de ordenamiento de memoria Intel-64 permite reordenar una carga con una tienda anterior a una ubicación diferente. Sin embargo, las cargas no se reordenan con las tiendas en la misma […]

Uso de los 16 bits adicionales en punteros de 64 bits

Leí que una máquina de 64 bits realmente usa solo 48 bits de dirección (específicamente, estoy usando Intel Core i7). Esperaría que los 16 bits adicionales (bits 48-63) sean irrelevantes para la dirección, y serían ignorados. Pero cuando trato de acceder a dicha dirección recibí una señal EXC_BAD_ACCESS . Mi código es: int *p1 = […]

x86_64 – Ensamblaje – condiciones de lazo y fuera de servicio

No estoy pidiendo un punto de referencia. ( Si ese fuera el caso, lo habría hecho yo mismo ) . Mi pregunta: Tiendo a evitar los modos de direccionamiento indirecto / indexado por conveniencia. Como reemplazo, a menudo uso el direccionamiento inmediato, absoluto o de registro. El código: ; %esi has the array address. Say […]

¿Qué significan los prefijos E y R en los nombres de los registros Intel de 32 bits y 64 bits?

Los nombres de registro de 32 bits comienzan con una E y los de 64 bits comienzan con una R. ¿Qué significan la E y la R? ¿Hay alguna razón para elegir estos alfabetos? Además, en los registros de 64 bits, también, podemos ver en cualquier depurador de bajo nivel como Windbg que los bits […]

¿Mediciones negativas del ciclo del reloj con rdtsc adosado?

Estoy escribiendo un código C para medir el número de ciclos de reloj necesarios para adquirir un semáforo. Estoy usando rdtsc, y antes de hacer la medición en el semáforo, llamo a rdtsc dos veces consecutivas, para medir la sobrecarga. Repito esto muchas veces, en un bucle for, y luego uso el valor promedio como […]

La impresión de números en coma flotante de x86-64 parece requerir que se guarde% rbp

Cuando escribo un progtwig de lenguaje ensamblador simple, vinculado con la biblioteca C, usando gcc 4.6.1 en Ubuntu, y trato de imprimir un entero, funciona bien: .global main .text main: mov $format, %rdi mov $5, %rsi mov $0, %rax call printf ret format: .asciz “%10d\n” Esto imprime 5, como se esperaba. Pero ahora si hago […]

¿Cómo se usan los registros fs / gs en Linux AMD64?

En la architecture x86-64, dos registros tienen un propósito especial: FS y GS. En Linux 2.6. *, El registro FS parece usarse para almacenar información local de subprocesos. ¿Es eso correcto? ¿Qué se almacena en fs: 0? ¿Hay alguna estructura C que describa este contenido? ¿Cuál es entonces el uso de GS?