Articles of x86 64

Registros x86_64 rax / eax / ax / al sobrescrevendo o conteúdo do registro completo

Como é amplamente divulgado, os modernos processadores x86_64 possuem registradores de 64 bits que podem ser usados ​​de forma compatível com versões anteriores como registradores de 32 bits, registradores de 16 bits e até registradores de 8 bits, por exemplo: 0x1122334455667788 ================ rax (64 bits) ======== eax (32 bits) ==== ax (16 bits) == ah […]

Por que o% eax é zerado antes de uma chamada para o printf?

Eu estou tentando pegar um pouco x86. Eu estou compilando em um mac de 64 bits com gcc -S -O0. Código em C: printf(“%d”, 1); Saída: movl $1, %esi leaq LC0(%rip), %rdi movl $0, %eax ; WHY? call _printf Eu não entendo porque% eax é liberado para 0 antes que ‘printf’ seja chamado. Desde printf […]

Adquirir / liberar semântica com armazenamentos não temporais em x64

Eu tenho algo parecido com: if (f = acquire_load() == ) { … use Foo } e: auto f = new Foo(); release_store(f) Você pode facilmente imaginar uma implementação de acquire_load e release_store que use atomic com load (memory_order_acquire) e store (memory_order_release). Mas agora, se release_store é implementado com _mm_stream_si64, uma gravação não temporal, que […]

O x86 pode reordenar um armazenamento restrito com uma carga mais ampla que o contenha totalmente?

O Manual do Desenvolvedor de Software de Arquiteturas Intel® 64 e IA-32 diz: 8.2.3.4 As cargas podem ser reordenadas em lojas anteriores para diferentes locais O modelo de pedido de memory Intel-64 permite que uma carga seja reordenada com um armazenamento anterior para um local diferente. No entanto, as cargas não são reordenadas com as […]

x86_64 – Condições de loop de assembly e fora de ordem

Eu não estou pedindo um benchmark. ( Se esse fosse o caso, eu teria feito isso sozinho ) . Minha pergunta: Eu tenho a tendência de evitar os modos de endereçamento indireto / índice por conveniência. Como substituto, costumo usar o endereçamento imediato, absoluto ou de registro. O código: ; %esi has the array address. […]

Usando os 16 bits extras em pointers de 64 bits

Eu li que uma máquina de 64 bits usa apenas 48 bits de endereço (especificamente, estou usando o Intel Core i7). Eu esperaria que os 16 bits extras (bits 48-63) fossem irrelevantes para o endereço e fossem ignorados. Mas quando tento acessar esse endereço recebi um sinal EXC_BAD_ACCESS . Meu código é: int *p1 = […]

O que os prefixos E e R representam nos nomes dos registradores Intel de 32 e 64 bits?

Os nomes dos registradores de 32 bits começam com um E e os de 64 bits começam com um R. O que significam o E e R? Existe um motivo para escolher esses alfabetos? Além disso, em registradores de 64 bits, também podemos ver em qualquer depurador de baixo nível como o Windbg que os […]

Medições de ciclo de clock negativo com back-to-back rdtsc?

Eu estou escrevendo um código C para medir o número de ciclos de clock necessários para adquirir um semáforo. Estou usando o rdtsc e, antes de fazer a medição no semáforo, chamo o rdtsc duas vezes consecutivas para medir a sobrecarga. Eu repito isso muitas vezes, em um loop for, e então eu uso o […]

Imprimir números de ponto flutuante de x86-64 parece exigir que% rbp seja salvo

Quando eu escrevo um programa de linguagem assembly simples, vinculado à biblioteca C, usando o gcc 4.6.1 no Ubuntu, e tento imprimir um inteiro, ele funciona bem: .global main .text main: mov $format, %rdi mov $5, %rsi mov $0, %rax call printf ret format: .asciz “%10d\n” Isso imprime 5, conforme o esperado. Mas agora, se […]

Qual é o formato da estrutura x86_64 va_list?

Alguém tem uma referência para a representação de va_list na ABI x86_64 (aquela usada no Linux)? Eu estou tentando depurar algum código onde a pilha ou os argumentos parecem corruptos e realmente ajudaria a entender o que eu deveria estar vendo …