Algum código de linguagem compilada pode ser rastreado, linha por linha, para bits individuais de cada instrução de CPU em binário? [fechadas]

0

Eu percebo que podemos despejar montagem equivalente do código C ++ usando muitos depuradores e tal.

Mas e o código binário? A formatação de bits em cada byte (s) que compõem as instruções reais da máquina, que (podem) compor os microprogramas (se a microarquitetura tiver uma).

Se cada linha de código C ++ tiver 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 uso até ser colocado na pilha; converter 1: 1 para todos os códigos de máquina, linha por linha, mas será usado independentemente), cada declaração, etc., pode ser rastreada. Mas depuradores não produzem a formação de bits ocupando cada instrução individual.

Se cada programa for formatado com instruções de padrão de bytes / bits para a CPU, deve ser possível (suponho) rastrear todo o código que você escreve nos bits reais no nível do circuito.

Mas, para a maior segurança possível, é possível fazer isso na medida em que estou descrevendo aqui? Depuradores / software modernos não oferecem esse recurso, e até mesmo aqueles que parecem não fornecer toda a representação binária de cada instrução para o desenvolvedor.

PS: Isto é, obviamente, assumindo que o código compilado é prontamente executável com instruções para a arquitetura pretendida (e não alguma linguagem interpretada ou bytecode que precisa de outro programa para traduzir ainda mais para ele).

    
por bertieb 21.12.2013 / 22:08

2 respostas

1

Você pode usar um desmontador para converter o código binário compilado de volta para a linguagem assembly. Isso permitiria que você "lesse" (com dificuldade) o software distribuído apenas em binário.

Para a outra parte da sua pergunta, você parece querer algum tipo de decompiler 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 em sua cabeça.

    
por 21.12.2013 / 23:51
1

Não.

Bem, talvez, mas não há garantia porque o código que entra no compilador raramente é o mesmo que o código que aparece por dois motivos: os humanos são péssimos em escrever código eficiente, e os humanos não pensam em código em da mesma forma que uma CPU precisa processá-la. Devido a isso, os compiladores otimizam o código-fonte antes de convertê-lo em assembly / binary. Isso pode levar a que instruções sejam reordenadas, que instruções inúteis sejam removidas e que funções inteiras sejam incluídas .

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 para

int x = 16;

por um bom compilador de otimização, que não corresponde de forma alguma à fonte. É por isso que, ao depurar, você geralmente precisa desativar as otimizações do compilador. Com todas as otimizações de compilador desabilitadas, o compilador tentará produzir um assembly que corresponda ao código-fonte 1-por-1.

    
por 21.12.2013 / 23:56