
Sei que podemos despejar assembly equivalente do código C++ usando muitos depuradores e outros.
Mas e o código binário? A formatação dos bits em cada byte(s) que compõem as próprias instruções da máquina, que (podem) compor os microprogramas (se a microarquitetura tiver um).
Se cada linha de código C++ TEM que ser convertida em código de máquina de alguma forma e em algum ponto ao longo do programa (por exemplo, um float pode ser definido em C++, mas não tem utilidade até ser colocado na pilha, então ele pode não converter 1: 1 para todo o código de máquina, linha por linha, mas será usado independentemente), cada instrução, etc., pode ser rastreada. Mas os depuradores não geram a formação de bits que ocupam cada instrução individual.
Se cada programa se tornar instruções de padrão de byte/bit formatadas para a CPU, deve ser possível (presumo) rastrear todo o código que você escreve até os bits reais no nível do circuito.
Mas para a maior garantia possível,É possívelfazer isso na medida que estou descrevendo aqui? Os depuradores/softwares modernos não oferecem esse recurso, e mesmo aqueles que parecem não fornecer toda a representação binária de cada instrução clara para o desenvolvedor.
PS: Isto pressupõe, é claro, que o código compilado seja prontamente executável com instruções para a arquitetura pretendida (e não alguma linguagem interpretada ou bytecode que precise de outro programa para traduzi-lo posteriormente).
Responder1
Você pode usar um desmontador para converter o código binário compilado de volta para a linguagem assembly. Isso permitiria "ler" (com dificuldade) software distribuído apenas em binário.
Para a outra parte da sua pergunta, você parece querer algum tipo de descompilador de hardware que forneça informações mais detalhadas sobre como a CPU executa uma instrução binária específica. Não conheço nenhuma ferramenta para fazer isso. Você provavelmente terá que ler os manuais de hardware e fazer esse tipo de análise mentalmente.
Responder2
Não.
Bem, talvez, mas não há garantia porque o código que vai para o compilador raramente é igual ao código que sai por dois motivos: os humanos são péssimos em escrever código eficiente e os humanos não pensam no código da mesma maneira que uma CPU precisa para processá-lo. Por causa disso, os compiladores otimizarão o código-fonte antes de convertê-lo em assembly/binário. Isto pode levar ainstruções sendo reordenadas, instruções inúteis sendo removidas e funções inteiras sendo incorporadas.
Por exemplo, dado o seguinte pseudocódigo:
int x = 3;
x = 3*3;
x = 4;
function mult4(number) { return number * 4; }
x = mult4(x);
pode ser completamente reduzido a
int x = 16;
por um bom compilador otimizador, que não corresponde em nada à fonte. É por isso que, durante a depuração, muitas vezes é necessário desabilitar as otimizações do compilador. Com todas as otimizações do compilador desabilitadas, o compilador tentará gerar um assembly que corresponda ao código-fonte 1 por 1.