Jump to content
  1. Started by Fabiano Furtado,

    Pessoal, boa noite. Estava pensando em fazer um programa em C para inserir NOPs entre duas funções quaiquer da section .text de um binário ELF. Seria mais para fins de estudos mesmo, sem muito objetivo prático. Alguém já pesquisou sobre isso? Será que vale o esforço? Imagino que não seja algo muito fácil de se fazer, uma vez que temos várias referências de chamadas de funções dentro de um binário. Desde já, agradeço.

    • 2 replies
    • 1.2k views
  2. Guest
    Started by Guest,

    https://is.gd/uhnyYA

    • 1 reply
    • 951 views
  3. Guest
    Started by Guest,

    A turma da OOP acredita que lidar com coisas como polimorfismo é impossível em linguagens "estruturadas". Eis um exemplo de como fazer uma lista de encadeamento simples, em C, com elementos de diversos "tipos"... Considere a palavra-reservada struct: Ela existe para juntar vários tipos em um único container e de forma ordenada. Assim, se definirmos um nó genérico como: typedef struct node_s { struct node_s *next; } node_T; // _T porque _t não deve ser usado! Podemos definir uma estrutura de controle para uma lista como: // Usado para inicializar uma estrutura de lista vazia. #define EMPTY_LIST { NULL, NULL } typedef struct list_s { node_T *head, *ta…

    • 2 replies
    • 1.2k views
  4. Guest
    Started by Guest,

    Vejo, por ai, uma galera que escreve declarações de funções que não tomam argumentos como: int main() { ... } Só para lembrar: Segundo as especificações ISO 9989:1990 até ISO 9989:2011, isso ai não deveria ser feito. A declaração de função sem argumentos deve ser declarada como: int main( void ) { ... } Com esse void ai... A lista de parâmetros vazia funciona graças à compatibilidade com o padrão K&R, que ainda é mantida em algum grau... Mas, o significado é indefinido (undefined behavior)... Normalmente a lista vazia significa que você pode passar qualquer número e tipos de argumentos e o compilador ignorará... Por exemplo: int f() { return 1; } …

    • 4 replies
    • 3.5k views
  5. Guest
    Started by Guest,

    Eis um macete (de fato, faz parte da especificação)... Um código UTF-8 pode ter de 1 a 6 bytes de tamanho. Um código UNICODE pode ter até 31 bits de tamanho e, para a codificação UTF-8 é dividido assim: De 0x00 até 0x7F (7 bits): 0b0xxxxxxx De 0x080 até 0x7FF (11 bits): 0b110xxxxx 0b10xxxxxx De 0x0800 até 0xFFFF (16 bits): 0b1110xxxx 0b10xxxxxx 0b10xxxxxx De 0x10000 até 0x1FFFFF (21 bits): 0b11110xxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx De 0x200000 até 0x3FFFFFF (26 bits): 0b111110xx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx De 0x400000 até 0x7FFFFFFF (31 bits): 0b1111110x 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx Fica fácil…

    • 1 reply
    • 2.3k views
  6. Guest

    Participo de alguns grupos e um sujeito me posta um código para "embaralhar" cartas totalmente esquisito. A rotina de "embaralhamento" cheia de ifs e loops... Ai venho eu, pego o código do sujeito, altero e mostro isso: /* card.c gcc -std=c11 -o card card.c */ #include <stdio.h> #include <stdlib.h> #include <time.h> // Essas enumerações estão aqui por causa do // código original enum Suit { SPADES = 0, HEARTS, CLUBS, DIAMONDS }; enum Card_Value { ACE = 0, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING }; // Essa estrutura também... typedef struct { enum Suit su…

    • 0 replies
    • 909 views
  7. Guest
    Started by Guest,

    Costumo usar essas "funçõeszinhas" para medir a quantidade de ciclos de clock "gastos" por uma função. Acrescentei o suporte ao AArch64. O AArch32 também tem, mas é mais complicado. Note que o PMC (Performance Monitoring Counter) usado no AArch64 é para o privilégio 0 (user). PS: Esse troço funciona bem com processadores das famílias Ivy Bridge em diante. Não sei quanto aos anteriores... E, no caso do ARM, para o Cortex A-52 em diante é certo... #ifndef CYCLE_COUNTING_INCLUDED__ #define CYCLE_COUNTING_INCLUDED__ #ifndef __GNUC__ # error Works only on GCC #endif /* ========================================== Quick & Dirty cycle counting... As funções…

    • 0 replies
    • 875 views
  8. Guest
    Started by Guest,

    Exceto linguagens como Python, onde os tipos integrais são "big numbers", ou seja, não estão restritos a uma quantidade delimitada de bits, em linguagens como C, C++, ... que têm tipos definidos, como é que vocês fazem para detectar overflows em operações aritméticas? Notaram que não há como acessar os flags da status word do processador, diretamente, nessas linguagens? Ou será que nunca pensaram nisso? Por exemplo, numa expressão: x += y; Se x for do tipo int, como saber se ele extrapolou o limite superior? (se int tem 32 bits, o limite superior é, obviamente, +2³¹-1. Ao incrementar ele passa a ser -2³¹... Pode-se verificar o sinal, mas temos que ter um mét…

  9. Guest
    Started by Guest,

  10. Guest
    Started by Guest,

    O nome, agora, é contraditório (ARM=Advanced Risc Machine). O conjunto de instruções é tudo, menos restrito: https://is.gd/D2YIXu

  11. Guest
    Started by Guest,

    Estou participando de um outro forum com foco em C/C++, onde tem uns negos meio sérios por lá... De tempos em tempos aparece um sujeito pedindo para "fazer seu exercício escolar" e toma porrada. Dessa vez pareceu um que dizia que seu trabalho envolvia o uso de structs contendo: Código de uma fruta, preço unitário e quantidade, e perguntando como ele poderia calcular o "preço de venda" (puts! viu como tem nego burro em qualquer parte do mundo?). O sujeito cita o enunciado e diz que o código 1 é para "Apple", 2 para "orange" e 3 para "banana" - e que bananas precisam ter um desconto de 15%. IMEDIATAMENTE eu respondo, dizendo que o código 1 precisa ter um acréscimo de,…

  12. Guest

    Em linguagens com tipagem, como é o caso de C, existem inteiros sinalizados (possuem valores negativos) e não sinalizados (apenas valores positivos). É intuitivo, para o estudante, pensar que valores negativos como sendo aqueles que tem um sinal '-' na frente do número, no entanto, não é assim que as coisas são feitas pelo processador. Não há como colocar um '-' na frente de um valores binários, nos circuitos do processador ou do computador. Acredito que eu já tenha digo, por aqui ou em meu blog, que valores inteiros sinalizados são meras representações e que, na realidade, eles não tenham sinal algum. Ou seja, a maneira como são interpretados é que dá sinal ao valor, …

    • 0 replies
    • 1.8k views
  13. Started by diego.rax,

    Bom dia, Vocês conhecem alguma biblioteca para C/C++ para geração de relatórios em PDF a partir de um HTML EEEEEE que não seja baseada no Qt, java ou PHP? Atualmente estou criando o PDF manualmente usando a libharu, porém, a criação de itens como tabelas não é muito prático, então uma lib que conseguisse fazer essa conversão seria bem mais de boa

    • 2 replies
    • 2.2k views
  14. Guest
    Started by Guest,

    Eis uma simples função: float f( float x ) { return sqrtf( x ); } Já que os processadores desde o 486 têm o co-processador matemático incorporado, é de se supor que a rotina acima "use" apenas algumas instruções, não é? Mas não é isso o que acontece, mesmo na otimização máxima, obtemos algo assim: f: pxor xmm2, xmm2 sqrtss xmm1, xmm0 ucomiss xmm2, xmm0 ja .L8 movaps xmm0, xmm1 ret .L8: sub rsp, 24 movss dword [rsp+12], xmm1 call sqrtf movss xmm1, dword [rsp+12] add rsp, 24 movaps xmm0, xmm1 ret Essencialmente isso ai em cima faz chama a função sqrtf() se sqrtss retornar algo menor que zero (note que a lógi…

    • 6 replies
    • 1.6k views
  15. Guest
    Started by Guest,

    Recentemente divulguei uma descoberta minha, que, acho, ninguém prestou atenção antes, sobre a geração esquisita de código do GCC em relação à função built in sqrt()... Anunciei isso em outros foruns e tentei reporta para o bugzilla do GCC (não consegui!). Eis algumas reações: Nunca disse que não segue, mas que o GCC está criando código inútil. Ao apontar isso o sujeito usa aquele ar de profundo conhecedor do padrão (e o total desconhecimento de Assembly) para me dizer, num forum sobre ? Além disso, nosso "profundo conhecedor" não sabe de coisa alguma dos bugs que ainda existem em compiladores C/C++ (tanto o GCC quanto o CLANG, VC++ e Intel C++, pra citar …