Herhangi bir derlenmiş dil kodu, ikili olarak her bir CPU komutunun bireysel bitlerine göre satır satır izlenebilir mi? [kapalı]


0

Birçok hata ayıklayıcı ve benzeri kullanarak eşdeğer derlemeyi C ++ kodundan atabiliriz.

Peki ya ikili kod? Mikroprogramları (eğer mikro mimaride varsa) oluşturan gerçek makine talimatlarını oluşturan her baytta bitlerin formatlanması.

C ++ kodunun her satırı, bir şekilde ve program boyunca bir noktada makine koduna dönüştürülmek zorunda kalırsa (örn. Bir kayan nokta, C ++ 'da tanımlanabilir, ancak yığının üzerine itilene kadar kullanılamaz, bu nedenle 1 dönüştüremez: 1'e kadar tüm makine kodları, satır satır, ancak ne olursa olsun kullanılacaktır), her bir ifade vb. İzlenebilmektedir. Ancak hata ayıklayıcılar, her bir talimatı (ları) işgal eden bitlerin oluşumunu göstermez.

Her program CPU için bayt / bit desen talimatları olarak biçimlendirilirse, yazdığınız tüm kodları devre düzeyindeki gerçek bitlere kadar takip etmem mümkün olmalı (sanırım).

Ancak mümkün olan en yüksek güvence için , bunu burada tarif ettiğim ölçüde yapmak mümkün mü? Modern hata ayıklayıcılar / yazılımlar bu özelliği sunmazlar ve hatta her bir talimatın tüm ikili gösterimini geliştiriciye açıkça vermeyenler bile sunar.

Not: Tabi ki, derlenmiş kodun amaçlanan mimariye yönelik talimatlarla kolayca uygulanabildiğini varsaymaktır (ve bazı yorumlanmış diller veya başka bir çeviri için başka bir programa ihtiyaç duyan bayt kodları).

Yanıtlar:


1

Derlenmiş ikili kodu derleme diline geri dönüştürmek için bir sökücü kullanabilirsiniz. Bu, sadece ikili olarak dağıtılan (zorlukla) yazılımı "okumanızı" sağlar.

Sorunuzun diğer bölümünde, cpu'nun belirli bir ikili talimatı nasıl yürüttüğü hakkında daha ayrıntılı bilgi veren bir tür donanım kod çözücüsü istiyorsunuz. Bunu yapmak için hiçbir araç bilmiyorum. Muhtemelen donanım kılavuzlarını okumak ve kafanızda bu tür bir analiz yapmak zorunda kalacaksınız.


1

Hayır.

Pekala, belki, ama garanti yok çünkü derleyiciye giren kod iki nedenden dolayı çıkan kodla nadiren aynı: insanlar verimli kod yazarken berbatlar ve insanlar kod hakkında aynı şekilde düşünmüyorlar Bir CPU'nun onu işlemesi gerekir. Bu nedenle, derleyiciler derleme / ikili dosyaya dönüştürmeden önce kaynak kodunu optimize eder. Bu, ifadelerin yeniden sıralanmasına, yararsız ifadelerin kaldırılmasına ve tüm işlevlerin satır içi olmasına yol açabilir .

Örneğin, aşağıdaki sözde kodu verilir:

int x = 3;
x = 3*3;
x = 4;
function mult4(number) { return number * 4; }
x = mult4(x);

tamamen azaltılabilir

int x = 16;

kaynakla hiç uyuşmayan iyi bir optimize edici derleyici ile. Bu nedenle hata ayıklama sırasında derleyici optimizasyonlarını devre dışı bırakmanız gerekir. Tüm derleyici optimizasyonları devre dışı bırakıldığında, derleyici 1 için 1 kaynak koduyla eşleşen derleme çıkarmaya çalışır.


"Kaynağa hiç uymadığını" kabul etmiyorum. Aslında, kaynağa mükemmel bir şekilde karşılık gelir .
David Schwartz

1
Anlamsal anlamın kusursuz bir şekilde uyuştuğunu, fakat kelimenin tam anlamıyla, tam anlamını ifade ettiğini söyleyebilirim.
Darth Android
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.