Articles of x86 64

Definir todos os bits no registro da CPU para 1 com eficiência

Para limpar todos os bits, você geralmente vê um exclusivo ou como XOR eax, eax . Existe tal truque para o oposto também? Tudo o que posso pensar é inverter os zeros com uma instrução extra.

Chamando printf em x86_64 usando o assembler GNU

Eu escrevi um programa usando a syntax da AT & T para uso com o assembler GNU: .data format: .ascii “%d\n” .text .global main main: mov $format, %rbx mov (%rbx), %rdi mov $1, %rsi call printf ret Eu uso o GCC para montar e vincular: gcc -o main main.s Eu corro com este comando: ./a […]

Por que a divisão inteira por -1 (negativo) resulta em FPE?

Eu tenho uma atribuição de expor alguns comportamentos aparentemente estranhos do código C (rodando em x86). Eu posso facilmente completar tudo, mas este realmente me confundiu. Trecho de código 1 saídas -2147483648 int a = 0x80000000; int b = a / -1; printf(“%d\n”, b); O snippet de código 2 não produz nada e fornece uma […]

Desempenho inesperadamente pobre e estranhamente bimodal para o loop de loja na Intel Skylake

Estou vendo um desempenho inesperadamente fraco para um loop de loja simples que possui dois armazenamentos: um com um avanço de 16 bytes e outro sempre no mesmo local 1 , assim: volatile uint32_t value; void weirdo_cpp(size_t iters, uint32_t* output) { uint32_t x = value; uint32_t *rdx = output; volatile uint32_t *rsi = output; do […]

Otimizações de desempenho da assembly x86-64 – Previsão de alinhamento e ramificação

Atualmente, estou codificando versões altamente otimizadas de algumas funções de string da biblioteca padrão C99, como strlen() , memset() , etc, usando o assembly x86-64 com instruções SSE-2. Até agora eu consegui obter excelentes resultados em termos de desempenho, mas às vezes eu fico com um comportamento estranho quando tento otimizar mais. Por exemplo, adicionar […]

System.BadImageFormatException: não foi possível carregar arquivo ou assembly (de installutil.exe)

Eu estou tentando instalar um serviço do Windows usando InstallUtil.exe e estou recebendo a mensagem de erro System.BadImageFormatException: não foi possível carregar arquivo ou assembly ‘ {xxx.exe} ‘ ou uma de suas dependencies. Foi feita uma tentativa de carregar um programa com um formato incorreto. O que da? EDIT: (Não por OP) Mensagem completa extraída […]

O que significa “rep; nop; ”significa na assembly x86? É o mesmo que a instrução de “pausa”?

O que faz rep; nop rep; nop significa? É o mesmo que instrução de pause ? É o mesmo que o rep nop (sem o ponto e vírgula)? Qual é a diferença para a simples instrução nop ? Ele se comporta de maneira diferente nos processadores AMD e Intel? (bônus) Onde está a documentação oficial […]

Syscalls sys_write sucessivos não funcionam como esperado, bug NASM no OS X?

Estou tentando aprender a assembly do MacOS usando o NASM e não consigo fazer um programa trivial funcionar. Estou tentando uma variação do “Hello, World”, onde as duas palavras são chamadas independentemente por uma macro. Meu código-fonte é assim: %macro printString 2 mov rax, 0x2000004 ; write mov rdi, 1 ; stdout mov rsi, %1 […]

Existe um inteiro de 128 bits no gcc?

Eu quero um inteiro de 128 bits porque eu quero armazenar os resultados da multiplicação de dois números de 64 bits. Existe alguma coisa no gcc 4.4 e acima?

Endereço forma canônica e ponteiro aritmética

Em arquiteturas compatíveis com AMD64, os endereços precisam estar em forma canônica antes de serem desreferenciados. Do manual da Intel, seção 3.3.7.1 : No modo de 64 bits, um endereço é considerado em forma canônica, se os bits de endereço 63 até o bit implementado mais significativo pela microarquitetura forem definidos para todos os zeros. […]