Qualquer código de linguagem compilada pode ser rastreado, linha por linha, até bits individuais de cada instrução da CPU em binário?

Qualquer código de linguagem compilada pode ser rastreado, linha por linha, até bits individuais de cada instrução da CPU em binário?

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.

informação relacionada